上一篇文章中对两个典型的随机方法在静态对象中的随机特性进行了探究:
【芯片验证】异步电路碎碎念(九)静态对象中的随机函数特性探究
在此基础上这一篇来讨论如何在静态对象内构建可控的随机方法。先把上一篇的结论拿出来:
1.纵向看,无论是$random还是$urandom都实现了随机功能,且每次随机值不同;
2.横向看,两个例化模块对比,$random每次随机的结果不同,而$urandom每次随机的结果相同;
3.以不同的种子进行仿真时,同一个例化模块,$random的随机结果每次都相同,而$urandom每次的随机结果是不同的;
再把我们的需求明确下:
1.随机数值是可控且可以复现的,不同的种子随机出不同的结果,相同的种子随机出相同的结果,这样可以充分覆盖随机场景,且出错后稳定可复现;
2.横向看,不同的比特(即每条异步走线路径)随机的结果不同,例如随机延迟时,每条路径的延迟本身就不同,如果随机结果一致那就没有意义了;
3.纵向看,单比特走线每次随机的结果不同,例如这次跳变随机恢复为正确值,下次随机恢复为错误值;
多说无益,咱们来做一做实验看看吧,修改之前实验的RTL代码为:
reg [7:0]rand_value, urand_value;
reg [7:0]new_rand_value;
always @*begin
if(power)begin
rand_value = $random;
urand_value = $urandom;
new_rand_value = $random + $urandom;
//$display("----------------------------------------------");
//$display("%m rand_value = 'h%0h", rand_value);
//$display("%m urand_value = 'h%0h", urand_value);
$display("%m new_rand_value = 'h%0h", new_rand_value);
//$display("----------------------------------------------");
end
end
tc seed = 0
testbench.u_rand_test1 new_rand_value = 'hbd
testbench.u_rand_test0 new_rand_value = 'h9f
testbench.u_rand_test1 new_rand_value = 'h6f
testbench.u_rand_test0 new_rand_value = 'hf4
testbench.u_rand_test1 new_rand_value = 'hec
testbench.u_rand_test0 new_rand_value = 'h1c
tc seed = 1234
testbench.u_rand_test1 new_rand_value = 'hd8
testbench.u_rand_test0 new_rand_value = 'hba
testbench.u_rand_test1 new_rand_value = 'h7
testbench.u_rand_test0 new_rand_value = 'h8c
testbench.u_rand_test1 new_rand_value = 'h37
testbench.u_rand_test0 new_rand_value = 'h67
tc seed = 5678
testbench.u_rand_test1 new_rand_value = 'h78
testbench.u_rand_test0 new_rand_value = 'h5a
testbench.u_rand_test1 new_rand_value = 'h24
testbench.u_rand_test0 new_rand_value = 'ha9
testbench.u_rand_test1 new_rand_value = 'ha0
testbench.u_rand_test0 new_rand_value = 'hd0
tc seed = 1234
testbench.u_rand_test1 new_rand_value = 'hd8
testbench.u_rand_test0 new_rand_value = 'hba
testbench.u_rand_test1 new_rand_value = 'h7
testbench.u_rand_test0 new_rand_value = 'h8c
testbench.u_rand_test1 new_rand_value = 'h37
testbench.u_rand_test0 new_rand_value = 'h67
tc seed = 0
testbench.u_rand_test1 new_rand_value = 'h3c
testbench.u_rand_test0 new_rand_value = 'h34
testbench.u_rand_test1 new_rand_value = 'h7a
testbench.u_rand_test0 new_rand_value = 'he4
testbench.u_rand_test1 new_rand_value = 'h53
testbench.u_rand_test0 new_rand_value = 'h23
tc seed = 1234
testbench.u_rand_test1 new_rand_value = 'hd7
testbench.u_rand_test0 new_rand_value = 'ha5
testbench.u_rand_test1 new_rand_value = 'h32
testbench.u_rand_test0 new_rand_value = 'h94
testbench.u_rand_test1 new_rand_value = 'h22
testbench.u_rand_test0 new_rand_value = 'h2
系列文章入口——
【芯片验证】sva_assertion: 15道助力飞升的断言练习 |
【芯片验证】可能是RTL定向验证的巅峰之作 |
【芯片验证】RTL仿真中X态行为的传播 —— 从xprop说起 |
【芯片验证】年轻人的第一个systemVerilog验证环境全工程与解析 |
【芯片设计】verilog中有符号数和无符号数的本质探究 |
【芯片设计】论RTL中always语法的消失术 |
【芯片设计】代码即注释,注释即代码 |
【芯片设计】700行代码的risc处理器你确实不能要求太多了 |
入职芯片开发部门后,每天摸鱼之外的时间我们要做些什么呢 |
如何计算系统的outstanding 和 burst length? |
芯片搬砖日常·逼死强迫症的关键词不对齐事件 |
熟人社会里,一群没有社会价值的局外人 |