2015-10-18 152 views
0

我试图通过在屏幕截图所示的以下文件中更改尖峰isa模拟器来扩展现有的注册集在尖峰isa模拟器。试图扩展寄存器risc ISA(尖峰),但得到seg-fault

changes made in riscv-opc.c

在此之后i的riscv.h作出变化

enter image description here

我还增加了寄存器结构的长度在文件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未知的小精灵 - GCC -o asm_test asm_test.s

一次我跑这个代码我得到了以下分段错误

 
[email protected]:~/rocket-chip$ spike riscv/bin/pk asm_test 
z 0000000000000000 ra 00000000000105d8 sp 00000000fefff500 gp 000000000001d6d0 
tp 0000000000000000 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 0000000000000000 s5 0000000000000000 s6 000000000001bf50 s7 0000000000000000 
s8 000000000001a650 s9 0000000000000000 sA 0000000000000000 sB 0000000000000000 
t3 0000000000000000 t4 0000000000000000 t5 0000000000000000 t6 0000000000000000 
pc 0000000000010478 va 00000000000004e0 insn  ffffffff sr 8000000000003008 
User load segfault @ 0x00000000000004e0 

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

回答

1

拉维,存在操作码的二进制格式存储寄存器数> = 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,因为RV32I/RV64I仅使用32个寄存器定义自己的编码。

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