我正在尝试使用此链接中的指令在 RISC-V 中创建自定义指令https://nitish2112.github.io/post/adding-instruction-riscv/。但是我无法弄清楚如何访问操作数未指定的寄存器(不是 rd、rs1、rs2)。我计划创建一个“U”类型指令(例如 lui 或 auipc),其中 20 位立即数将携带与我想要使用的寄存器相对应的立即数(我计划让立即数中的每一位指示是否该位对应的寄存器是操作数)。
我还对访问不仅仅是单个 8 字节的数据感兴趣。也就是说,我希望创建一条指令,其中指定的寄存器是 n 个 8 字节数组的基数。或者,我会感兴趣是否有一种方法可以将多个 8 字节保存到堆栈上(使用单个指令)。
我正在尝试在 gem5 模拟器中实现这个(在 arch/riscv/decoder.isa 文件中)。我知道如何在工具链中声明指令,但我在模拟器中定义它时遇到困难。
这是两个不同的问题。我目前也在尝试找出第一个,所以我无法帮助你解决这个。
第二个问题已经在这里得到解答:如何在RISCV指令集中添加新的自定义指令
简要总结必要的步骤:
根据您的操作系统,按照 https://www.gem5.org/documentation/general_docs/building
上的说明安装依赖项$ git clone https://github.com/gem5/gem5.git
打开文件
gem5/src/arch/riscv/isa/decoder.isa
。找到显示以下内容的行:0x3: decode OPCODE5
。添加新行并写入以下内容:
0x3: decode OPCODE5 {
// Add your new instruction code:
<OPCODE>: decode FUNCT3 {
format ROp {
<FUNCT3>: decode FUNCT7 {
<FUNCT7>: <name>({{ <implementation>; }});
}
}
}
// END of your Code
0x00: decode FUNCT3 {
format Load {
....
请将
<opcode>
替换为操作码的十六进制表示形式(位 2-6),将 <FUNCT3>
替换为 FUNCT3 的十六进制值(位 12-14),将 <FUNCT7>
替换为 FUNCT7 的十六进制值(位 25) -31), <name>
是汇编指令的名称,<implementation>
是 CPU 必须执行的实际指令,例如
Rd = Rs1_sd + Rs2_sd
行格式 ROp 将指令的格式定义为 R 类型。
使用以下命令构建 gem5,你就完成了!!
$ scons build/RISCV/gem5.opt
您可以使用以下命令使用 gem5 运行代码:
$ ./build/RISCV/gem5.opt <configuration>
您可能想通过修改不同的参数来更改教程文件夹中 gem5 提供的配置
configs/learning_gem5/part1/simple.py
。例如,更改 system.cpu = RiscvTimingSimpleCPU()
,因为我们要使用 RISCV 指令集,而不是教程中使用的 x86。
请注意,这个答案是在 2024 年写的(当前 gem5 版本为 24.0.0),并且 GEM5 计划每年更新 2-3 次,所以我的答案可能在未来几年内过时。