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的使用建议
-
每次在使用之前,先执行一次delete操作
-
在声明queue的时候对queue做初始化
-
在过程语句中对queue做初始化,直接用queue_name = {};不需要使用“'”
-
如果是用queue来做缓存,在最后一定要check queue有没有空