返回题库首页 · 约束随机与数组随机化笔记

先独立作答,再展开参考答案。八股原题沿用原笔记编号;扩展练习为本站根据对应考点编写。

Q12 · 一次对象 randomize 的完整流程是什么?

八股原题 · Q12 · 题型:问答

考点

  • pre_randomize、求解、post_randomize
  • 失败时的行为
展开参考答案 · Q12

题目来源(原笔记记录)

  • 泰凌微 · 数字IC验证 · 校招 · 一面(随机化完整流程:类内声明 rand 属性、类外调用 randomize 的执行逻辑)
  • 面试书《Cracking Digital VLSI Verification Interview》· 第4章 Q52(对应题目:pre_randomize() 与 post_randomize())

一次 randomize 是”前处理 → 约束求解 → 后处理”三步,用返回值报告成功还是失败。

第一,pre_randomize。 在求解前调用,适合开关变量或约束。

第二,post_randomize。 只有求解成功才调用,适合算派生字段(比如 CRC),别再偷偷改坏已经满足的约束。

第三,失败行为。 随机化失败时目标变量保持原值,必须检查返回值——不检查的话,旧值会伪装成新的随机结果。

if (!pkt.randomize())
  $fatal(1, "packet randomization failed");

一句话:randomize 是前处理—求解—后处理,并用返回值报告成功;不检查失败会让旧值伪装成新随机结果。


E12 · 随机化失败还能发送吗?

扩展练习 · E12 · 题型:场景分析 · 对应原题:Q12

考点

  • pre_randomize、求解、post_randomize
  • 失败时的行为

对象的 rand 字段原来是 5,pre_randomize 不修改字段,现有约束要求它同时等于 1 和 2。randomize 返回什么?post_randomize 是否运行?driver 能否继续使用该对象当作新激励?

展开参考答案 · E12

返回 0,求解失败,post_randomize 不执行;该 rand 字段保留 5。应停止该次发送并报错或进入明确的重试策略。若 pre_randomize 主动修改了非随机状态或字段,这些副作用不应被误认为会自动回滚。


Q13 · inside、dist 和 unique 分别做什么?

八股原题 · Q13 · 题型:问答

考点

  • 值集合、概率权重和唯一性
  • := 与 :/
展开参考答案 · Q13

题目来源(原笔记记录)

  • 泰凌微 · 数字IC验证 · 校招 · 一面(常用约束关键字:inside、unique、solve before 的用法)
  • 豪威科技 · 数字IC验证 · 校招 · 一面(constraint 中 dist 的几种权重约束)
  • 乐鑫科技 · 数字IC验证 · 校招 · 一面(约束变量权重分配)
  • 昕原 · 数字IC验证 · 实习(信号取值 h0/h4/hF 概率各 30%、其余总概率 10% 如何实现随机化——dist 权重)
  • 字节跳动 · AI芯片研发 · 校招 · 一面(约束数组元素 100~1000,前段权重更高)
  • 面试书《Cracking Digital VLSI Verification Interview》· 第4章 Q49(对应题目:unique 约束)

inside 定合法集合,dist 调合法解的概率,unique 保证互不重复——三个约束关键字各管一件事。

第一,inside。 限制变量属于某个集合或范围。

第二,dist。 在合法解之间设概率权重。:= 给范围内每个值相同权重,:/ 把权重分摊给整个范围;权重只改变概率,不会让权重为正的值变成必然出现。

第三,unique。 要求数组元素或变量列表互不相同。

