RISC-V MCU中文社区

【分享】 NucleiStudio如何生成.verilog文件和.dasm文件,以及对.dasm文件中自定义指令反汇编结果分析

发表于 全国大学生集成电路创新创业大赛 2023-05-24 21:09:50
1
1764
2

队伍编号:CICC1974
队伍名称:812创新实验小组

硬件设计需要.verilog文件来运行加NICE后的tb仿真、软件组需要.dasm来确定自定义指令有无被正确编译。今天,我们来分享一下NucleiStudio如何生成.verilog文件和.dasm文件,以及对.dasm文件中自定义指令反汇编结果分析。

一、如何生成.verilog和.dasm文件文件

  1. 项目右键选择Properties
    图片alt

  2. 选择C/C++ Build下面的Setting
    图片alt

  3. 更改build的指令
    反汇编:
    riscv-nuclei-elf-objdump -d “${BuildArtifactFileBaseName}.elf” > “${BuildArtifactFileBaseName}.dasm”
    .verilog:
    riscv-nuclei-elf-objcopy -O verilog “${BuildArtifactFileBaseName}.elf” “${BuildArtifactFileBaseName}.verilog”

  4. 删除工程的Debug目录下所有文件(删除的文件不会放到Windows的垃圾箱)
    图片alt

  5. 重新build
    图片alt

  6. build后打开debug目录即可看到我们的.verilog或者.dasm文件
    图片alt

二、如何分析反汇编文件
写了一段非常简单的代码

#include 
#include 
#include 
#include "hbird_sdk_soc.h"
#include 
#include 

int main(void)
{
    matrix_sum_NICE((int)0x800006a4, (int)0x800006b0, (int)0x800006d2);    
}

#include 

__STATIC_FORCEINLINE void matrix_sum_NICE(int addr_ret, int addr_C, int addr_clipval) {
    asm volatile(
        ".insn r 0x7b, 7, 2, %0, %1, %2"
            :"=r"(addr_ret)
            :"r"(addr_C),"r"(addr_clipval)
    );
}

这是它生成的反汇编代码
图片alt
我们要先找到main,这是主程序的入口
图片alt
第一条指令
lui(load upper immediate)是在寄存器左端16位放一个16位数(在指令里面)右端补0
对a5寄存器赋值

第二条指令
将a5的值加1712,成为我们输入的内存地址赋给a4

第三条指令
将a5的值加1746,成为我们输入的内存地址赋给a5

第四条指令
该指令就是我们的自定义指令
可见,这条指令的32位码是02f777fb与书上的编码一致
为:function7 - rs1 - rs2 - function3 - rd - opcode

修改function3为3,发现指令为02f737fb
修改opcode为2,发现指令为04f777fb
修改function7为7f,发现指令为02f777ff

反汇编第一列是命令的存储地址,第二列是存储的值,第三列是翻译的汇编代码
自定义的指令第三列依旧是命令的二进制值

喜欢2
用户评论 (1)
  • 麻麻吉

    2023-10-07 23:10:51 麻麻吉 1#

    注意一下,原文里的双引号是全角的,记得改成英文双引号
    riscv-nuclei-elf-objcopy -O verilog “${BuildArtifactFileBaseName}.elf” “${BuildArtifactFileBaseName}.verilog”

12113004mail

12113004mail 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板