导言
越来越多的设计包含嵌入式处理器内核。这意味着这些设计的验证涉及在嵌入式内核上运行的代码,通常是开发系统的一个组成部分。同样,测试代码的开发通常是整体验证策略的一部分。硬件调试在硬件级别工作,硬件状态可视化为信号,而嵌入式代码则以汇编或C级别编写。这导致了抽象水平的差距。目前,弥合差距涉及对嵌入式核心工作的扎实理解。它通常通过开发临时脚本来完成,以将捕获的跟踪数据细化到程序集级别。回到C级通常只能通过繁琐的体力劳动来实现。(官方的介绍)
简单来讲HW/SW就是把抽象的硬件仿真和汇编/高级语言进行同步,便于debug。直观的感受:
波形-汇编-C语言-寄存器-memory完全同步,数据对debug而言一目了然,非常直观。
基本介绍
目前手册明确说支持的平台有RedHat和SUSE。亦安自己使用的平台:RedHat7.9(64),Verdi2023.12,VCS2023.12。
官方特别支持的核包括ARM的所有核以及支持RV32/RV64的架构。
如果你使用的是ARM的核,那么就属于官方支持的架构和核,我们只需要指定仿真核的参数,即可生成hwsw.fsdb用于HW/SW仿真。流程如下:
转换流程如下:
转换命令:
hwsw_debug_convert cpuType=Cortex-M3 exeFile=test.elf \
-i tarmac.log -o hwsw.fsdb
hwsw_debug_convert
:转换命令
cpuType=Cortex-M3:
这个命令指示的是tarmac.log的格式,对应的是*.pat
文件,该文件解释了log的打印格式。具体tarmac.log格式由vendor决定。*.pat
位置在$VERDI_HOME/share/hwsw_debug/patterns
。如果是定制化的格式,那么可以自己写一个mycpu.pat放入这个目录下,然后将转换命令换成:
hwsw_debug_convert cpuType=mycpu exeFile=test.elf \
-i tarmac.log -o hwsw.fsdb
-i tarmac.log
:该命令指示的是输入的log文件,该log文件记录了仿真时的各种状态,例如:
// 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]
对上面log解释的*.pat的文件如下:
#PARAMETERS: configName=RISC-V32I riscvFixes
# Instructions:
%CYCLE% :( \#%DEC%)? 0( %PC%)?( %OPCODE%)?( %REGNAME%=%REGDATA%)? ; %DISASM%
# ignore
//.*
*.pat支持的表述:
-o hwsw.fsdb
:这个命令指示的是输出的文件。
转换完成后使用:verdi -dbdir sim.daidir -ssf hwsw.vf
打开verdi,并打开HW/SW即可实现硬件软件同步的仿真。
hwsw.vf
是对两个fsdb文件的合并,即design.fsdb
和log转换来的hwsw.fsdb
。
在nwave里面点击File/Edit Virtual File合并两个文件,即可生成上述的hwsw.vf。如下:
## DEMO
有些细节可能没有讲清楚,这里的关键个人觉得是生成tarmac.log其他基本没有技术含量,手册里面描述的非常清晰,亦安只是把一些宏观流程展现给大家,如果还有问题,请参阅Verdi手册。
官方给了个RV32的Demo,在$VERDI_HOME/demo/hwsw_debug/veer_riscv
这个demo可以直接跑,感兴趣的朋友可以体验一下流程。
欢迎我关注GZH:亦安的数字小站