来自微信公众号 “数字芯片实验室”
Verilog设计和测试平台的编码风格可能会影响仿真过程的正确(Correctness)和性能(performance),其中涉及仿真正确性的一个方面就是不同仿真器对竞争冒险(race conditions)的不同仿真结果。
竞争冒险的输出是不可预测的,可能在仿真期间导致意外的问题。
示例1 :Using and Setting a Value at the Same Time
module race;
reg a;
initial begin
a = 0;
#10 a = 1;
end
initial begin
#10 if (a) $display("may not print");
end
endmodule
两个initial begin end并行块没有确定的顺序,所以,不确定$display语句是否被执行。
可以在$display语句前增加延时#0,来避免竞争冒险
initial begin
#10 if (a)
#0 $display("may not print");
end
类似地,只要存在在同一时刻对某个信号进行写写、读写、写读都会产生竞争冒险。
Write– Write
initial
#5 var1 = 0; // write operation on signal var1
initial
#5 var1 = 1; // write operation on signal var1
Read – Write
initial
#5 var1 = var2; // read operation on signal var2
initial
#5 var2 = 1; // write operation on signal var
Write– Read
initial
#5 var1 = 0; // write operation on signal var1
initial
#5 var2 = var1; // read operation on signal var1
Race Detection
VCS 可以在编译(compile)和仿真(simulation)期间进行竞争冒险检查。检查到这些竞争冒险很重要,因为在Verilog仿真中,无法控制这些不同并行语句的执行顺序,这意味着不同的仿真器对同一个设计可能产生正确或者错误的仿真结果。
编译设计时,可以针对整个设计(-race)或者部分设计(-racecd)启用竞争冒险检测。针对下面的测试平台:
module race;
reg var1,var2;
//Write– Write
initial
#5 var1 = 0; // write operation on signal var1
initial
#5 var1 = 1; // write operation on signal var1
//Read – Write
initial
#15 var1 = var2; // read operation on signal var2
initial
#15 var2 = 1; // write operation on signal var2
//Write– Read
initial
#25 var1 = 0; // write operation on signal var1
initial
#25 var2 = var1; // read operation on signal var1
endmodule
编译&仿真
vcs -race test.v
./simv
VCS工具会在仿真目录底下生成race.out文件,其中包含了设计和测试平台中的竞争冒险相关信息(仿真时间、变量名、竞争冒险类型和所在行数)。
Synopsys VCS RACE REPORT
5 "var1": write race (test.v: 6) && write race (test.v: 8)
15 "var2": read race (test.v: 13) && write race (test.v: 15)
25 "var1": write race (test.v: 20) && read race (test.v: 22)
END RACE REPORT
本文转载自公众号:芯片数字实验室
原文链接:https://mp.weixin.qq.com/s/mN2m4PLBWa6GQfE\_WqV31g
未经作者同意,请勿转载!
推荐阅读
想了解更多内容,欢迎关注芯片数字实验室专栏