在學習和使用 Verilog 的過程中,難免會碰到需要深入理解仿真器調度的問題。今天這篇聊聊使用 Verdi 去分析 NBA Delay 的問題。
NBA 就是 NonBlocking Assignment,非阻塞賦值 的縮寫。它通常用來描述一個用時鐘沿觸發的寄存器。在 Verilog 普及早期,人們通常會在 NBA 的<=
之后加個單位延時#1
來解決早期仿真器行為不一致的問題。
所謂習慣成自然,NBA Unit Delay 在某些設計中一直沿用下來,那么如何去理解這個延時的作用呢?SNUG 上的知名作者 Clifford E. Cummings
在 2002 年有篇文章闡述的挺詳細,感興趣的朋友可以搜來研究,不再贅述。
下面給出一些代碼片斷,同樣感興趣的朋友可以自己完善并用 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 真得是很好很強大。
不過隨著工具的逐漸強大,站在工具背后的人呢?是在逐漸退化還是改變了進化方向?歡迎留言說說你的看法。
-
寄存器
+關注
關注
31文章
5336瀏覽量
120244 -
仿真器
+關注
關注
14文章
1017瀏覽量
83726 -
VCS
+關注
關注
0文章
79瀏覽量
9602 -
Verdi
+關注
關注
0文章
22瀏覽量
8775 -
CLK
+關注
關注
0文章
127瀏覽量
17158
發布評論請先 登錄
相關推薦
評論