2015-10-18 53 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個常量添加到註冊名稱陣」。