0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

這些Debug調(diào)試方法你知道多少?(下篇)

jf_78858299 ? 來(lái)源:芯片學(xué)堂 ? 作者:JKZHAN ? 2023-01-21 17:27 ? 次閱讀

調(diào)試(Debug),是個(gè)非常廣泛的話題,讓我先嘗試給它下個(gè)定義:

調(diào)試指的是在遇到工程問(wèn)題的時(shí)候,通過(guò)一些手段來(lái)進(jìn)一步診斷問(wèn)題原因,探索解決方法,最終使得系統(tǒng)功能正常運(yùn)行的必要過(guò)程。

調(diào)試應(yīng)該說(shuō)是任何一個(gè)工程師解決問(wèn)題的必備技能,對(duì)于芯片驗(yàn)證工程師來(lái)說(shuō)更是如此。調(diào)試通常沒(méi)有固定的章法,不可能按照某一個(gè)流程步驟就可以解決所有的工程問(wèn)題,畢竟在實(shí)際環(huán)境中遇到的問(wèn)題千差萬(wàn)別,可能只是你的某一個(gè)命令參數(shù)敲錯(cuò)了,可能是RTL邏輯設(shè)計(jì)上存在bug,也可能是設(shè)計(jì)規(guī)格(Specification)本身就存在紕漏,等等等等。

盡管調(diào)試方法不固定,但調(diào)試思想還是很一致的,那就是:盡可能的獲取更多的有效信息,并對(duì)這些信息做綜合分析。你細(xì)品,比如最常用的導(dǎo)出仿真日志(log)或者波形文件,這些方法本身就是為了獲取更多的有效信息,這些信息能夠幫助我們更好地去了解現(xiàn)在RTL的功能行為,幫助我們進(jìn)一步對(duì)問(wèn)題進(jìn)行定位。

回到本文主題,本文要介紹的內(nèi)容就是調(diào)試過(guò)程中常用的方法和技巧,這些方法的合理應(yīng)用可以獲得上面說(shuō)的有效信息,從而提高我們解決問(wèn)題的效率。而至于如何做信息的綜合分析,需要根據(jù)具體場(chǎng)景和經(jīng)驗(yàn)才能完成。

方法1:文件和參數(shù)索引的建立

之所以把建立文件和參數(shù)的索引也說(shuō)成是調(diào)試方法,是因?yàn)樵诿鎸?duì)一個(gè)組件繁雜的驗(yàn)證環(huán)境,或者規(guī)模龐大的設(shè)計(jì)的時(shí)候,能夠快速地檢查相對(duì)應(yīng)特性的規(guī)格文件、配置文件、宏定義、類型定義、參數(shù)配置、類原型、函數(shù)原型等信息,極有可能就可以解決掉一些低級(jí)的錯(cuò)誤了。

要快速地找到這些有效信息,一方面依賴于工程師對(duì)當(dāng)前驗(yàn)證環(huán)境和設(shè)計(jì)配置文件的熟悉程度,另一方面可以借助一些工具來(lái)找到它們。后者就是本節(jié)所要介紹的內(nèi)容,下面就直接羅列我工作中最常用的一些工具和命令。

  • 使用ctags掃描工作目錄,建立基于語(yǔ)法元素的索引,配合Vim可以實(shí)現(xiàn)語(yǔ)法元素的快速跳轉(zhuǎn)。
  • 使用meld工具比對(duì)目錄或者文件在不同版本之間的差異,功能比gvimdiff強(qiáng)那么一些。
  • Windows下使用Listary或者Everything軟件來(lái)快速查找本地文件,可以參考《芯片工程師必備軟件神器》。
  • Linux下使用grep命令來(lái)篩查文件內(nèi)容,配合管道符“|”可以實(shí)現(xiàn)更多級(jí)的篩查。
  • 掌握一兩門腳本,Python、Perl、Shell等都可以,掌握正則表達(dá)式,隨手就可以實(shí)現(xiàn)一些小功能。

以上提到的工具和命令,都可以在網(wǎng)上找到大量的教程。如果有時(shí)間,我再寫一些小的使用Tip放到公眾號(hào)上。

方法2:波形的導(dǎo)出和使用

