先独立作答,再展开参考答案。八股原题沿用原笔记编号;扩展练习为本站根据对应考点编写。
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 返回值。