多次赋值给函数 return 值

Multiple assignments to function return value

在 SystemVerilog 函数中,对隐式声明的 return 变量进行多次赋值是否合法?有关示例,请参见以下函数:

  localparam int Q=1,I=0;
  function logic [1:0][Q:I][15:0] Cast24to16(input logic [1:0][Q:I][23:0] din);
    foreach (Cast24to16[n,iq])
      Cast24to16[n][iq] = din[n][iq][23 -: 8];
  endfunction

语言参考手册,IEEE Std 1800-2017,第 13.4.1 节指出:

Function return values can be specified in two ways, either by using a return statement or by assigning a value to the internal variable with the same name as the function.

关于是否可以分配多次,这似乎有点不清楚,就像在我的例子中一样。此外,此语句之后直接来自 LRM 的示例以及我可以在网上找到的所有其他示例都显示隐式 return 值仅被分配一次。这让我感到有些不安。

LRM 还在您引用的部分之前说了

The function definition shall implicitly declare a variable, internal to the function, with the same name as the function.

我认为您可以安全地假设,如果没有显式 return 语句,它会有效地插入隐式 return (var_function_name);

此外,如果您使用静态生命周期(这是模块中的隐式默认生命周期)声明函数,则该隐式 return 变量也具有静态生命周期。这意味着无论您是否分配它,它都会保留您上次调用该函数时的值。

module top;
  
  function int countme;
    countme++;
  endfunction
  
  initial repeat (10) $display(countme());
endmodule