通過(guò)波形可以很直觀地看到RTL隨時(shí)間變化的所有行為細(xì)節(jié),盡管拉波形看信號(hào)變化看多了容易眼睛瞎掉,但不得不承認(rèn)大多數(shù)情況下沒(méi)有波形的話問(wèn)題定位會(huì)變得寸步難行。波形文件是仿真過(guò)程的副產(chǎn)物,它按照一定的格式將每個(gè)仿真事件發(fā)生時(shí)刻的信號(hào)和變量狀態(tài)記錄下來(lái),并最終以圖形化的方式呈現(xiàn)出來(lái)。

圖片

波形文件的格式很多,比如VCD、FSDB、VPD、WLF等等。

  • VCD格式應(yīng)該說(shuō)是最通用的波形格式,它是SV標(biāo)準(zhǔn)中定義的一種ASCII文件格式,其全稱是Value Change Dump。VCD包含了所有信號(hào)的變化信息,它可以被任何EDA調(diào)試工具打開。VCD文件可以在testbench中使用SV的內(nèi)建任務(wù)$dumpfile("name.vcd")$dumpvar()來(lái)導(dǎo)出。
  • FSDB的全稱是Fast Signal Database,它是原來(lái)Novas公司(先被Synopsys收購(gòu))的工具Verdi專用的波形格式。在testbench中,可以使用Verilog PLI接口(可以像調(diào)用內(nèi)建函數(shù)那樣去調(diào)用C/C++函數(shù))調(diào)用$fsdbDumpfile("name.fsdb")$fsdbDumpvars(0, top)去導(dǎo)出。注意,要用著兩個(gè)函數(shù)需要將Verdi安裝目錄中share/PLI下的相關(guān)庫(kù)添加到動(dòng)態(tài)鏈接庫(kù)路徑($LD_LIBRARY_PATH)中,或者有參數(shù)(比如Mentor工具用的-pli)去指定PLI庫(kù)的路徑。
  • VPD是Synopsys自家定義的波形壓縮格式,叫VCD Plus(這個(gè)plus是不是有點(diǎn)似曾相識(shí)的感覺(jué)),在使用Synopsys VCS工具仿真時(shí)可以導(dǎo)出VPD波形,同時(shí)也可以使用使用配套的波形瀏覽器DVE(Discovery Visual Environment)去打開波形。VPD波形可以在testbench中使用$vcdpluson去導(dǎo)出,在VCS做編譯和仿真的時(shí)候需要指定debug能力,比如加參數(shù)-debug_all。
  • WLF的名字就比較單純,叫Wave Log Format,一看就知道是干啥的。WLF格式是Mentor家(現(xiàn)在屬于SIEMENS)定義的,可以由QuestaSim或者M(jìn)odelSim仿真工具可以生成和加載。如果你用ModelSim做過(guò)實(shí)驗(yàn),當(dāng)你打開波形界面,它會(huì)在工作目錄下自動(dòng)生成一個(gè)WLF文件。另外Mentor的工具還可以使用命令選項(xiàng)-qwavedb并附加一串選項(xiàng),可以在仿真過(guò)程中生成仿真數(shù)據(jù)庫(kù)文件(simulation database),該文件以.db為后綴,可以當(dāng)成仿真波形被Visualizer調(diào)試工具打開。

以上提到的函數(shù)調(diào)用在參數(shù)上具有很大靈活性,可以指定具體要dump波形的RTL層級(jí)、scope范圍甚至指定哪些信號(hào)。此外還有其他函數(shù)可以用來(lái)限制波形文件大小、波形dump開關(guān)、導(dǎo)出Memory數(shù)據(jù)等等。

盡管不同格式的波形文件有以上差異,但在應(yīng)用的時(shí)候大部分情況下取決于你有什么EDA工具可以用,另一方面這些波形格式也有工具可以相互轉(zhuǎn)化。

