【问题标题】:Tried extending registers in the risc ISA(spike) but getting seg-fault尝试在 risc ISA(spike) 中扩展寄存器,但出现 seg-fault
【发布时间】:2015-10-18 15:34:08
【问题描述】:

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

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

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

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

    .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"

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

运行此代码后,我得到以下分段错误

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

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

【问题讨论】:

    标签: riscv


    【解决方案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(“表 9.1:建议的标准 RISC-V 指令编码空间大小”http://riscv.org/spec/riscv-spec-v2.0.pdf),但这项工作非常庞大,而不仅仅是“将 4 个常量添加到注册名称数组”。

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 2016-04-29
      • 2018-06-30
      • 2020-08-27
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 2023-03-29
      相关资源
      最近更新 更多