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