如何通过约束让SystemVerilog队列仅取另一队列中的值?
基于SystemVerilog约束实现从随机队列选元素填充目标队列的方案
可以直接通过约束机制实现需求,无需在随机化完成后手动处理。
约束写法说明
修改chosen_c约束,利用SystemVerilog的inside操作符确保chosen的每个元素都来自choices队列,同时可按需添加元素唯一性约束:
class some_class; rand bit [7:0] choices [$]; rand bit [7:0] chosen [$]; int num_choices = 20; int num_chosen = 5; function new(); endfunction constraint choices_size_c { choices.size() == num_choices; } constraint chosen_c { chosen.size() == num_chosen; // 强制每个chosen元素都存在于choices队列中 foreach (chosen[i]) { chosen[i] inside {choices}; } // 可选约束:确保chosen内元素不重复 unique {chosen}; } endclass
关键逻辑解释
inside操作符是SystemVerilog约束的原生语法,能直接限定元素的取值范围为目标队列的所有元素,随机器会自动生成符合要求的chosen队列。- 若允许
chosen内存在重复元素,只需去掉unique {chosen}约束即可。 - 随机器会优先满足
choices的长度约束(生成20个元素),再基于生成的choices构造符合要求的chosen队列,整个流程完全由约束驱动,无需额外手动操作。
内容的提问来源于stack exchange,提问作者Sierra
相关产品推荐
相关产品推荐

