本文主要是介绍systemverilog-内嵌约束randomize()with{}、soft 约束、local::,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
内嵌约束:
SV允许使用 randomize()with{} 来增加额外的约束,这和在类里增加约束是等效的。
当没有soft修饰时,约束发生冲突则报错;当soft修饰时,则以外部约束的优先级高于内部
class chnl_generator extends uvm_component;rand int pkt_id = 0;rand int ch_id = -1;rand int data_nidles = -1;rand int pkt_nidles = -1;rand int data_size = -1;rand int ntrans = 10;constraint cstr{soft ch_id == -1;soft pkt_id == 0;soft data_size == -1;soft data_nidles == -1;soft pkt_nidles == -1;soft ntrans == 10;}场景1:task send_trans();chnl_trans req;req = chnl_trans::type_id::create("req");assert(req.randomize with {local::ch_id >= 0 -> ch_id == local::ch_id; local::pkt_id >= 0 -> pkt_id == local::pkt_id;local::data_nidles >= 0 -> data_nidles == local::data_nidles;local::pkt_nidles >= 0 -> pkt_nidles == local::pkt_nidles;local::data_size >0 -> data.size() == local::data_size; endtask场景2:task send_trans( int pkt_id, int ch_id, int data_nidles, int pkt_nidles, int data_size, int ntrans );chnl_trans req;req = chnl_trans::type_id::create("req");assert(req.randomize with {local::ch_id >= 0 -> ch_id == local::ch_id; local::pkt_id >= 0 -> pkt_id == local::pkt_id;local::data_nidles >= 0 -> data_nidles == local::data_nidles;local::pkt_nidles >= 0 -> pkt_nidles == local::pkt_nidles;local::data_size >0 -> data.size() == local::data_size; endtask
endclass
data表示变量
当task没有传递参数时,local::data表示chnl_generator::data
当task有传递参数时,local::data表示任务传递进来的参数
local:: 表示“域”,而不是句柄,可以用local::this表示调用randmize() 函数的对象句柄。
约束体with{约束}中的变量名查找顺序默认是从被随机化对象开始查找。如果调用randomize()函数局部域中也有同名变量,那就需要使用 local:: 来显式声明该变量来源于外部函数,而非被随机化的对象。
参考: https://blog.csdn.net/lbt_dvshare/article/details/107280692
这篇关于systemverilog-内嵌约束randomize()with{}、soft 约束、local::的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!