[SV]SystemVerilog queue的初始化以及绿书上面的写法

         SystemVerilog queue的初始化以及绿书上面的写法

       前言:在《SystemVerilog验证 测试平台编写指南》(原书第二版)2009年9月第一版这本书的第29页,对队列的操作有如下的例子。在声明queue的时候,同时对queue做了初始化

int    j = 1,

  q2[$]   = {3, 4},
  q[$]     = {0, 2, 5};

       放在小环境中验证,我们会发现上述写法并没有报语法错误,但是queue的初始化并没有实现,对于q2和q,它的szie任然是0。(上述验证使用的时VCSMX/1906SP2-1)

一、实例验证

       下面我们做以下几个小程序来验证一下queue的初始化的语法。

 1.1、使用queue_name[$] = {};对queue做初始化,行不通

module queue_test();

  int               qt[$];
  
  string            sw_trg_reg_q[$];


  initial begin
    qt[$] = {0, 1, 2, 3, 4};
    
    sw_trg_reg_q[$] = {"DSB_HP_IMM_TRG_0", "DSB_HP_IMM_TRG_1", "DSB_HP_IMM_TRG_2", "DSB_HP_IMM_TRG_3"};

    $display("qt.size() = %0d, sw_trg_reg_q.size() = %0d", qt.size(), sw_trg_reg_q.size());
  end
  

endmodule
  • Simulation Output

qt.size() = 0, sw_trg_reg_q.size() = 0

 1.2、正确的queue初始化发方法:qt = {0, 1, 2, 3, 4};

module queue_test();

  int               qt[$];
  
  string            sw_trg_reg_q[$];


  initial begin
    qt = {0, 1, 2, 3, 4};
    
    sw_trg_reg_q = {"DSB_HP_IMM_TRG_0", "DSB_HP_IMM_TRG_1", "DSB_HP_IMM_TRG_2", "DSB_HP_IMM_TRG_3"};

    $display("qt.size() = %0d, sw_trg_reg_q.size() = %0d", qt.size(), sw_trg_reg_q.size());
  end
  

endmodule
  • Simulation Output

qt.size() = 5, sw_trg_reg_q.size() = 4

二、SystemVerilog Queue的使用建议

  1. 每次在使用之前,先执行一次delete操作 

  2. 在声明queue的时候对queue做初始化

  3. 在过程语句中对queue做初始化,直接用queue_name = {};不需要使用“'”

  4. 如果是用queue来做缓存,在最后一定要check queue有没有空

猜你喜欢

转载自blog.csdn.net/gsjthxy/article/details/106800169
今日推荐