Ald*_*doT 1 system-verilog uvm
假设我有这两个类:
class random_packet extends uvm_sequence_item;
rand int cmd;
...
endclass
Run Code Online (Sandbox Code Playgroud)
及其扩展:
class good_packet extends random_packet;
constraint good_constr {
cmd inside {0,1,2};
}
...
endclass
Run Code Online (Sandbox Code Playgroud)
(这里我不打算创建good_packet对象,但我只是想使用它的约束作为参考)然后我实例化random_packet对象并将其随机化:
random_packet pkt;
pkt = random_packet::type_id::create("pkt");
pkt.randomize();
Run Code Online (Sandbox Code Playgroud)
我的问题:是否有一种更简单的方法是利用其派生类good_packet的约束来检查结果是否pkt.cmd属于good_packet约束类别?这比编写冗余代码更好:
if (pkt.cmd == 0 || pkt.cmd == 1 || pkt.cmd == 2) $display("good");
else $display("bad");
Run Code Online (Sandbox Code Playgroud)
您可以将内容复制pkt到新类型的数据包中good_packet,然后检查约束是否成立.
首先,您需要一个可以good_packet根据以下字段更新字段的函数random_packet:
class random_packet extends uvm_sequence_item;
// ...
virtual function void update(random_packet source);
this.cmd = source.cmd;
endfunction
endclass
Run Code Online (Sandbox Code Playgroud)
使用此功能,您可以更新good_packet先前创建的字段:
// ... randomization of 'pkt' happened earlier
good_packet g_pkt = new();
g_pkt.update(pkt);
Run Code Online (Sandbox Code Playgroud)
现在g_pkt包含相同的值pkt,您可以使用内联约束检查器构造来检查good_packet类中定义的约束是否成立:
if (g_pkt.randomize(null))
$display("good");
else
$display("bad");
Run Code Online (Sandbox Code Playgroud)
调用randomize(null)实际上不会随机化任何内部g_pkt(这有点像设置每个字段rand_mode(0)).
你可以找到在这个结构中的部分更多信息18.11.1在在线约束检查中的IEEE标准1800年至2012年.
| 归档时间: |
|
| 查看次数: |
891 次 |
| 最近记录: |