最近在做的项目,其中进行数据仿真的时候会遇到一些奇怪的问题或者自己犯一些错误,在此进行积累,希望能对自己有所警示,如对你也有所帮助,说明这篇文章还是有用的。
在进行后时序仿真的时候,将复位信号置为高电平(此处低电平复位)后,必须多延几个时钟,否则会导致奇怪问题的发生,具体如下:
always @(posedge i_clk or negedge i_rst_n)
begin
if(!i_rst_n)
begin
cnt <= 8'd0;
end
else
begin
if(CRC_en)
begin
cnt <= cnt + 1'd1;
end
else
begin
cnt <= 8'd0;
end
end
end
该部分代码是CRC模块中的代码,重点关注其中的cnt信号,它在CRC_en使能的时候才进行计数。
initial
begin
#29;
i_rst_n = 1;
#25;
for(i=0;i < 136;i = i+1)
begin
i_data = memb_crc_data[i];
CRC_en = 1'd1;
#10;
end
CRC_en = 1'd0;
end
always #5 i_clk = ! i_clk ;
该图则是对应的tb文件中CRC_en的代码(时钟周期10ns),此时有意思的事情就来了:
在后时序仿真图中可以看到i(tb里的计数器)和cnt计数器相差很多,然而在行为级仿真(下图)中可以看到两个信号相差没多少。
本人在无意中将rst_n置1后的延时周期增加了,于是便正常了,见下两张图:
initial
begin
#29;
i_rst_n = 1;
#75;
for(i=0;i < 136;i = i+1)
begin
i_data = memb_crc_data[i];
CRC_en = 1'd1;
#10;
end
CRC_en = 1'd0;
end
always #5 i_clk = ! i_clk ;
推测可能是i_rst_n置1后需要一段时间信号才能稳定,因此影响到了CRC_en信号进而cnt信号没有正常进行计数。