仿真波形在使用的時(shí)候通常有一些技巧,方便問(wèn)題的定位和重現(xiàn),下面列舉幾個(gè)常用的:

  • 將功能相關(guān)的信號(hào)分組(group)放在一起,方便做邏輯或協(xié)議檢查;
  • 可以將多個(gè)信號(hào)組合成總線信號(hào),或者進(jìn)行自定義的邏輯運(yùn)算;
  • 為被關(guān)注的仿真時(shí)刻添加標(biāo)簽(Mark),方便來(lái)回觀看;
  • 通過(guò)添加標(biāo)尺可以查看信號(hào)事件間距、周期信號(hào)頻率、統(tǒng)計(jì)信號(hào)事件等功能;
  • 將常用的狀態(tài)信號(hào)、總線信號(hào)、某個(gè)用例調(diào)試用的信號(hào)等保存成do文件,即將當(dāng)前波形界面的元素保存下來(lái),方便波形重現(xiàn);
  • 每個(gè)人看波形的習(xí)慣和方式會(huì)有不同,找到自己習(xí)慣的方式就可以了;

方法3:仿真日志的導(dǎo)出和使用

仿真日志(常說(shuō)的log文件)通常是我們查看仿真結(jié)果會(huì)首先打開的文件。該文件中可以包含整個(gè)仿真過(guò)程中由編譯器和仿真器打印輸出的各種文本信息,比如當(dāng)前導(dǎo)入了哪些文件、本次編譯和仿真分別用到了哪些參數(shù)、當(dāng)前DUT的頂層是哪一層、仿真過(guò)程中不同時(shí)刻的關(guān)鍵動(dòng)作和信息、本次仿真的結(jié)果和資源開銷等等。

基于文本的仿真日志記錄和對(duì)仿真日志的手動(dòng)分析看起來(lái)是比較低級(jí)和低效的,特別是當(dāng)我們看著仿真日志并順著時(shí)間軸試圖去將打印數(shù)據(jù)和RTL行為關(guān)聯(lián)起來(lái)的時(shí)候,簡(jiǎn)直苦不堪言。盡管如此,仿真日志的導(dǎo)出和使用仍然在某些時(shí)刻起到了基礎(chǔ)性的作用,特別是在UVM將report機(jī)制構(gòu)造健全之后,其作用不可忽視。

SystemVerilog本身在打印信息上有好幾個(gè)任務(wù)可以用:**display, **write, **strobe, **monitor, 這幾個(gè)任務(wù)的使用上不完全相同。

  • 最常用的是**display,**display可以用來(lái)做格式化輸出,格式化方法跟C語(yǔ)言幾乎一致,并且打印完成之后會(huì)自動(dòng)換行。
  • write則用的不多,它的功能跟display很接近,區(qū)別在于在打印完成之后不會(huì)添加換行符,所以適用于想要在一行里輸出多個(gè)信息的場(chǎng)景。
  • strobe的打印就比較講究了,通過(guò)strobe打印的變量值是當(dāng)前仿真時(shí)間槽(time slot)中該變量最后的值,比如對(duì)變量A做非阻塞賦值(<=)之后跟著用strobe打印變量值,打印出來(lái)的是該變量完成賦值之后的值,而如果用display則是打印出來(lái)該變量賦值完全之前的值。
  • monitor的功能就跟它的名字一樣,它相當(dāng)于是在主線程之外開了一個(gè)監(jiān)控線程。當(dāng)通過(guò)monitor打印的變量或者表達(dá)式發(fā)生改變時(shí),打印的功能就會(huì)被觸發(fā),看起來(lái)就像是一個(gè)有了外部中斷能力的$display。

在UVM的框架里,打印信息被賦予了嚴(yán)重性等級(jí)(severity)和冗雜等級(jí)(verbosity),這在信息控制上提供可很大的便利。

Severity分成了INFO、WARNING、ERROR和FATAL,分別使用宏uvm_info、uvm_warning、uvm_error和uvm_fatal來(lái)進(jìn)行信息打印。

