我正在寻求关于我试图添加到riscv的扩展的帮助。
全局设置
我的工作基线是存储库的克隆,它包含了常用的工具,其中包括:
注:我克隆的最后一次提交是c6d58cecb3862deb742e1a5cc9d1c682f2c50ba9 (2018-04-24).
我的工作基于一个riscv32-ima核心。我想在处理器的ISA中添加一条指令,它将激活处理器中的一个特定组件。
从proc本身的行为来看,我没有问题:我修改了spike,我的指令(以及我添加到处理器中的组件)工作得非常好。
在汇编程序中,该指令如下所示:
addi a0, a0, 0
... // other code
setupcomp // activate my component ...
... // other code确保这个指令没有任何操作数。
我所做的
我躲了一会儿,发现了本教程,它有点老了.
因此,我:
riscv-tools/riscv-opcodes/opcode及其掩码添加到riscv-tools/riscv-opcodes/opcodes中。我的看上去像这样:
setupcomp 31..28=ignore 27..20=ignore 19..15=ignore 14..12=0 11..7=ignore 6..2=0x1a 1..0=3.h文件:
制造安装stucts添加到riscv-tools/riscv-gnu-toolchain/riscv-binutils-gdb/include/opcode/riscv-opc.h中,并正式声明该指令:
#定义MATCH_SETUPCOMP 0x6b #定义MASK_SETUPCOMP 0x707f DECLARE_INSN(setupcomp,MATCH_SETUPCOMP,MASK_SETUPCOMP)
这些值,是从操作码项目中生成的。riscv-tools/riscv-gnu-toolchain/riscv-binutils-gdb/opcodes/riscv-opc.c:
{"setupcomp“、"I”、"“、MATCH_SETUPCOMP、MASK_SETUPCOMP、match_opcode、0 },现在,到现在为止,我相信我已经做了一切必要的事情。我仍然对我想要的操作码有疑问,但我不相信这对我观察到的行为和我现在描述的行为有影响。
我有问题
当我使用riscv-tools/build-rv32ima.sh script构建所有东西时,流程接近尾声(我相信某种类似于测试套件的东西),我会收到一条抱怨的消息:
Assembler messages:
Error: internal: bad RISC-V opcode (bits 0xffffffffffff8f80 undefined): setupcomp
Fatal error: Broken assembler. No assembly attempted.
make[6]: *** [lib_a-dummy.o] Error 1我想我在指令的声明中遗漏了一些东西,可能这个声明没有被正确地“转发”到实际需要它的工具链的每个部分。但是我找不到在哪里/什么/如何/什么时候--我非常感谢在这方面的任何投入。
当然,我很可能遗漏了一些显而易见的东西,所以温柔点:)
发布于 2018-10-14 23:41:03
将自定义指令添加到工具链的最佳选择是使用我们的.insn汇编程序指令。虽然这并没有给您提供很好的语法(您需要使用预处理器宏或C包装函数),但它确实让您避免接触工具链,因为这充满了问题。
这方面最好的文档是.insn。基本上,用户可以发出RISC-V ISA手册定义的任何格式的指令,并提供直接填写每一位模式的选项。这与GCC的内联装配寄存器分配框架整合得很干净,就像任何其他指令一样。
发布于 2019-06-20 09:09:21
只需运行以下命令来解析掩码/匹配:
cat opcodes-pseudo opcodes opcodes-rvc opcodes-rvc-pseudo opcodes-custom | ./parse-opcodes -c > ~/temp.h它给你正确的掩码和匹配的riscv-gnu-toolchain/riscv-binutils-gdb/include/opcode/riscv-opc.h现在重新编译,你已经做了!
发布于 2019-07-05 06:43:30
正如Domso所说,riscv-opc.c似乎需要显式地屏蔽不属于参数的每一点。但是,如果在您的ignore文件中将位设置为opcodes,则parse-opcodes生成的掩码将不会设置这些位。实际上,这就是您想要的,因为掩码应该表明set位是操作码的一部分。
由于fence.i使用被忽略的位,所以可以通过查看其定义方式来推断如何处理被忽略的位:
在riscv-opc.h中,MASK_FENCE_I只是由parse-opcodes生成的掩码。
#define MATCH_FENCE_I 0x100f
#define MASK_FENCE_I 0x707f这个掩码是给DECLARE_INSN的,没有改变:
DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I)但是在riscv-opc.c中,被忽略的位使用按位或。
{"fence.i", "I", "", MATCH_FENCE_I, MASK_FENCE | MASK_RD | MASK_RS1 | MASK_IMM, match_opcode, 0 }因为fence.i不使用任何参数,所以这相当于
{"fence.i", "I", "", 0xFFFFFFFF, match_opcode, 0 }因此,您可能应该保持MASK_SETUPCOMP的原样,这样就可以将它提供给DECLARE_INSN,但将riscv-opc.c中的掩码设置为0xFFFFFFFF。另外,由于MASK_SETUPCOMP是由make install在一堆头文件中复制的,所以最好保持它们的一致性。
https://stackoverflow.com/questions/51825942
复制相似问题