硬核,如何用Verdi進(jìn)行軟硬件協(xié)同調(diào)試HW/SW?
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1導(dǎo)言
今天介紹的工具是Verdi自帶的HW/SW,特點(diǎn)是將匯編語言/C語言/寄存器狀態(tài)/memory狀態(tài)和Verdi的波形同步,便于debug。
越來越多的設(shè)計(jì)包含嵌入式處理器內(nèi)核。這意味著這些設(shè)計(jì)的驗(yàn)證涉及在嵌入式內(nèi)核上運(yùn)行的代碼,通常是開發(fā)系統(tǒng)的一個(gè)組成部分。同樣,測試代碼的開發(fā)通常是整體驗(yàn)證策略的一部分。硬件調(diào)試在硬件級(jí)別工作,硬件狀態(tài)可視化為信號(hào),而嵌入式代碼則以匯編或C級(jí)別編寫。這導(dǎo)致了抽象水平的差距。目前,彌合差距涉及對(duì)嵌入式核心工作的扎實(shí)理解。它通常通過開發(fā)臨時(shí)腳本來完成,以將捕獲的跟蹤數(shù)據(jù)細(xì)化到程序集級(jí)別。回到C級(jí)通常只能通過繁瑣的體力勞動(dòng)來實(shí)現(xiàn)。(官方的介紹)
來點(diǎn)直觀的感受:
左邊是eclipse,分別展現(xiàn)匯編(包含pc,opcode等),C語言,通用寄存器,memory等信息。右側(cè)是Verdi展示的硬件執(zhí)行波形。
波形-匯編-C語言-寄存器-memory完全同步,數(shù)據(jù)對(duì)debug而言一目了然,非常直觀。左側(cè)可以單步執(zhí)行,其他模塊(包括Verdi波形)也同步變化。如果調(diào)試右側(cè)波形,左側(cè)的eclipse信息也是同步變化。
2基本介紹
目前手冊明確說支持的平臺(tái)有RedHat和SUSE。亦安自己使用的平臺(tái):RedHat7.9(64),Verdi2023.12,VCS2023.12。
官方特別支持的核包括ARM的所有核以及部分合作商的核。對(duì)RISC-V架構(gòu)也同樣支持。
如果你使用的是ARM的核,那么就屬于官方支持的架構(gòu)和核,我們只需要指定仿真核的參數(shù),即可生成hwsw.fsdb用于HW/SW仿真。流程如下:
轉(zhuǎn)換流程如下:
轉(zhuǎn)換命令:
hwsw_debug_convert cpuType=Cortex-M3 exeFile=test.elf \ -i tarmac.log -o hwsw.fsdb
hwsw_debug_convert:轉(zhuǎn)換命令
cpuType=Cortex-M3:這個(gè)命令指示的是tarmac.log/cpu.log的格式,對(duì)應(yīng)的是*.pat文件,該文件解釋了log的打印格式。具體tarmac.log格式由vendor決定。*.pat位置在$VERDI_HOME/share/hwsw_debug/patterns。如果是定制化的格式,那么可以自己寫一個(gè)mycpu.pat放入這個(gè)目錄下,然后將轉(zhuǎn)換命令換成:
hwsw_debug_convert cpuType=mycpu exeFile=test.elf \ -i tarmac.log -o hwsw.fsdb
-i tarmac.log:該命令指示的是輸入的log文件,該log文件記錄了仿真時(shí)的各種狀態(tài),例如:
// Cycle : #inst hart pc opcode reg=value ; mnemonic //--------------------------------------------------------------- 24 : #1 0 00000000 595552b7 t0=59555000 ; lui t0,0x59555000 25 : #2 0 00000004 55528293 t0=59555555 ; addi t0,t0,1365 26 : #3 0 00000008 7c029073 ; csrrw zero,csr_7c0,t0 32 : #4 0 0000000c f0044117 sp=f004400c ; auipc sp,0xf0044000 34 : #5 0 00000010 e4410113 sp=f0043e50 ; addi sp,sp,-444 34 : #6 0 00000014 00002805 ra=00000016 ; c.jal 0x44 56 : #7 0 00000044 00007155 sp=f0043d80 ; c.addi16sp -208 57 : #8 0 00000046 0000c786 ; c.swsp ra,0xcc [f0043e4c] 58 : #9 0 00000048 0000c5a2 ; c.swsp s0,0xc8 [f0043e48] 58 : #10 0 0000004a 00000980 s0=f0043e50 ; c.addi4spn s0,0xd0 59 : #11 0 0000004c f00437b7 a5=f0043000 ; lui a5,0xf0043000 62 : #12 0 00000050 f6440713 a4=f0043db4 ; addi a4,s0,-156 62 : #13 0 00000054 e0e7ae23 ; sw a4,-484(a5) [f0042e1c] 63 : #14 0 00000058 f00437b7 a5=f0043000 ; lui a5,0xf0043000 63 : #15 0 0000005c f3440713 a4=f0043d84 ; addi a4,s0,-204 64 : #16 0 00000060 e0e7ac23 ; sw a4,-488(a5) [f0042e18] 64 : #17 0 00000064 f00437b7 a5=f0043000 ; lui a5,0xf0043000 65 : #18 0 00000068 e187a783 a5=f0043d84 ; lw a5,-488(a5) [f0042e18] 65 : #19 0 0000006c f0043737 a4=f0043000 ; lui a4,0xf0043000 66 : #20 0 00000070 e1c72703 a4=f0043db4 ; lw a4,-484(a4) [f0042e1c] 67 : #21 0 00000074 0000c398 ; c.sw a4,0(a5) [f0043d84] 67 : #22 0 00000076 f00437b7 a5=f0043000 ; lui a5,0xf0043000 68 : #23 0 0000007a e187a783 a5=f0043d84 ; lw a5,-488(a5) [f0042e18] 72 : #24 0 0000007e 0007a223 ; sw zero,4(a5) [f0043d88] 72 : #25 0 00000082 f00437b7 a5=f0043000 ; lui a5,0xf0043000 73 : #26 0 00000086 e187a783 a5=f0043d84 ; lw a5,-488(a5) [f0042e18]
對(duì)上面log格式解釋的*.pat的文件如下:
#PARAMETERS: configName=RISC-V32I riscvFixes # Instructions: %CYCLE% :( \#%DEC%)? 0( %PC%)?( %OPCODE%)?( %REGNAME%=%REGDATA%)? ; %DISASM% # ignore //.*
*.pat支持的表述:
-o hwsw.fsdb:這個(gè)命令指示的是輸出的文件。
轉(zhuǎn)換完成后使用:verdi -dbdir sim.daidir -ssf hwsw.vf打開verdi,并打開HW/SW即可實(shí)現(xiàn)硬件軟件同步的仿真。
hwsw.vf是對(duì)兩個(gè)fsdb文件的合并,即design.fsdb和log轉(zhuǎn)換來的hwsw.fsdb。
在nwave里面點(diǎn)擊File/Edit Virtual File合并兩個(gè)文件,即可生成上述的hwsw.vf。如下:
3## DEMO
有些細(xì)節(jié)可能沒有講清楚,這里的關(guān)鍵個(gè)人覺得是生成tarmac.log其他基本沒有技術(shù)含量,手冊里面描述的非常清晰,亦安只是把一些宏觀流程展現(xiàn)給大家,如果還有問題,請參閱Verdi手冊。
官方給了個(gè)RV32的Demo,在$VERDI_HOME/demo/hwsw_debug/veer_riscv這個(gè)demo可以直接跑,感興趣的朋友可以體驗(yàn)一下流程。





