Verdi软硬件调试HWSW

导言

越来越多的设计包含嵌入式处理器内核。这意味着这些设计的验证涉及在嵌入式内核上运行的代码,通常是开发系统的一个组成部分。同样,测试代码的开发通常是整体验证策略的一部分。硬件调试在硬件级别工作,硬件状态可视化为信号,而嵌入式代码则以汇编或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:亦安的数字小站

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值