Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
System verilog 修改systemverilog函数中类的队列_System Verilog - Fatal编程技术网

System verilog 修改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

我在尝试修改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

第一次调用该函数时,它确实将正确的类推回到了一个_dscr_q中。但是第二个函数调用,看起来类被推回a_dscr_q和b_dscr_q。我很困惑,这里发生了什么?

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

您的
descriptor\u decode
是具有静态生存期的函数,其中声明的
dscr\u dec
变量也具有静态生存期

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

  • 显式声明
    dscr\u dec
    automatic
  • 声明函数automatic,这使函数中声明的变量隐式自动
  • 将模块声明为自动,这会使其中声明的函数隐式自动
  • 拆分声明和初始化,以便在调用函数时进行初始化

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

您的
descriptor\u decode
是具有静态生存期的函数,其中声明的
dscr\u dec
变量也具有静态生存期

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

  • 显式声明
    dscr\u dec
    automatic
  • 声明函数automatic,这使函数中声明的变量隐式自动
  • 将模块声明为自动,这会使其中声明的函数隐式自动
  • 拆分声明和初始化,以便在调用函数时进行初始化
mode = 0
mode = 1
mode = 1