constraint c {
  addr inside {[16'h1000:16'h1fff], 16'h3000};
  kind dist {READ := 3, WRITE := 1};
  unique {id_q};
}

一句话:inside 定合法集合,dist 调合法解的概率,unique 保证互不重复;:= 按值给权,:/ 按范围分权。


E13 · 范围权重是按值还是按区间?

扩展练习 · E13 · 题型:代码阅读 · 对应原题:Q13

考点

  • 值集合、概率权重和唯一性
  • := 与 :/

比较 x dist {[0:3] := 2, 4 := 4} 与 x dist {[0:3] :/ 2, 4 := 4},x 为足够宽的 rand 整数且无其他约束。两种写法下 x==4 的理论概率分别是多少?

展开参考答案 · E13

第一种范围内 4 个值各权重 2,总权重 12,x==4 概率为 4/12=1/3。第二种范围整体权重 2,总权重 6,概率为 4/6=2/3。这是分布目标,有限次数随机化不会保证精确命中比例或固定序列。


Q14 · solve before 会不会改变合法解集合?

八股原题 · Q14 · 题型:问答

考点

  • 求解顺序与概率分布
  • 不改变约束合法性
展开参考答案 · Q14

题目来源(原笔记记录)

  • 燧原科技 · 数字IC验证 · 校招 · AI方向(solve before 对约束随机的影响)
  • 泰凌微 · 数字IC验证 · 校招 · 一面(常用约束关键字:inside、unique、solve before 的用法)
  • 面试书《Cracking Digital VLSI Verification Interview》· 第4章 Q48(对应题目:solve…before 与概率分布)

solve before 调整”先随机谁”,主要影响概率分布,通常不改变合法解集合。

第一,作用。 solve a before b 让求解器先给 a 选值,再在 a 的条件下给 b 选合法值。

第二,为什么用。 举个典型例子:mode 是控制变量,mode==0 时数据有 100 种合法解,mode==1 时只有 10 种。不写 solve before 时,求解器在”所有 (mode, data) 组合”里均匀选,mode==0 出现的概率约是 mode==1 的 10 倍;写了 solve mode before data 后,先让 mode 均匀二选一(约各 50%),再在选定的 mode 下随机 data——控制类别的分布就被”抹平”了。

第三,什么时候没用。 如果 a、b 之间没有约束关系,或者 a 已经被外部固定,solve before 通常没有实际效果。

一句话:solve before 调整”先随机谁”,主要影响概率而不改变哪些组合合法。


E14 · solve before 能挽救无解约束吗?

扩展练习 · E14 · 题型:判断说明 · 对应原题:Q14

考点

  • 求解顺序与概率分布
  • 不改变约束合法性

rand bit a, b; 的约束同时要求 a == b 和 a != b。加入 solve a before b; 能否成功?若改成仅 a == b,合法组合有哪些?

展开参考答案 · E14

不能。求解顺序不会修复矛盾,randomize 仍失败。仅要求相等时,合法组合是 (0,0) 和 (1,1),加入 solve before 也不会增加或删除组合;在这个对称例子中无须期待分布变化。


Q15 · 约束动态数组时有哪些要点?

八股原题 · Q15 · 题型:问答

考点

  • size()、foreach、unique、$countones
  • 越界保护
展开参考答案 · Q15

题目来源(原笔记记录)

  • 字节跳动 · 数字IC验证 · 校招 · SOC方向(动态数组大小的约束方式)
  • 小米 · 处理器验证 · 校招(随机生成 10bit 数据,恰好 3bit 为 1)
  • 字节跳动 · 数字IC验证 · 校招 · 一面(约束生成 5~10 元素单峰数组,左递增右递减)
  • 面试书《Cracking Digital VLSI Verification Interview》· 第4章 Q53-Q56(对应题目:约束动态数组、降序数组、随机唯一数组、$countones 约束)

约束动态数组要先定 size,再用 foreach 限元素。 不定长度时,求解器可能选空数组,所有元素约束就”真空成立”了。

class item;
  rand byte unsigned data[];
  rand bit [9:0] mask;
 
  constraint c {
    data.size() inside {[4:16]};        // 先定长度
    foreach (data[i]) {
      data[i] inside {[1:100]};
      if (i > 0) data[i] > data[i-1];   // 邻项递增:先保护下标
    }
    $countones(mask) == 3;              // 恰好 3 个 1,位置随机
  }
endclass

三个要点:先定 size;邻项关系先保护下标(访问 i-1 要加 i > 0);固定 1 的个数用 $countones。严格递增本身已经保证不重复,不用再写 unique。

一句话:数组约束先定 size,再用 foreach 限元素;邻项关系先保护下标,固定位数用 $countones。


E15 · 生成唯一数组并分析不可满足条件

扩展练习 · E15 · 题型:简短编码 · 对应原题:Q15

考点

  • size()、foreach、unique、$countones
  • 越界保护

写约束:随机动态数组长度为 4,每项为 0~7,互不重复;另有 10 位 mask 恰好 3 个 1。若把数组长度改成 9 会怎样?

展开参考答案 · E15
class sample_item;
  rand bit [2:0] data[];
  rand bit [9:0] mask;
  constraint c {
    data.size() == 4;
    foreach (data[i]) data[i] inside {[0:7]};
    unique {data};
    $countones(mask) == 3;
  }
endclass

长度 9 无解:8 个可选值无法填入 9 个互不重复的元素,应检查 randomize 返回值。