Verdi使用小技巧(二)

在学习和使用 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 clk_div2_direct or negedge rst_n ) begin
    if ( ~ rst_n ) begin
      d6 <= 1'b0;
    end
    else begin
      d6 <= d1;
    end
  end

用VCS仿真的时候,加上编译时选项+fsdb+region和运行时选项+fsdb+delta。
然后用Verdi打开生成的fsdb波形。正常的话,可以看到 d5 和 d6 的波形是完全不同的,一个是常0,一个是常1。

只从上图分析的话,两个二分频时钟的波形是完全一致的,被采样的数据是同一个,那么采到的数据也应该是相同的。但我们知道这两个二分频时钟的生成方式是不同的,那么不同在什么地方呢?
在 Verdi 的 nWave 窗口中选中 View - Expand Delta - Region Mode,把 Cursor 移动到二分频时钟的上升沿,然后点击 Expand/Collapse Time at Cursor,简单点的话直接按 w 键。

然后就可以看到这个仿真时刻的 Simulation Region,里面展示了各个 Event 和 Region 的关系。

这个例子中,只存在绿色的 Active Region 和 红色的 NBA Region。在某些 glitch debug 的例子中,还能看到 Re-Active Region 和 Re-NBA Region。
Region 的展示可以帮助我们很好的理解 Verilog 规范中的定义的信号调度。
此外,Verdi 还可以通过点击 Tools - Event Sequence 来显示图形化的 Event 序列。


Verdi 真得是很好很强大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值