10、使用 Verdi 分析 NBA Delay 的問題
NBA 就是 NonBlocking Assignment,非阻塞賦值 的縮寫。它通常用來描述一個用時鐘沿觸發的寄存器。在 Verilog 普及早期,人們通常會在 NBA(Nonblocking Assignments) 的<=
之后加個單位延時#1
來解決早期仿真器行為不一致的問題。
所謂習慣成自然,NBA Unit Delay 在某些設計中一直沿用下來,那么如何去理解這個延時的作用呢?SNUG 上的知名作者 Clifford E. Cummings
在 2002 年有篇文章闡述的挺詳細(Verilog Nonblocking Assignments With Delays, Myths & Mysteries)下面給出一些代碼片斷,同樣感興趣的朋友可以自己完善并用 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序列。
11、數字信號的模擬化呈現
Verdi 提供了既簡單又直觀的操作,去繪制數字信號的模擬變化趨勢。尤其是在觀察周期性計數的數字信號時,例如調制頻率的變化,還有 FIFO 讀寫地址的變化,這種方式基本是可以做到一目了然的。
操作方式:nWave 窗口菜單 - Waveform - Analog Waveform
對于 Verdi 這個工具來說,它對于數字信號本身的含義目前還沒有智能到可以自動識別。所以我們需要指定特定數字信號的表示方式(Notation),是無符號、二補碼還是補碼等等。
操作方式:nWave 窗口菜單 - Waveform - Set Notation
12、手動調節模擬波形的顯示范圍
還有一個可能遇到的局限性就是模擬波形的顯示范圍,Verdi 在繪制數字信號的模擬波形時,默認會按照整個波形的動態范圍來繪圖。如果一個數字信號的初始值和工作時實際的動態范圍差別很大,那么觀察實際工作時的模擬波形時,波形變化的幅度相比整個動態范圍就會太小,無法明了的看到小動態范圍的變化趨勢。
還好Verdi提供了手動調節顯示范圍的功能。
操作方式:nWave 窗口菜單 - Analog - Zoom Value...
根據需要調節上限和下限,調節過程中波形是實時更新的。
對比效果如下圖,第一個信號是默認范圍的,動態變化縮成一條直線了,沒有觀察價值。第二個信號是調整了范圍的,可以清楚的看到變化趨勢。第三個是原始的數字信號。
13、自動調節:切換 FSDB 文件
還有一個比較笨的解決方法是,寫出FSDB 文件時,根據特定信號,從數字信號開始動態變化的時候,做一個文件切換。這樣就把數字信號初始化部分的波形分離出去。當我們著重分析動態變化的部分時,就不需要加載初始化部分的波形。Verdi在繪制模擬波形的時候,只會看到小動態范圍的數值,繪制出來的變化趨勢就足夠清楚了。
$fsdbDumpfile("tb_000.fsdb");
$fsdbDumpvars(0, tb);
@(posedge some_trigger_signal);
$fsdbSwitchDumpfile("tb_001.fsdb");
14、自動調節:加載特定時間范圍
當然作為團隊項目的螺絲釘,有時候不方便控制FSDB 文件的產生方式,那么在加載FSDB 文件的時候,可以選擇指定一個時間范圍。感謝讀者 @Erik Li 提供的這個技巧。
操作方式:nWave窗口菜單 - Open,選擇 FSDB 文件到 Target Name 后,點擊左下方的 Options... 按鈕。
在彈出的對話框中選中 Open File By Time Range,然后點擊 OK 按鈕。
再點擊 OK 按鈕,在彈出的對話框中就可以選擇感興趣的時間起止范圍了。
再分享一個最近才發現的 Verdi 調用參數。
verdi -preTitle "some text"
螺絲釘做久了,需要同時打開的 Verdi 窗口數量與日俱增。怎么從密密麻麻的任務欄圖標中找到要找的那個,是個麻煩但不緊急的問題。除了貫徹斷舍離、及時關閉短期內不需要的窗口之外,用上面的選項為每一個 Verdi 窗口做個簡潔唯一的命名,也是一個不那么有效的解決之道。
15、跳轉到指定行號
其實日常的頻繁、快速地查看 Verilog 源代碼,一般是在獨立的文本編輯器中完成的。比如,VCS 編譯產生的 log 文件中,對應的 Warning、Error 的后面會跟著相關源文件的路徑、行號。如果用的編輯器是版本比較新的 Vim,那么簡單的 gF 指令就可以迅速的從 log 文件跳轉到對應源文件,而且光標會體貼的定位在出錯行。如果是仍未默認支持的舊版 Vim,那么自己可以添加一個函數,可以參考這篇文章。
這種方式在門級仿真的場景中會不太靈光。因為門級網表通常都非常巨大,用 Vim 類的編輯器打開一次會非常緩慢,頻繁跳轉造成的等待就更難以接受了。
瀏覽門級網表諸如此類的超大文件,用 Verdi 是個不錯的選擇。在 Verdi 的 Source 窗口中,如何快速跳轉到指定的行呢?
用鼠標拖動當然是種辦法。但更快捷的是,在 Source 窗口下,按 g 鍵。會彈出一個小窗口,輸入行號,點擊確定即可。
16、源文件之間或不同邏輯層次的切換
有時候在 Verdi 中需要頻繁的在兩個 Verilog module 之間做切換,做一些對比的工作。如果這兩個 module 所處的層次距離比較遠,那么快捷的切換就顯得特別重要了。這里介紹兩個小技巧。
第一個是利用 Verdi 支持多 Source Tab 的功能。在兩個不同的 Source Tab 中分別打開不同的 module,通過鼠標切換 Source Tab 來實現源文件或者邏輯層次的切換。
打開新的 Source Tab 的比較方便的方法是,在感興趣的 Instance 上點擊右鍵,然后在右鍵菜單上點擊 Display Source Code in New Tab.
效果類似下圖:
第二個技巧是利用 VC Apps 中的Find Instance with Module Def Name。
首先打開 Tools 菜單中的 VC Apps Toolbox。
在 Design Exploration 目錄中找到上述名字的 App,然后雙擊執行。
在出現的對話框中輸入感興趣的 module 名字,支持通配符。然后點擊確定。
在 Verdi 下部的調試窗口中會出現一個新的大概叫做 SmartLog 的頁面,其中列出了按照 module 名字搜索出來的所有 Instance。單擊某個 Instance,Source 頁面就會跳轉到對應的地方。
重復執行上述過程,但搜索不同的 module name,會形成獨立的 SmartLog 頁面。這樣通過切換 SmartLog 頁面,也可以很方便的在多個設計中切換。
17、計數
[1] Grid Options網格計數
可以指定在波形窗中繪制網格線。選項包括Rising Edge, Falling Edge和 Both Edges。View -> Grid Options 選中Grid on勾選 Grid Count with Start Number,默認是0,也可以按需設置
如圖,以AXI_AWVALID上升沿為例,網格線下方出現了計數,用于統計上升沿個數。
[2] 自動計數
右擊AXI_WVALID信號,選擇Add Counter Signal by,選擇上升沿、下降沿、任意沿中的一個。
選擇AXI_WVALID信號的上升沿為例子,波形中自動添加一個counter用于統計。
[3] 還有個fsdb轉文本的功能:fsdbreport
18 用verdi打開覆蓋率文件查看覆蓋率
打開一個verdi——>tools——>coverage;在新打開的界面中選擇——>file——>open/add database——>選擇相應的.vdb文件——>more options——打開cov.hier文件
注:覆蓋率文件為.vdb文件;.hier文件為對應工程目錄的層級結構文件,對整理覆蓋率有幫助
19 查看包含的設計架構
-
代碼
+關注
關注
30文章
4753瀏覽量
68369 -
Verdi
+關注
關注
0文章
22瀏覽量
8762 -
芯片驗證
+關注
關注
5文章
34瀏覽量
47204 -
DEBUG
+關注
關注
3文章
90瀏覽量
19889
發布評論請先 登錄
相關推薦
評論