当我尝试在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_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
我试图在函数“ descriptor_decoder”中创建具有不同输入模式值的不同类队列。在功能上,我首先创建一个新的dscr类,然后将其推送到类队列。但是仿真结果是:
mode = 0
mode = 1
mode = 1
我第一次调用该函数时,确实将正确的类推回到a_dscr_q中。但是第二个函数调用似乎将类推回到a_dscr_q和b_dscr_q中。我很困惑,这里发生了什么事?
答案 0 :(得分:2)
由于遇到的问题非常严重,您的代码在IEEE 1800-2009 LRM中被设为非法语法。现在大多数工具将其报告为错误。
您的descriptor_decode
是具有静态生存期的函数,并且在其内部声明的dscr_dec
变量也具有静态生存期。
不允许对变量的生命周期是隐式静态的并且可以选择声明为自动的变量进行初始化。这是因为与大多数编程语言不同,SystemVerilog函数中变量的默认生存期是静态的,并且静态变量的初始化在时间0之前发生一次,而不是每次调用该函数都发生。在您的示例中,您期望dscr_dec
表现为自动。
因此,您需要更改以下代码之一:
dscr_dec
自动