Verbosity等級(jí)共分為UVM_NONE、UVM_LOW、UVM_MEDIUM、UVM_HIGH、UVM_FULL、UVM_DEBUG六級(jí),表示信息的冗雜程度由低到高。

  • INFO顧名思義就是簡(jiǎn)單的狀態(tài)信息打印,這些信息并不是必須的,它的verbosity屬性可以通過(guò)uvm_info宏的參數(shù)來(lái)指定。比如當(dāng)仿真的verbosity設(shè)為UVM_DEBUG時(shí),所有uvm_info信息都會(huì)被打印出來(lái),仿真日志會(huì)顯得非常冗雜;當(dāng)仿真的verbosity設(shè)為UVM_NONE的時(shí)候,只有UVM_NONE屬性的uvm_info信息才會(huì)被打印出來(lái),仿真日志就看起來(lái)簡(jiǎn)潔很多。
  • WARNING指的是一些警告信息,提示潛在的問(wèn)題,比如你顯式地調(diào)用了某個(gè)phase,可能不會(huì)影響仿真的繼續(xù),但可能會(huì)讓仿真場(chǎng)景不符合預(yù)期。WARNING的verbosity默認(rèn)都是UVM_NONE,因此始終會(huì)被打印出來(lái)。
  • ERROR就是一些錯(cuò)誤信息,錯(cuò)誤信息的出現(xiàn)不會(huì)使得仿真馬上停止,UVM給我們提供了閾值設(shè)置,當(dāng)錯(cuò)誤信息的數(shù)量達(dá)到某個(gè)值只有仿真就會(huì)自己退出。通常UVM_ERROR的信息被打印出來(lái),我們都需要去把它們都解決掉。ERROR的verbosity等級(jí)默認(rèn)都是UVM_NONE,所以也不要想著用verbosity來(lái)屏蔽它。
  • FATAL就是一些致命的錯(cuò)誤,只要一出現(xiàn)仿真就會(huì)馬上退出,這種問(wèn)題同樣必須解決,不解決你連仿真都跑不完??上攵@類信息同樣verbosity默認(rèn)是UVM_NONE,始終會(huì)被打印出來(lái)。

Verbosity的設(shè)置出了直接用仿真參數(shù)+UVM_VERBOSITY=UVM_DEBUG來(lái)配置,UVM還提供了+uvm_set_verbosity這一非常靈活的參數(shù),具體使用方法這里就不做介紹了。UVM出了這套完備的打印信息控制機(jī)制之外,還提供了很多調(diào)試宏,比如+UVM_CONFIG_DB_TRACE、+UVM_PHASE_TRACE、+UVM_OBJECTION_TRACE等,用來(lái)方便用戶從仿真日志中觀測(cè)配置數(shù)據(jù)庫(kù)(configuration database)狀態(tài)、phase執(zhí)行狀態(tài)和objection狀態(tài)等。

