在systemverilog函数中修改类的队列

时间:2018-09-10 03:21:43

标签: 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_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中。我很困惑,这里发生了什么事?

1 个答案:

答案 0 :(得分:2)

由于遇到的问题非常严重,您的代码在IEEE 1800-2009 LRM中被设为非法语法。现在大多数工具将其报告为错误。

您的descriptor_decode是具有静态生存期的函数,并且在其内部声明的dscr_dec变量也具有静态生存期。

不允许对变量的生命周期是隐式静态的并且可以选择声明为自动的变量进行初始化。这是因为与大多数编程语言不同,SystemVerilog函数中变量的默认生存期是静态的,并且静态变量的初始化在时间0之前发生一次,而不是每次调用该函数都发生。在您的示例中,您期望dscr_dec表现为自动。 因此,您需要更改以下代码之一:

  • 明确声明dscr_dec自动
  • 自动声明该函数,该函数使在其内部声明的变量隐式自动
  • 自动声明模块,这使得隐式自动声明其内部的函数
  • 将声明和初始化拆分为在调用函数时进行初始化。