You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:编写SystemVerilog固定含4个6的长度为10的队列约束

SystemVerilog 队列约束实现:固定长度10且恰好4个6

原代码问题分析

你的初始代码存在两个关键问题:

  1. foreach + dist无法保证全局6的数量:这种方式是给每个队列元素独立分配出现6的概率,只能从概率上接近40%的元素为6,但无法精确控制恰好4个6。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:43:10