求助:编写SystemVerilog固定含4个6的长度为10的队列约束
SystemVerilog 队列约束实现:固定长度10且恰好4个6
原代码问题分析
你的初始代码存在两个关键问题:
foreach+dist无法保证全局6的数量:这种方式是给每个队列元素独立分配出现6的概率,只能从概率上接近40%的元素为6,但无法精确控制恰好4个6。q1.unique()约束冲突:这个约束要求队列所有元素唯一,直接导致6最多只能出现一次,完全违背了需要4个6的需求,必须删除。
正确约束实现
以下是满足需求的代码,通过sum()函数精确控制6的数量,同时约束其他元素的取值范围:
class example; rand int q1[10]; // 固定长度为10的队列 // 约束队列中恰好包含4个数值6 constraint c_four_sixes { q1.sum() with (int'(item == 6)) == 4; } // 约束非6的元素取值范围为7到200 constraint c_valid_other_values { foreach(q1[i]) { if (q1[i] != 6) { q1[i] inside {[7:200]}; } } } endclass
代码说明
c_four_sixes约束:利用sum()配合with表达式,将每个元素等于6的判断结果转换为整数(1表示是6,0表示不是),求和后等于4,确保队列中恰好有4个6。c_valid_other_values约束:遍历队列每个元素,若元素不是6,则限制其取值在7到200之间,符合原代码中非6值的范围要求。
可选:给非6元素添加权重分配
如果需要给非6的元素分配随机权重(类似原代码的dist逻辑),可以修改第二个约束:
constraint c_valid_other_values_with_dist { foreach(q1[i]) { if (q1[i] != 6) { q1[i] dist { [7:200] :/ 60 }; // 非6值按权重随机分配,总权重60 } } }
内容的提问来源于stack exchange,提问作者User99
相关产品推荐
相关产品推荐

