0

我尝试通过更改以下文件中的尖峰 isa 模拟器来扩展尖峰 isa 模拟器中的现有寄存器集,如屏幕截图所示。

riscv-opc.c 中所做的更改

在此之后,我在 riscv.h 中进行了更改

在此处输入图像描述

我还增加了文件 tc-riscv.c 中的寄存器结构长度并更改了 NGPR 的值。

在此之后,我编写了自己的 asm 代码来将数据从源寄存器移动到目标寄存器并打印目标寄存器的值。代码片段附在下面。

    .file   "asm_test.c"
    .section    .rodata
    .align  3
.LC0:
    .string " %d\n"
    .text
    .align  2
    .globl  main
    .type   main, @function
main:
    add sp,sp,-32
    sd  ra,24(sp)
    sd  s0,16(sp)
    add s0,sp,32
    li  a5,5
    sw  a5,-20(s0)
    sw  zero,-24(s0)
    lw  a5,-20(s0)
    sw  a5,-24(s0)
    lw  a1,-24(s0)
    lui p0,%hi(.LC0)
    add a0,p0,%lo(.LC0)
    call    printf
    mv  p0,zero
    mv  a0,p0
    ld  ra,24(sp)
    ld  s0,16(sp)
    add sp,sp,32
    jr  ra
    .size   main, .-main
    .ident  "GCC: (GNU) 5.2.0"

我通过以下命令 riscv64-unknown-elf-gcc -o asm_test asm_test.s 编译了这个 asm 代码

一旦我运行此代码,我就会得到以下分段错误

prashantravi@ubuntu:~/rocket-chip$ 尖峰 riscv/bin/pk asm_test
z 0000000000000000 ra 00000000000105d8 sp 00000000fefff500 gp 000000000001d6d0
tp 00000000000000000 t0 0000000000000001 t1 000000000001d018 t2 0000000000000000
s0 00000000fefffb50 s1 0000000000000000 a0 0000000000000000 a1 00000000fefff3b0
a2 00000000fefff5d0 a3 000000000000000a a4 0000000000002889 a5 000000000001a000
a6 000000000001c6d0 a7 00000000fefff650 s2 00000000000004e0 s3 000000000001c530
s4 00000000000000000 s5 0000000000000000 s6 000000000001bf50 s7 0000000000000000
s8 000000000001a650 s9 0000000000000000 sA 0000000000000000 sB 0000000000000000
t3 00000000000000000 t4 0000000000000000 t5 0000000000000000 t6 0000000000000000
个人计算机 0000000000010478 va 00000000000004e0 insn ffffffff sr 8000000000003008
用户加载段错误@ 0x00000000000004e0

如果我在这里走错了方向,请提供帮助。

4

1 回答 1

1

Ravi,在操作码的二进制格式中没有地方存储寄存器编号 >= 32。每个寄存器在通用 RISC-V 中编码为固定位数:

http://riscv.org/spec/riscv-spec-v2.0.pdf 第 58 页(印刷页码 50)- RV32I 基本指令集之前的表格

1 27 26 25 24 20 19 15 14 12 11 7 6 0
funct7 rs2 rs1 funct3 rd opcode R-type
imm[11:0] rs1 funct3 rd opcode I-type
imm[11:5] rs2 rs1 funct3 imm[4:0] opcode S-type
imm[12|10:5] rs2 rs1 funct3 imm[4:1|11] opcode SB-type
imm[31:12] rd opcode U-type
imm[20|10:1|11|19:12] rd opcode UJ-type

每个寄存器都存储为 5 位:例如 rd 为 [7:11](位 7 8 9 10 11)。每个寄存器号只有 5 位编码,可能的值从 0 到 31。

如果要扩展寄存器空间,则需要重新定义指令编码。您不能为 RV32I/RV64I 这样做,因为 RV32I/RV64I 定义了自己的编码,只有 32 个寄存器。

如果您想以新格式重新定义大量操作码,您将需要更长的编码。您可以尝试使用 48 位或 64 位命令编码来扩展 riscv(http://riscv.org/spec/riscv-spec-v2.0 的“表 9.1:建议的标准 RISC-V 指令编码空间大小”。 pdf),但这项工作是巨大的,而不仅仅是“添加 4 个常量来注册名称数组”。

于 2015-11-02T01:42:55.697 回答