在学习和使用 Verilog 的过程中,难免会碰到需要深入理解仿真器调度的问题。今天这篇聊聊使用 Verdi 去分析 NBA Delay 的问题。
NBA 就是 NonBlocking Assignment,非阻塞赋值的缩写。它通常用来描述一个用时钟沿触发的寄存器。在 Verilog普及早期,人们通常会在NBA的<=之后加个单位延时#1来解决早期仿真器行为不一致的问题。所谓习惯成自然,NBA Unit Delay 在某些设计中一直沿用下来。
下面给出一些代码片断,同样感兴趣的朋友可以自己完善并用 VCS 仿真生成波形,然后用 Verdi 打开。
首先创建三个时钟,注意两个二分频时钟的创建方式不同。
always #(10/2) clk = ~clk;
always #(20/2) clk_div2_direct = ~clk_div2_direct;
always @ ( posedge clk or negedge rst_n ) begin
if ( ~ rst_n ) begin
clk_div2 <= 1'b0;
end
else begin
clk_div2 <= ~clk_div2;
end
end
然后用clk触发一个不停翻转的寄存器 d1,再分别用两个二分频时钟去采样,保存在 d5 和 d6 中。
always @ ( posedge clk or negedge rst_n ) begin
if ( ~ rst_n ) begin
d1 <= 1'b0;
end
else begin
d1 <= ~d1;
end
end
always @ ( posedge clk_div2 or negedge rst_n ) begin
if ( ~ rst_n ) begin
d5 <= 1'b0;
end
else begin
d5 <= d1;
end
end
always @ ( posedge c

本文探讨了在Verilog中使用非阻塞赋值(NBA)时遇到的问题,特别是NBAUnitDelay的影响。通过示例代码展示了如何使用Verdi工具进行仿真分析,揭示了不同二分频时钟生成方式导致的不同采样结果。通过Verdi的SimulationRegion和EventSequence功能,帮助理解信号调度和时序问题。

7254

被折叠的 条评论
为什么被折叠?



