前言
Verdi是一個(gè)功能強(qiáng)大的debug工具,可以配合不同的仿真軟件進(jìn)行debug,很多企業(yè)常用VCS+Verdi或者Xcelium/xrun+Verdi的方式進(jìn)行代碼的仿真與檢查。Verdi支持對(duì)所有設(shè)計(jì)和驗(yàn)證流程進(jìn)行全面的調(diào)試。它能夠幫助工程師理解復(fù)雜和不熟悉的設(shè)計(jì)行為,讓困難和乏味的調(diào)試過(guò)程自動(dòng)化,并能讓多樣和復(fù)雜的設(shè)計(jì)環(huán)境一致化。在芯片設(shè)計(jì)過(guò)程中,可以根據(jù)仿真結(jié)果檢查或者理解設(shè)計(jì);在芯片驗(yàn)證過(guò)程中,常常用來(lái)調(diào)試(debug)一些錯(cuò)誤的情況。Verdi既可以閱讀調(diào)試代碼,又可以查看波形,包括數(shù)字設(shè)計(jì)的波形和模擬設(shè)計(jì)的波形。
本文內(nèi)容標(biāo)題截圖
本文一共一萬(wàn)一千多字,上百?gòu)埥貓D,基本涵蓋了Verdi的日常用法和常規(guī)技巧,內(nèi)容比較多我對(duì)標(biāo)題做了如下的截圖,方便大家閱讀查找。整理的過(guò)程中參考了很多大佬的文章,文末也都一一列舉出來(lái)了。由于時(shí)間倉(cāng)促,整理的還不是太理想,還是希望能幫助到一些朋友吧。
一、verdi使用教程
(一) Verdi環(huán)境配置
bashrc中配置
export Verdi_HOME=$Synopsys_Dir/Verdi2015
# export NOVAS_HOME=$Synopsys_Dir/Verdi2015
export PATH=$Verdi_HOME/bin:$PATH
export LD_LIBRARY_PATH="/opt/Synopsys/Verdi2015/share/PLI/lib/linux64"$PATH
export LD_LIBRARY_PATH="/opt/Synopsys/Verdi2015/share/PLI/VCS/linux64"$PATH
上面三個(gè)環(huán)境變量的解釋?zhuān)?/p>
VERDI_HOME/NOVAS_HOME:仿真器默認(rèn),且為設(shè)置PATH做準(zhǔn)備
PATH:讓系統(tǒng)(Linux)找到verdi
LD_LIBRARY_PATH:讓系統(tǒng)(Linux)能夠找到Verdi需要的庫(kù)文件.so(靜態(tài)庫(kù)),.a(動(dòng)態(tài)庫(kù)),.tab(表格文件).
(二)VCS產(chǎn)生Verdi波形
[1] 使用Verilog系統(tǒng)函數(shù),在tb****文件中加入相應(yīng)的系統(tǒng)函數(shù)
initial begin
$fsdbDumpfile("fifo.fsdb");
$fsdbDumpvars(0);
end
[2] 使用UCLI、TCL接口(VCS使用tcl腳本)
global env
fsdbDumpfile "$env(demo_fifo).fsdb"
fsdbDumpvars 0 "top_tb"
run
(三) Verdi基礎(chǔ)使用
1 打開(kāi)Verdi
(1)verdi -nologo
(2)makefile命令
2. nTrace使用
(1)查看包含的設(shè)計(jì)架構(gòu)
(2)查尋模塊實(shí)例化的位置
①在設(shè)計(jì)結(jié)構(gòu)中雙擊實(shí)例化模塊的名字->源代碼窗口高亮了模塊名
②再雙擊高亮的模塊名->看到在上層模塊中的哪一行被調(diào)用了
在nTrace中查找模塊和信號(hào)
查尋字符串
查看驅(qū)動(dòng)信號(hào)相關(guān)
(3) nSchema使用
查看原理圖
顯示原理圖各信號(hào)名
RTL 級(jí) : 在當(dāng)前的層次中查找某個(gè)信號(hào)
使用Fan-In Cone追蹤某個(gè)信號(hào)的驅(qū)動(dòng)邏輯
①首先要用上面的辦法來(lái)查找信號(hào)②調(diào)用該工具:
產(chǎn)生partial hierarchy schematic
用來(lái)查看與選擇特定信號(hào)有關(guān)的邏輯/模塊
①選擇需要查看的信號(hào)(可以通過(guò)shift鍵來(lái)選擇多個(gè)信號(hào))
(4) nState使用
查看狀態(tài)機(jī)視圖
查看狀態(tài)的執(zhí)行語(yǔ)句和轉(zhuǎn)移條件
查看某個(gè)狀態(tài)的執(zhí)行次數(shù)
(5) nWave使用
[1] 添加波形到nWave
①我們要打開(kāi).v文件
②打開(kāi)nWave然后打開(kāi).fsdb波形文件③正式添加波形:
快捷鍵G或者:
在nTrace中選中信號(hào)后,鼠標(biāo)中鍵拖拽,或者ctrl+w進(jìn)行添加
自動(dòng)加載,用-ssf 命令
verdi -sv -f filelist.f -top tb_top -ssf dut.fsdb &
[2] 查找某信號(hào),添加到nWave中
①通過(guò)nTrave查找到該信號(hào)②通過(guò)上面的方法進(jìn)行添加或者通過(guò)get signal來(lái)查找
nWave波形窗口,快捷鍵 g 加載信號(hào)(Get signals)。在彈出的窗口選中需要添加的信號(hào),點(diǎn)擊滾輪選擇需要添加信號(hào)的位置,也可在代碼中(nTrac界面)選中信號(hào) Ctrl+W 將信號(hào)加載在波形中
[2--]查找信號(hào)
找到模塊里的某個(gè)信號(hào),按?彈出find string對(duì)話框進(jìn)行查找。
[3] 給Group重命名,排序,以及調(diào)整信號(hào)位置
[1]重命名
[2]信號(hào)的拖拽:通過(guò)鼠標(biāo)中鍵進(jìn)行拖拽。
[3]縮?。嚎旖萱Iz,或者100%匹配:F
[4]放大:左鍵拖選放大范圍shift+Z ctrl+滑輪:進(jìn)行放大或者縮小
[5]移動(dòng):鼠標(biāo)中鍵按住信號(hào)拖拽中鍵選擇位置:
[6]復(fù)制:ctrl+P,或者右擊信號(hào),選擇復(fù)制的選項(xiàng)
[7]粘貼:ins鍵,或者右擊信號(hào),選擇粘貼的選項(xiàng)(注意:可以通過(guò)鼠標(biāo)中鍵選擇粘貼的位置)
[8]刪除:delete鍵
[4] 改變信號(hào)的顏色
第一步:Tools->preferences->waveform->viewoption->waveformpane->general->paint waveform with specified color/pattern
第二步:選中信號(hào),然后按快捷鍵C改變信號(hào)顏色。
按C或者T修改信號(hào)或者波形顏色,按****T 更實(shí)用 ,每按一次顏色自動(dòng)改變。不區(qū)分大小寫(xiě)。
[5] 查看信號(hào)及變化
任意值:所有信號(hào)變化,一般會(huì)應(yīng)用到組合邏輯的指示信號(hào)信號(hào)沿:用于查找有效指示信號(hào),比如使能信號(hào)總線值:主要是用來(lái)查找數(shù)據(jù)信號(hào)模擬值:查看比如函數(shù)發(fā)生器產(chǎn)生的正弦波信號(hào)進(jìn)制之間的轉(zhuǎn)換:
[6] 進(jìn)制之間的轉(zhuǎn)換
[7] 符號(hào)數(shù)之間的轉(zhuǎn)換
[8] 狀態(tài)寄存器顯示為狀態(tài)名字
nTrace:
或者nWave:
[9] 通過(guò)移除關(guān)聯(lián),從狀態(tài)機(jī)名字恢復(fù)到原來(lái)的進(jìn)制顯示
可以看到,我們打開(kāi)過(guò)狀態(tài)機(jī)視圖之后,我們也就可以在狀態(tài)名和進(jìn)制之間轉(zhuǎn)換了:
[10] 通過(guò)邏輯操作創(chuàng)建新信號(hào)
[11] 如何添加marker
shift+M。為方便波形定位,按鍵shift+M使用mark功能標(biāo)記一下,可以自定義名稱(chēng)和顏色,方便查找。
[12] 總線操作:
[13] 如何查找信號(hào)的某個(gè)值、某個(gè)值跳轉(zhuǎn)到某個(gè)值
[14] 如何對(duì)比兩個(gè)波形
[15] 顯示信號(hào)全路徑
按 **=H=** 顯示波形信號(hào)全路徑,再按**H**撤銷(xiāo)。不區(qū)分大小寫(xiě)。
[16] 對(duì)信號(hào)的簡(jiǎn)單操作
點(diǎn)擊波形窗口,選中信號(hào),使用Delete刪除信號(hào)。選中信號(hào),使用Ctrl+p復(fù)制選中的信號(hào),然后使用insert按鍵插入,粘貼的位置由黃線所在位置決定。
[17] 移動(dòng)波形窗口信號(hào)的位置
使用滾輪在波形窗口選中信號(hào),然后拖到代碼窗口即可查看選中波形的代碼邏輯
[18] 放大縮小
Z:Zoom In;z:Zoom Out;f:Zoom All
[19] 顯示狀態(tài)機(jī)的跳轉(zhuǎn)
選中狀態(tài)機(jī)狀態(tài)的波形,在nWave窗口選中Tools>Bus Contention>打開(kāi)狀態(tài)機(jī),(關(guān)閉), 返回查看波形已經(jīng)變?yōu)闋顟B(tài)的名稱(chēng)。 補(bǔ)充:選擇具有狀態(tài)機(jī)的模塊選中,然后在主工具欄選擇Tools>Extract interative FSM
點(diǎn)擊OK,然后點(diǎn)擊下面的狀態(tài)機(jī),即可看到狀態(tài)的跳轉(zhuǎn)。
[20] 參考信號(hào)數(shù)值
選中Source>Active Annotation即可看到每一個(gè)信號(hào),參數(shù)的數(shù)據(jù)顯示。
[21] 新建組并對(duì)組重命名
將黃線放到最后一行,添加信號(hào)即可新建一個(gè)信號(hào)組。然后鼠標(biāo)選中右鍵即可進(jìn)行相關(guān)操作,也可以選中一個(gè)模塊,直接Ctrl+4即可將接口信號(hào)加入波形窗口。
[22] Signal Event Report統(tǒng)計(jì)
統(tǒng)計(jì)出某個(gè)信號(hào)在特定時(shí)間段內(nèi)的跳變的次數(shù)。
按鼠標(biāo)滑輪中建,添加一條mark標(biāo)記線用于選擇統(tǒng)計(jì)區(qū)間。
View -> Signal Event Report
Rising:指的是指定Marker時(shí)間段內(nèi)上升沿?cái)?shù);
Falling:指的是指定Marker時(shí)間段內(nèi)下降沿?cái)?shù);
=備注:利用Logical Operation和Signal Event Report可以統(tǒng)計(jì)非連續(xù)有效信號(hào)=
[23] Waveform Compare比較波形
nWave提供了一種綜合比較自動(dòng)比較不同結(jié)果的能力。在比較完成后,nWave以圖形方式顯示波形窗格中的任何不匹配,然后可以通過(guò)每個(gè)不匹配來(lái)分析差異。
Tools -> Waveform Compare
(四) Verdi使用技巧
1、連續(xù)信號(hào)有效數(shù)量的測(cè)量
[1] 下面分享一些在實(shí)際做項(xiàng)目過(guò)程中verdi在debug時(shí)的小技巧:連續(xù)信號(hào)有效數(shù)量的測(cè)量。
如下圖所示,clk是輸入時(shí)鐘信號(hào),data_enable_in是輸入數(shù)據(jù)有效標(biāo)志信號(hào),y_in則是輸入數(shù)據(jù)。在debug的時(shí)候,有時(shí)我們想要知道白色光標(biāo)和黃色光標(biāo)時(shí)間內(nèi)有多少個(gè)連續(xù)有效的數(shù)據(jù)y_in。我們?cè)撊绾巫龅侥兀?/p>
一般可以使用以下3種方法:
方法1:最直接也是最笨的辦法,當(dāng)然是手動(dòng)去數(shù),1、2、3…;如果該時(shí)間段內(nèi),數(shù)據(jù)量較少,很快就可以數(shù)出來(lái)了。當(dāng)數(shù)據(jù)量較多時(shí),只要你有足夠的耐心和時(shí)間,有時(shí)還需要一副好眼睛,最終也是可以得到正確的結(jié)果。不過(guò)效率非常低下,比較麻煩的是還容易數(shù)錯(cuò)。
方法2:如果已知時(shí)鐘周期(本例子中clkp=6.736ns),則可以計(jì)算該時(shí)間段內(nèi)時(shí)鐘個(gè)數(shù)來(lái)獲知數(shù)據(jù)量;上面例子的圖中兩個(gè)光標(biāo)之間的時(shí)間差delta=188.608ns,delta/T=28,因此就是28個(gè)數(shù)據(jù)了。是不是要比直接用手動(dòng)數(shù)快很多了?這個(gè)辦法雖然準(zhǔn)確,但是每次都要計(jì)算一次,如果需要頻繁的獲知不同時(shí)間段內(nèi)的有效數(shù)據(jù)還是太麻煩了一點(diǎn)。
方法3:本文重點(diǎn)要介紹的方法。該方法是通過(guò)把時(shí)鐘周期設(shè)置為時(shí)間單位,這樣兩個(gè)光標(biāo)之間的時(shí)間差就是該段時(shí)間內(nèi)的有效數(shù)據(jù)量了。具體操作方法如下:
如下圖用鼠標(biāo)點(diǎn)擊1,會(huì)彈出對(duì)話框;點(diǎn)擊2位置倒三角形,下拉選項(xiàng)中選時(shí)鐘周期單位是ns;然后再把timeunit 改為clock周期6.736ns,點(diǎn)擊OK.
再看delta顯示出來(lái)的值,已經(jīng)變成28了,即為我們要的數(shù)據(jù)量了。
這個(gè)方法對(duì)于一段時(shí)間內(nèi)的連續(xù)有效數(shù)據(jù)來(lái)說(shuō),應(yīng)該是最簡(jiǎn)單有效的獲取數(shù)據(jù)個(gè)數(shù)的方法了。任意改變兩光標(biāo)的距離或位置,都很直接的得到該段時(shí)間內(nèi)的連續(xù)有效數(shù)據(jù)量。該方法在debug過(guò)程中常常會(huì)用到,請(qǐng)大家善加利用。
[2]另外還有一個(gè)比較有效的辦法是利用verdi的nWave里面的Signal Event Report 功能。該方法雖然稍顯麻煩,但善于利用,也可以變得非常好用。方法如下圖:
a.鼠標(biāo)點(diǎn)擊選中clk 這個(gè)信號(hào);b.點(diǎn)擊view菜單,選擇下拉菜單里面的SignalEvent report,就會(huì)彈出對(duì)話框;c.進(jìn)度條往后拖,會(huì)看到Falling#這一欄顯示的數(shù)據(jù)28就是我們要的數(shù)據(jù)量了。
以上就是一段時(shí)間內(nèi)連續(xù)有效數(shù)據(jù)的幾個(gè)測(cè)量方法。debug的時(shí)候方法3最簡(jiǎn)單便捷,應(yīng)用頻率也較高;但是其他幾個(gè)方法在特定的場(chǎng)景下也可以發(fā)揮出自己的作用,需要根據(jù)實(shí)際debug的時(shí)候靈活應(yīng)用。
[2]網(wǎng)格法
點(diǎn)擊菜單里面的view選項(xiàng),選擇Grid Options,如下圖所示:
選中選項(xiàng)Grid on 以及選項(xiàng)Grid Counter with Start Number,如下圖所示,點(diǎn)擊Apply或者OK之后,就可以看到波形里面出現(xiàn)了網(wǎng)格,最下面有數(shù)字出現(xiàn)。這種方法還有一個(gè)好處是鼠標(biāo)左鍵點(diǎn)到CLK信號(hào)的任意位置,計(jì)數(shù)都是從新的地方開(kāi)始,具有很強(qiáng)的靈活性。
[4] 自動(dòng)添加計(jì)數(shù)器:
右擊CLK信號(hào),選擇Add Counter Signal by,選擇上升沿、下降沿、任意沿中的一個(gè),就會(huì)自動(dòng)產(chǎn)生一個(gè)16進(jìn)制的計(jì)數(shù)信號(hào),不過(guò)它的計(jì)數(shù)起點(diǎn)是從CLK的0時(shí)刻開(kāi)始,不能選擇任意時(shí)刻,所以缺乏靈活性。
關(guān)于方法3和方法4,更推薦方法3網(wǎng)格法,看起來(lái)很強(qiáng)大,大家可以繼續(xù)探索探索。
[5]打開(kāi)路徑下的verdi.cmd記錄了上一次的全部動(dòng)作。如果verdi意外關(guān)閉,可以使用verdi -play verdi.cmd來(lái)復(fù)原。
[6]可以給clk的上升沿打上標(biāo)記(好像叫l(wèi)abel),在兩個(gè)光標(biāo)之間會(huì)顯示標(biāo)記的個(gè)數(shù),也就是周期數(shù)。
2、非連續(xù)有效信號(hào)量測(cè)方法
實(shí)際debug過(guò)程中,更常遇到的場(chǎng)景是 非連續(xù)有效的信號(hào) ,如下圖所示:CLK并不是在每個(gè)時(shí)刻都是有效的,這時(shí)我們又該如何比較快速準(zhǔn)確的獲知某個(gè)時(shí)間段內(nèi)有效信號(hào)(CLK)個(gè)數(shù)呢?
跟獲取連續(xù)有效信號(hào)個(gè)數(shù)一樣,如果某個(gè)時(shí)間段內(nèi)有效信號(hào)個(gè)數(shù)較少(比如少于10個(gè)),直接手動(dòng)數(shù)就可以了。當(dāng)有效信號(hào)toggle次數(shù)比較多時(shí),肉眼無(wú)法快速看出數(shù)量的時(shí)候,我們可以利用Verdi nWave里面的Logical operation 和Signal Event report 這兩個(gè)功能來(lái)實(shí)現(xiàn)。
對(duì)于非連續(xù)有效數(shù)據(jù)傳輸,通常會(huì)有一個(gè)信號(hào)來(lái)標(biāo)志哪筆數(shù)據(jù)是有效的,如上圖中的valid_in信號(hào)為1時(shí)表示data_in數(shù)據(jù)有效。利用這個(gè)標(biāo)志信號(hào)跟時(shí)鐘進(jìn)行“與”操作,就得到一個(gè)新的時(shí)鐘。這個(gè)新的時(shí)鐘只有在數(shù)據(jù)有效時(shí)才有,在數(shù)據(jù)無(wú)效時(shí)被遮掉了。再通過(guò)Signal Event report獲知指定時(shí)間內(nèi)新的時(shí)鐘個(gè)數(shù),就可以知道有效數(shù)據(jù)的個(gè)數(shù)了。
具體操作步驟如下:
(1).鼠標(biāo)選中時(shí)鐘信號(hào)clk和數(shù)據(jù)有效標(biāo)志信號(hào)valid_in;(2).點(diǎn)開(kāi)nWave 菜單里面的Signal,再選擇下拉菜單里的Logical Operation,如下圖:
(3).在彈出的對(duì)話框里面,如下圖所示,確認(rèn)Expression里的信號(hào)操作是”&”;把Name 改成valid_in_clk;然后點(diǎn)擊Create/Modify按鈕;
再回來(lái)看波形,如下圖所示,就會(huì)發(fā)現(xiàn)多了一個(gè)信號(hào)valid_in_clk,這個(gè)信號(hào)就是我們需要的新時(shí)鐘信號(hào)。
(4)接下來(lái)就是Signal Event Report閃亮登場(chǎng)了。選中valid_in_clk,然后在View下拉菜單里面選Signal Event Report。如下圖所示,在彈出的對(duì)話框里,找到Falling#這一列,里面列的數(shù)字16就是我們指定的時(shí)間段內(nèi)有效的數(shù)據(jù)個(gè)數(shù)了。
如果還是半信半疑的同學(xué),可以手動(dòng)數(shù)一數(shù),看看Logical Operation加Signal Event Report這套組合拳的結(jié)果是否正確。
3、搜索查找
Verdi提供了很強(qiáng)大的搜索查找功能,充分利用好這些功能在IC設(shè)計(jì)/驗(yàn)證過(guò)程中可以大大提高debug 效率。下面我們就結(jié)合實(shí)際應(yīng)用來(lái)介紹一下Verdi中常用的搜索查找功能以及一些使用技巧。
[1] 數(shù)值搜索、上升沿和下降沿搜索
進(jìn)行數(shù)值搜索、上升沿和下降沿搜索
選中信號(hào),按n向后搜索,N向前搜索;或者按左右小箭頭進(jìn)行查找搜索。例如:
數(shù)值搜索:
上下沿搜索:
[2] 層次瀏覽器窗格中尋找實(shí)例(instance)
在利用 Verdi debug時(shí),首先需要找到我們負(fù)責(zé)模塊的實(shí)例(instance),再選擇相應(yīng)的信號(hào)來(lái)觀察它們的行為來(lái)debug。當(dāng)設(shè)計(jì)很龐大時(shí),要找到底層的一個(gè)小模塊,如果用鼠標(biāo)從 top一層一層的往下點(diǎn),效率會(huì)比較低;又或者我們只負(fù)責(zé)了一個(gè)小模塊,對(duì)整個(gè)設(shè)計(jì)的層級(jí)關(guān)系并不清楚的時(shí)候,找到我們的底層設(shè)計(jì)會(huì)變得非常困難。
這時(shí),只要我們知道底層模塊的實(shí)例名,就可以利用Verdi的“Show Navigation Text Field”功能快速查找了。操作方法如下圖,
a)在Verdi的層次瀏覽器窗格(Verdi界面的左部)點(diǎn)右鍵,彈出菜單里選“Show Navigation Text Field”或快捷鍵“Ctrl+S”
b) 在輸入對(duì)話框里輸入相應(yīng)的實(shí)例名,再點(diǎn)右邊的搜索按鈕就可以了。
**[3] **搜索源代碼
源代碼窗格里提供了三種搜索指令,功能各不相同,用來(lái)應(yīng)付不同的使用場(chǎng)景。
1)Find scope
Find scope適用于整個(gè)chip里面的查找。前面提到的應(yīng)用場(chǎng)景如下:
A)Source –> find scope或者 按shift+S
B)在彈出對(duì)話框里Scope Type選module
Filter內(nèi)填要找module關(guān)鍵字;Instance list 里面選擇一個(gè),點(diǎn)Go To,source code就會(huì)打開(kāi)該module。
另外,對(duì)話框最下面列出了整個(gè)設(shè)計(jì)中找到的個(gè)數(shù),可以知道該module被instance次數(shù)。
2) Find Signal/Instance/instport
這個(gè)指令可以查找指定模塊內(nèi)的信號(hào)、實(shí)例或輸入輸出端口。這個(gè)指令的好處是可以把要查找的內(nèi)容都列出來(lái),想看哪一個(gè)就用鼠標(biāo)點(diǎn)一下,就會(huì)切換到源代碼窗格對(duì)應(yīng)位置。當(dāng)模塊內(nèi)要查找的signal(instance or input/output port)比較多時(shí),可以快速的找到想看的signal。
操作方法如下:
source –> Find Signal/Instance/instport 或者shift+A
選擇要查找的類(lèi)型:signal, instance or instport
輸入框里面輸入信號(hào)名,點(diǎn)Find按鈕,下面會(huì)列出所有找到的信號(hào),點(diǎn)擊某個(gè)信號(hào),就會(huì)到達(dá)source code 里面對(duì)應(yīng)的信號(hào)
3) find string
Find string應(yīng)該是debug 過(guò)程中使用頻率最高的查找指令了。只要在輸入框里面輸入部分或全部要查找的字符串,再點(diǎn)一下find 按鈕就可以了。
這個(gè)指令可以在當(dāng)前文檔(current File)或者全部文檔(All file)里面查找,因?yàn)樽址檎移ヅ涞帽容^多,要根據(jù)需要選擇在當(dāng)前文檔或全部文檔查找,以提高查找效率。
因?yàn)槭褂妙l率高,Verdi也很貼心的在默認(rèn)工具欄里放置了Find string的輸入窗口,如下:
輸入欄輸入字符串有幾種方法
(1)手動(dòng)輸入,好處是可以只輸入部分字符,不用全部輸入信號(hào)名(2)點(diǎn)擊信號(hào),按中鍵拖入輸入欄,然后點(diǎn)向上或向下查找,找同名信號(hào)(3)點(diǎn)擊信號(hào),按快捷鍵”Ctrl+F”,信號(hào)名就會(huì)自動(dòng)輸入到輸入欄。這個(gè)快捷鍵很好用。
[4] nWave里面的信號(hào)追溯源代碼
Debug過(guò)程中,往nWave 里添加信號(hào)后,查看了信號(hào)波形,如果看到異常往往要回頭看一下源代碼。如果一時(shí)找不到了,find string當(dāng)然可以找得到,但是需要輸入一串字符,可能就不那么樂(lè)意了。
其實(shí)Verdi很貼心,可以直接把nwave里面的波形拖到nTrace里面,可以快速的找到要找的信號(hào)。
操作方法:nWave里面選擇信號(hào),如out_den。按住中鍵,直接拖到source code plane,然后放開(kāi),就會(huì)顯示你要找的信號(hào)了
上述內(nèi)容介紹了Verdi常用的幾種搜索查找功能和技巧。希望對(duì)大家有幫助,debug效率更上一個(gè)檔次。如果你有什么好想法,也歡迎后臺(tái)留言一起討論。
4、總線拆分
分析波形的時(shí)候有時(shí)候需要把一個(gè)多比特的bus拆分成幾個(gè)位寬較小的bus,以方便觀察數(shù)值。
右鍵/Signal -> Bus Operations -> Expand as Sub-bus
將32bit分割為4個(gè)8bit bus.
分割結(jié)果:
5、統(tǒng)計(jì)
統(tǒng)計(jì)出某個(gè)信號(hào)在特定時(shí)間段內(nèi)的跳變的次數(shù)。這個(gè)結(jié)合下一節(jié)的邏輯運(yùn)算,可以把一些復(fù)雜的波形分析用直觀的形式表現(xiàn)出來(lái)。還是右鍵點(diǎn)擊波形窗口左邊的某個(gè)信號(hào)名字,在彈出菜單中選擇Signal Event Report。
在彈出的對(duì)話框中,可以關(guān)注感興趣的內(nèi)容,比如Rising#
,指的是默認(rèn)Markers標(biāo)定的時(shí)間段內(nèi),該信號(hào)的上升沿次數(shù)。這樣就不用很辛苦的放大波形,用眼睛一個(gè)一個(gè)去數(shù)了。
6、邏輯運(yùn)算
在一個(gè)頻繁變化的信號(hào)、尤其是多比特的bus信號(hào)中觀察是否出現(xiàn)了某個(gè)值,有時(shí)候可以通過(guò)搜索來(lái)追蹤。也可以通過(guò)對(duì)現(xiàn)有信號(hào)執(zhí)行的邏輯操作創(chuàng)建新信號(hào),或者搜索信號(hào)值。但是如何一目了然地看到呢?右鍵/Signal -> Logical Operation,通過(guò)新建一個(gè)信號(hào),該信號(hào)是待觀察信號(hào)的某種邏輯表達(dá)式。
數(shù)值搜索
邏輯操作
例如:兩信號(hào)進(jìn)行與運(yùn)算,也可以進(jìn)行其他運(yùn)算。
相與之后結(jié)果:
7、manage.rc
manage.rc
可以管理多個(gè)rc文件,實(shí)現(xiàn)每次啟動(dòng)Verdi都能載入預(yù)設(shè)的設(shè)置,同時(shí)不受上次啟動(dòng)Verdi后保存的設(shè)置影響。還可以保存本次使用過(guò)程中更改過(guò)的設(shè)置,以便更新預(yù)設(shè)設(shè)置。這個(gè)略微有些復(fù)雜。在啟動(dòng)Verdi時(shí),需要加個(gè)參數(shù)。
-managercFile some_path/manage.rc
這個(gè)manage.rc的內(nèi)容大概是這樣的:
@Manage rc file Version 1.0
[File]
default_file = ~/load_only.rc
working_file = ./novas.rc
[Load]
default_file
[Save]
working_file = MODIFIED_KEY
例子中作為只讀的default_file
文件,可以放一些自己習(xí)慣或者喜歡的設(shè)置。比如tab
等于4還是8,各種界面的字體,以及其它一些每次啟動(dòng)Verdi都希望生效的設(shè)置。working_file
用來(lái)保存本次使用更改的設(shè)置,如果有想長(zhǎng)期預(yù)設(shè)的,可以從中copy出來(lái)到default_file
,這樣方便升級(jí)迭代。
通過(guò)如下常規(guī)的參數(shù)調(diào)用
-rcFile some_path/some.rc
也可以讀入一個(gè)rc文件實(shí)現(xiàn)類(lèi)似預(yù)設(shè)功能,不過(guò)這種方法的缺點(diǎn)是這個(gè)rc文件會(huì)被當(dāng)前調(diào)用覆蓋。后果就是下次啟動(dòng)的Verdi會(huì)帶有上次使用的痕跡,比如打開(kāi)波形文件的目錄位置。用的次數(shù)多了,不勝其煩。干脆用manage.rc
來(lái)徹底的解決。
另外,親測(cè)命令行鍵入 -managercFile 的方式也可以通過(guò)設(shè)置環(huán)境變量來(lái)替代,如在 .cshrc 中添加
setenv NOVAS_MANAGE_RC_FILE some_path/manage.rc
8、Trace代碼過(guò)程中波形窗口保持前置
不知道從哪個(gè)版本開(kāi)始,Verdi默認(rèn)打開(kāi)了Active Detection
,Trace窗口在trace過(guò)程中會(huì)被激活前置,造成波形窗口被遮擋,也是不勝其煩。當(dāng)然這也屬于個(gè)人喜好問(wèn)題。
那如何保持波形窗口始終在前呢?首先需要在Trace下拉菜單中取消Active Detection
,然后點(diǎn)擊波形窗口右上角的Keep as Top
。
這樣在代碼Trace時(shí),波形始終可以看到,方便debug。Active Detection
可以在rc文件中預(yù)設(shè)。Keep as Top
還沒(méi)有找到預(yù)設(shè)的方法。
9、Parameter 提示的默認(rèn)進(jìn)制
在Verdi中,如果把鼠標(biāo)放到Verilog
代碼中的parameter
上,可以提示其值是多少。因?yàn)楦鞣N原因,有時(shí)候會(huì)以二進(jìn)制的形式提示,如果這個(gè)parameter
是32比特,那把這個(gè)二進(jìn)制看明白也太費(fèi)眼睛了。簡(jiǎn)單的話還是16進(jìn)制比較易讀。這個(gè)可以在下圖中的Parameter Value Radix
中設(shè)置。當(dāng)然也可以把它加入rc文件進(jìn)行預(yù)設(shè)。
-
VCS
+關(guān)注
關(guān)注
0文章
79瀏覽量
9611 -
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)論