约束随机与可复现种子

返回 ALU 任务总览。

任务:先保留已知边界,再加随机

加入随机测试时不删除已通过的 14 条定向用例。当前代码后来又新增运行中复位前的 6+9,以及非法 op=6/7,所以现在是 17 条定向+20 条随机。定向用例保证已知关键边界每次都执行;随机用例扩大输入组合的探索范围,不能替代定向检查。

repeat (20) begin
  tr = new();
  if (!tr.randomize())
    $fatal(1, "Failed to randomize transaction");
  drive_and_check(tr);
end

每次 new() 得到新事务。randomize() 返回失败时,不应拿未按约束成功生成的对象继续驱动。随机只负责生成输入;driver、monitor、scoreboard 仍按同一流程工作。

任务:只生成合法随机请求

当前事务的约束:

rand logic [2:0] op;
rand logic [7:0] a, b;
 
constraint legal_op_c {
  op inside {[3'd0:3'd5]};
  if (op == 3'd5)
    b inside {[8'd0:8'd8]};
}

op=0..5 是正常操作;左移时将 b 限定到 0~8,让少量随机测试更有机会碰到有意义的边界。op=6/7 不是被遗忘,而是专门由定向测试覆盖默认分支。如果把“合法约束”误当成“所有需求都只靠随机”,非法码就可能永远不测。

任务:用 seed 复现失败

Questa 的正确选项是 -sv_seed <数字>,不是 -sv seed。相同代码、约束和种子通常给出可复现的随机序列;更改代码或调用随机化的次序,序列也可能变化。发现失败时记录种子、用例内容和仿真器版本。

vsim -onfinish stop -sv_seed 12345 work.tb_top
run -all
quit -sim

若需三个种子,就对每个种子各做一次加载 → 运行 → 卸载,而非连续写三个 vsim 后只运行一次。种子 12345、67890、24212 已用于当前回归;每种子 37 条测试通过。继续阅读 功能覆盖率,理解“随机跑过”与“需求确实测到”之间的区别。