Verilog 仿真问题:打拍失败
1:记录一下在今的天仿真的时候,对信号打拍操作,发现打拍失败。
打拍失败现象如下:
verilog代码如下:
always @ (posedge clkb or negedge rst_n)if (!rst_n)beginpulse_reg1 <= 0;pulse_reg2 <= 0;endelsebeginpulse_reg1 <= pulse_ina ;pulse_reg2 <= pulse_reg1 ;end
仿真代码如下:
module sim_slow2fast_cdc ( );reg clka ;reg clkb ;reg rst_n ;reg pulse_ina;wire pulse_outb;slow2fast_cdc slow2fast_cdc_inst (.clka (clka) ,.clkb (clkb) ,.rst_n (rst_n) ,.pulse_ina (pulse_ina) ,.pulse_outb (pulse_outb));always #10 clka = ~clka;always #6 clkb = ~clkb;initial beginclka = 0;clkb = 0;rst_n = 0;pulse_ina = 0;#25rst_n = 1; // 复位无效#5 // 对齐clk_come; #45clk_come; #35clk_come; #50clk_come;endtask clk_come;beginpulse_ina = 1; // 来一个慢时钟下的高脉冲#20pulse_ina = 0;endendtaskendmodule
2:现象:可以看见pulse_reg1将pulse_ina信号采集并没有延迟1拍,从而形成打拍失败的结果;
3:问题原因:因为我们这个pulse_ina是模拟外部信号进入,是reg变量,我这里是D触发器要去采集pulse_ina,这里仿真代码是使用的是阻塞赋值;故而出现仿真打拍失败。
4:解决办法:将仿真文件里面的pulse_ina的阻塞赋值改成非阻塞赋值,即可解决。
修改之后仿真代码:
5:仿真结果如下;
放大图效果:
6:总结:打拍成功;
7:参考资料
Verilog 仿真问题:打拍失败_哔哩哔哩_bilibili