System verilog 修改systemverilog函数中类的队列
我在尝试修改systemverilog函数中的类队列时遇到问题 代码如下:System verilog 修改systemverilog函数中类的队列,system-verilog,System Verilog,我在尝试修改systemverilog函数中的类队列时遇到问题 代码如下: module my_module; class dscr; logic mode; function void print_dscr; $display("mode = %d", this.mode); endfunction endclass dscr a_dscr_q[$]; dscr b_dscr_q[$]; initial begin descriptor_de
module my_module;
class dscr;
logic mode;
function void print_dscr;
$display("mode = %d", this.mode);
endfunction
endclass
dscr a_dscr_q[$];
dscr b_dscr_q[$];
initial begin
descriptor_decode(0, a_dscr_q);
for (int I=0; I<a_dscr_q.size(); i++)
a_dscr_q[i].print_dscr();
descriptor_decode(1, b_dscr_q);
for (int I=0; I<a_dscr_q.size(); i++)
a_dscr_q[i].print_dscr();
for (int I=0; I<b_dscr_q.size(); i++)
b_dscr_q[i].print_dscr();
end
function void descriptor_decode(logic mode, ref dscr dscr_q[$]);
dscr dscr_dec = new;
dscr_dec.mode = mode;
dscr_q.pushback(dscr_dec);
endfunction
endmodule
第一次调用该函数时,它确实将正确的类推回到了一个_dscr_q中。但是第二个函数调用,看起来类被推回a_dscr_q和b_dscr_q。我很困惑,这里发生了什么?由于您遇到的问题,您的代码在IEEE 1800-2009 LRM中被定为非法语法。大多数工具现在将此报告为错误 您的
descriptor\u decode
是具有静态生存期的函数,其中声明的dscr\u dec
变量也具有静态生存期
不允许对生命周期隐式静态且具有声明为自动选项的变量进行初始化。这是因为与大多数编程语言不同,SystemVerilog函数中变量的默认生存期是静态的,静态变量的初始化在时间0之前发生一次,而不是每次调用函数。在您的示例中,您希望dscr\u dec
表现为一个自动模式。
因此,您需要进行以下代码更改之一:
- 显式声明
automaticdscr\u dec
- 声明函数automatic,这使函数中声明的变量隐式自动
- 将模块声明为自动,这会使其中声明的函数隐式自动
- 拆分声明和初始化,以便在调用函数时进行初始化
descriptor\u decode
是具有静态生存期的函数,其中声明的dscr\u dec
变量也具有静态生存期
不允许对生命周期隐式静态且具有声明为自动选项的变量进行初始化。这是因为与大多数编程语言不同,SystemVerilog函数中变量的默认生存期是静态的,静态变量的初始化在时间0之前发生一次,而不是每次调用函数。在您的示例中,您希望dscr\u dec
表现为一个自动模式。
因此,您需要进行以下代码更改之一:
- 显式声明
automaticdscr\u dec
- 声明函数automatic,这使函数中声明的变量隐式自动
- 将模块声明为自动,这会使其中声明的函数隐式自动
- 拆分声明和初始化,以便在调用函数时进行初始化
mode = 0
mode = 1
mode = 1