System verilog 随机模式(val)有什么用途?

System verilog 随机模式(val)有什么用途?,system-verilog,uvm,System Verilog,Uvm,根据uvm_用户指南_1.1,第152页,这两种实现如下所示: 第一: 以及: 如果我不使用第二个示例中的“随机模式(0)”和“约束模式(0)”,会有什么区别?用户指南给出了一个提示: NOTE — You might need to disable a constraint to avoid a conflict. 在my_seq中,如果调用randomize(),可能会有不同。考虑这种情况: rand bit [5:0] addr; rand bit [7:0] data; constra

根据uvm_用户指南_1.1,第152页,这两种实现如下所示: 第一:

以及:


如果我不使用第二个示例中的“随机模式(0)”和“约束模式(0)”,会有什么区别?

用户指南给出了一个提示:

NOTE — You might need to disable a constraint to avoid a conflict.
my_seq
中,如果调用
randomize()
,可能会有不同。考虑这种情况:

rand bit [5:0] addr;
rand bit [7:0] data;
constraint dc1 { data==addr; data != 27; }
randomize
如果禁用
addr
的随机化,设置
addr
=27,并且不禁用
dc1
约束,则随机化将失败。

rand_模式(0)
是SystemVerilog的功能,UVM示例在调用
randomize()时使用它冻结随机变量,就像它是非rand变量一样
。当您需要将一个随机变量固定为特定值,但希望其他变量像往常一样随机化时,通常会执行此操作

第二个示例显示了如何在不调用
randomize()
的情况下设置所有随机变量。许多人忘记了(特别是如果他们来自另一种语言e),在执行受限随机验证时,您不必总是调用
randomize()
。他们会不遗余力地添加约束,比如

req.randomize()与{addr==27;data==4;} 正如第二个例子所示,当只做这件事会更容易的时候


参见IEEE 1800-2017 SystemVerilog LRM的第18.8节和第18.7节。

为什么他们选择在第二个示例中不像在第一个示例中那样编写rand_模式(0)和constraint_模式(0)方法?因为他们从不调用
randomze()
,并且这些方法在第二个示例中没有效果。使用UVM_send()时,UVM序列宏会隐藏此事实。我强烈建议不要使用这些宏,而直接使用序列API。看见
NOTE — You might need to disable a constraint to avoid a conflict.
rand bit [5:0] addr;
rand bit [7:0] data;
constraint dc1 { data==addr; data != 27; }