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"

この 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 0000000000000000 t0 0000000000000001 t1 000000000001d018 t2 000000000000000
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 000000000000000
t3 0000000000000000 t4 0000000000000000 t5 0000000000000000 t6 000000000000000
pc 0000000000010478 va 00000000000004e0 insn ffffffff sr 8000000000003008
ユーザー ロード segfault @ 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 は 32 個のレジスタしかない独自のエンコーディングを定義しているため、RV32I/RV64I では実行できません。

新しい形式で多くのオペコードを再定義したい場合は、より長いエンコーディングが必要になります。48 ビットまたは 64 ビットのコマンド エンコーディングで riscv を拡張してみてください ( http://riscv.org/spec/riscv-spec-v2.0の「表 9.1: 推奨される標準 RISC-V 命令エンコーディング スペース サイズ」 pdf ) ですが、この作業は膨大で、「名前配列を登録するために 4 つの定数を追加する」だけではありません。

于 2015-11-02T01:42:55.697 に答える