RISC-V 中访问非操作数寄存器的自定义指令?还访问内存?

问题描述 投票:0回答:1

我正在尝试使用此链接中的指令在 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 gem5
1个回答
0
投票

这是两个不同的问题。我目前也在尝试找出第一个,所以我无法帮助你解决这个。

第二个问题已经在这里得到解答:如何在RISCV指令集中添加新的自定义指令

简要总结必要的步骤:

在GEM5中添加指令

第0步:安装依赖项:

根据您的操作系统,按照 https://www.gem5.org/documentation/general_docs/building

上的说明安装依赖项

第1步:克隆gem5:

$ git clone https://github.com/gem5/gem5.git

第2步:修改gem5 ISA解码器

打开文件

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 类型。

第 2 步:构建自定义 gem5

使用以下命令构建 gem5,你就完成了!!

$ scons build/RISCV/gem5.opt

第3步:执行新指令

您可以使用以下命令使用 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 次,所以我的答案可能在未来几年内过时。

© www.soinside.com 2019 - 2024. All rights reserved.