總而言之,信息的打印方法有很多,UVM在report機(jī)制上也給到了足夠的控制手段,利用好這些方法,仿真日志將是我們調(diào)試用例的利器!關(guān)于UVM的議題可以介紹的實(shí)在太多,有時(shí)間再開這一系列的文章。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    3995

    瀏覽量

    133228
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    564

    瀏覽量

    33836
  • BUG
    BUG
    +關(guān)注

    關(guān)注

    0

    文章

    155

    瀏覽量

    15633
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    經(jīng)驗(yàn)分享:查看例程時(shí)出現(xiàn)#ifdef DEBUG debug();#endif

    [table][tr][td] 在查看例程的時(shí)候,經(jīng)常會(huì)發(fā)現(xiàn)如下現(xiàn)象: #ifdef DEBUGdebug(); #endif 知道是作為debug---也就是調(diào)試用的,但是不清楚其具體的表現(xiàn)
    發(fā)表于 07-06 02:19

    STM32的調(diào)試技巧知道哪些

    如何對(duì)STM32進(jìn)行調(diào)試呢?STM32的調(diào)試技巧知道哪些?
    發(fā)表于 10-25 08:25

    關(guān)于5G知道這些,含5G覆蓋查詢方法

    真5G網(wǎng)絡(luò)來(lái)了,但要先知道這些?。ǜ?G覆蓋查詢方法
    的頭像 發(fā)表于 08-27 17:03 ?1.7w次閱讀

    未來(lái)智能家居的這些變化知道嘛?

    未來(lái)智能家居發(fā)展?jié)摿薮?這些變化知道嗎?
    的頭像 發(fā)表于 08-27 17:21 ?3109次閱讀

    關(guān)于變壓器的這些冷知識(shí),知道嗎?

    變壓器的這些冷知識(shí),知道嗎?
    的頭像 發(fā)表于 02-04 15:28 ?4446次閱讀

    STM32F1系列DEBUG調(diào)試功能需要配置嗎?

    STM32F1系列的DEBUG調(diào)試功能需要配置嗎?
    的頭像 發(fā)表于 03-01 13:57 ?3253次閱讀

    淺談STM32調(diào)試DEBUG相關(guān)知識(shí)

    說(shuō)說(shuō)STM32調(diào)試DEBUG相關(guān)知識(shí)
    的頭像 發(fā)表于 03-06 15:23 ?4053次閱讀

    Vivado使用技巧:debug仿真設(shè)計(jì)的三種調(diào)試方法

    源代碼級(jí)別調(diào)試 Vivado Simulator提供了在仿真過(guò)程中debug設(shè)計(jì)的特性,通過(guò)為源代碼添加一些可控制的執(zhí)行條件來(lái)檢查出問(wèn)題的地方??偟膩?lái)說(shuō)有三種調(diào)試方法: 1.使用Ste
    的頭像 發(fā)表于 12-29 15:57 ?1.5w次閱讀
    Vivado使用技巧:<b class='flag-5'>debug</b>仿真設(shè)計(jì)的三種<b class='flag-5'>調(diào)試</b><b class='flag-5'>方法</b>

    示波器的這些安全操作知道嗎?

    示波器的這些安全操作知道嗎?示波器維修。很多人都知道示波器是用來(lái)干什么的,也知道示波器都有哪些種類和品牌,當(dāng)然也
    發(fā)表于 11-05 11:19 ?1623次閱讀

    配置VScode編譯、調(diào)試STM32(二)Cortex-Debug插件

    配置VScode編譯、調(diào)試STM32(二)Cortex-Debug插件
    發(fā)表于 12-01 12:21 ?17次下載
    配置VScode編譯、<b class='flag-5'>調(diào)試</b>STM32(二)Cortex-<b class='flag-5'>Debug</b>插件

    STM32(Cortex-M)內(nèi)核DEBUG調(diào)試接口知識(shí)

    學(xué)習(xí)STM32開發(fā),肯定少不了debug調(diào)試這一步驟。那么,本文帶你了解一下這個(gè)調(diào)試相關(guān)的知識(shí)。
    發(fā)表于 02-08 16:02 ?9次下載
    STM32(Cortex-M)內(nèi)核<b class='flag-5'>DEBUG</b><b class='flag-5'>調(diào)試</b>接口知識(shí)

    hypervisor的調(diào)試分析方法

    我們?cè)诰帉懧銠C(jī)程序(baremetal)、虛擬化管理程序(hypervisor)和操作系統(tǒng)(OS)時(shí),Debug分析程序是必不可少的。不像linux內(nèi)核,有大量的調(diào)試方法,很多裸機(jī)程序、hypervisor沒(méi)有完善的
    的頭像 發(fā)表于 10-08 09:40 ?1354次閱讀

    這些Debug調(diào)試方法知道多少?(上篇)

    在工作日里,如果問(wèn)驗(yàn)證工程師在干嘛,多半時(shí)間他/她會(huì)告訴Debug。換句話說(shuō),一般在驗(yàn)證周期內(nèi),工程師有超過(guò)一半的時(shí)間都消耗在了功能調(diào)試上,盡管這里面包含了驗(yàn)證工程師跟自己“作對(duì)
    的頭像 發(fā)表于 01-21 17:18 ?1470次閱讀
    <b class='flag-5'>這些</b><b class='flag-5'>Debug</b><b class='flag-5'>調(diào)試</b><b class='flag-5'>方法</b><b class='flag-5'>你</b><b class='flag-5'>知道</b>多少?(上篇)

    無(wú)源與有源器件的這些區(qū)別知道嗎?

    無(wú)源與有源器件的這些區(qū)別知道嗎?
    的頭像 發(fā)表于 10-26 15:27 ?4608次閱讀
    無(wú)源與有源器件的<b class='flag-5'>這些</b>區(qū)別<b class='flag-5'>你</b>都<b class='flag-5'>知道</b>嗎?

    這些磁棒電感發(fā)熱解決方法知道幾個(gè)

    這些磁棒電感發(fā)熱解決方法知道幾個(gè) gujing 編輯:谷景電子 磁棒電感在使用中發(fā)熱是比較普遍的問(wèn)題之一,但假如發(fā)熱嚴(yán)重就需要及時(shí)進(jìn)行處理,不然就會(huì)影響到設(shè)備的性能和運(yùn)作。所以,磁棒
    的頭像 發(fā)表于 03-06 22:10 ?331次閱讀