System verilog 如何使用派生类约束检查类随机化对象结果
假设我有两门课:System verilog 如何使用派生类约束检查类随机化对象结果,system-verilog,uvm,System Verilog,Uvm,假设我有两门课: class random_packet extends uvm_sequence_item; rand int cmd; ... endclass 及其扩展: class good_packet extends random_packet; constraint good_constr { cmd inside {0,1,2}; } ... endclass (这里我不打算创建good_packet对象,但我只想使用它的约束作
class random_packet extends uvm_sequence_item;
rand int cmd;
...
endclass
及其扩展:
class good_packet extends random_packet;
constraint good_constr {
cmd inside {0,1,2};
}
...
endclass
(这里我不打算创建good_packet
对象,但我只想使用它的约束作为参考)
然后我实例化random_数据包对象并将其随机化:
random_packet pkt;
pkt = random_packet::type_id::create("pkt");
pkt.randomize();
我的问题是:有没有一种更简单的方法可以利用其派生类good_packet
的约束来检查结果pkt.cmd
是否属于good_packet
约束的范畴?
这比编写冗余代码要好,例如:
if (pkt.cmd == 0 || pkt.cmd == 1 || pkt.cmd == 2) $display("good");
else $display("bad");
您可以将
pkt
的内容复制到类型为good\u packet
的新数据包中,然后检查约束是否成立
首先,您需要一个函数,该函数可以根据随机\u数据包的字段更新良好\u数据包的字段
:
class random_packet extends uvm_sequence_item;
// ...
virtual function void update(random_packet source);
this.cmd = source.cmd;
endfunction
endclass
使用此功能,您可以更新先前创建的good_数据包
的字段:
// ... randomization of 'pkt' happened earlier
good_packet g_pkt = new();
g_pkt.update(pkt);
既然g_pkt
包含与pkt
相同的值,您可以使用内联约束检查器构造来检查good_数据包
类中定义的约束是否有效:
if (g_pkt.randomize(null))
$display("good");
else
$display("bad");
调用randomize(null)
实际上不会随机化g\u pkt
中的任何内容(这有点像将每个字段设置为rand\u模式(0)
)
您可以在的18.11.1节在线约束检查器中找到有关此构造的更多信息。您可以将pkt
的内容复制到good\u packet
类型的新数据包中,然后检查约束是否有效
首先,您需要一个函数,该函数可以根据随机\u数据包的字段更新良好\u数据包的字段
:
class random_packet extends uvm_sequence_item;
// ...
virtual function void update(random_packet source);
this.cmd = source.cmd;
endfunction
endclass
使用此功能,您可以更新先前创建的good_数据包
的字段:
// ... randomization of 'pkt' happened earlier
good_packet g_pkt = new();
g_pkt.update(pkt);
既然g_pkt
包含与pkt
相同的值,您可以使用内联约束检查器构造来检查good_数据包
类中定义的约束是否有效:
if (g_pkt.randomize(null))
$display("good");
else
$display("bad");
调用randomize(null)
实际上不会随机化g\u pkt
中的任何内容(这有点像将每个字段设置为rand\u模式(0)
)
您可以在。的18.11.1在线约束检查器部分找到有关此构造的更多信息。即使我们将约束模式设置为0,调用randomize()是否仍尝试解决约束?@vinethvs我们没有将约束模式设置为0。我说这就像将rand\u mode
设置为0。解算器将获取已设置的值,并检查它们是否匹配所有已启用的约束。@Tudor这正是我想要的,谢谢!randomize(null)是强制randomize()方法作为一个检查器。@Tudor抱歉,这是一个输入错误。我理解你所说的约束模式。我想问的是,如果我们将随机模式设置为0,然后执行随机(空)
;解算器是否尝试解算约束。不管怎样,我只是试着找出了区别。感谢您的回复。即使我们将约束模式设置为0,调用randomize()是否仍会尝试解决约束?@VineThvs我们没有将约束模式设置为0。我说这就像将rand\u mode
设置为0。解算器将获取已设置的值,并检查它们是否匹配所有已启用的约束。@Tudor这正是我想要的,谢谢!randomize(null)是强制randomize()方法作为一个检查器。@Tudor抱歉,这是一个输入错误。我理解你所说的约束模式。我想问的是,如果我们将随机模式设置为0,然后执行随机(空)
;解算器是否尝试解算约束。不管怎样,我只是试着找出了区别。谢谢你的回复。