#VERDI# 关于使用Verdi 查看NBA 仿真调度的方法

#VERDI# 关于使用Verdi 查看NBA 仿真调度的方法在学习和使用Verilog的过程中,难免会碰到需要深入理解仿真器调度的问题。今天这篇聊聊使用Verdi去分析NBADelay的问题。NBA就是NonBlockingAssignment,非阻塞赋值的缩写。它通常用来描述一个用时钟沿触发的寄存器。在Verilog普及早期,人们通常会在NBA的<=之后加个单位延时#1来解决早期仿真器行为不一致的问题。所谓习惯成自然,NBAUnitDelay在某些设计中一直沿用下来,那么如何去理解这个延时的作用呢?SNUG上的.

在学习和使用 Verilog 的过程中,难免会碰到需要深入理解仿真器调度的问题。今天这篇聊聊使用 Verdi 去分析 NBA Delay 的问题。

NBA 就是 NonBlocking Assignment,非阻塞赋值 的缩写。它通常用来描述一个用时钟沿触发的寄存器。在 Verilog 普及早期,人们通常会在 NBA 的<= 之后加个单位延时#1来解决早期仿真器行为不一致的问题。

所谓习惯成自然,NBA Unit Delay 在某些设计中一直沿用下来,那么如何去理解这个延时的作用呢?SNUG 上的知名作者 Clifford E. Cummings 在 2002 年有篇文章阐述的挺详细,感兴趣的朋友可以搜来研究,不再赘述。(点击文末阅读原文可以下载PDF)

下面给出一些代码片断,同样感兴趣的朋友可以自己完善并用 VCS 仿真生成波形,然后用 Verdi 打开。

首先创建三个时钟,注意两个二分频时钟的创建方式不同。

  always #(10/2) clk = ~clk;// T = 10ns
  always #(20/2) clk_div2_direct = ~clk_div2_direct; // T = 20ns
  
  always @ ( posedge clk or negedge rst_n ) begin // T = 20ns
    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# 关于使用Verdi 查看NBA 仿真调度的方法

只从上图分析的话,两个二分频时钟的波形是完全一致的,被采样的数据是同一个,那么采到的数据也应该是相同的。但我们知道这两个二分频时钟的生成方式是不同的,那么不同在什么地方呢?

在 Verdi 的 nWave 窗口中选中 View – Expand Delta – Region Mode,把 Cursor 移动到二分频时钟的上升沿,然后点击 Expand/Collapse Time at Cursor,简单点的话直接按 w 键。

#VERDI# 关于使用Verdi 查看NBA 仿真调度的方法

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

#VERDI# 关于使用Verdi 查看NBA 仿真调度的方法

 这个例子中,只存在绿色的 Active Region 和 红色的 NBA Region。在某些 glitch debug 的例子中,还能看到 Re-Active Region 和 Re-NBA Region。

Region 的展示可以帮助我们很好的理解 Verilog 规范中的定义的信号调度。

此外,Verdi 还可以通过点击 Tools – Event Sequence 来显示图形化的 Event 序列:

#VERDI# 关于使用Verdi 查看NBA 仿真调度的方法

此外,我们还可以同时打开两者窗口,进行观察。

#VERDI# 关于使用Verdi 查看NBA 仿真调度的方法

 (完结)向分享知识的大佬致敬!!!

附代码:

#VERDI# 关于使用Verdi 查看NBA 仿真调度的方法

#VERDI# 关于使用Verdi 查看NBA 仿真调度的方法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/28988.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注