多次赋值给函数 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
在 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