现象:
代码如下,本来应该实现dla_work_start拉高后一拍,dla_finish_inter 为高的,但是实际仿真出来的波形发现这来给你个信号是同时拉高,并没有延后一拍。
always @ (posedge clk or posedge rst)
begin
if(rst) begin
dla_finish_inter <= 1'b0;
end
else if (dla_work_start) begin
dla_finish_inter <= 1'b1;
end
else begin
dla_finish_inter <= 1'b0;
end
end
后续分析这里出现了仿真冒险,这里的dla_work_start信号是在仿真模型里通过#500产生的。而start信号驱动finish信号。这会导致在同一时刻对dla_work_start进行了读和写,产生仿真冒险。
类似地,只要存在同一时刻对某个信号进行写写、读写、写读都会产生仿真冒险。而VCS可以在仿真期间进行仿真冒险检查:–race选项。
matedata文件夹下会出现一个race.out文件,其中包含了设计和tb中的仿真冒险相关信息(仿真时间、变量名、仿真冒险类型和所在行数)。