如何在 RISC-V Rocket 芯片上正确生成自定义 hex 文件到 运行?

How to correctly generate a custom hex file to run on the RISC-V Rocket-chip?

我一直在尝试使用周期精确的 RISC-V Rocket-chip C++ 模拟器来模拟小型二进制文件(转换为十六进制)。模拟器的构建过程成功,make 运行 生成正确的 test/benchmark 结果。

但是,当我编译自定义源代码并对其进行模拟时,它只是在日志文件中打印了很多 000000...。当然,我检查了那些具有足够循环计数的日志,并且 运行s 没有任何变化。它只是在操作数编号、inst、DASM 等中继续打印 0000.. 而没有停止模拟。一些例外是前几行,见下文。

C0:          0 [0] pc=[00000002000] W[r 0=0000000000000048][0] R[r13=00000000003741c8] R[r28=36f000000000006c] inst=[a3c6f23b] DASM(a3c6f23b)
C0:          1 [0] pc=[00000002000] W[r 0=0000000000000048][0] R[r13=00000000003741c8] R[r28=36f000000000006c] inst=[a3c6f23b] DASM(a3c6f23b)
C0:          2 [0] pc=[00000002000] W[r 0=0000000000000048][0] R[r13=00000000003741c8] R[r28=36f000000000006c] inst=[a3c6f23b] DASM(a3c6f23b)
C0:          3 [0] pc=[00000002000] W[r 0=0000000000000048][0] R[r13=00000000003741c8] R[r28=36f000000000006c] inst=[a3c6f23b] DASM(a3c6f23b)
C0:          4 [0] pc=[00000002000] W[r 0=0000000000000048][0] R[r13=00000000003741c8] R[r28=36f000000000006c] inst=[a3c6f23b] DASM(a3c6f23b)
C0:          5 [0] pc=[00000002000] W[r 0=0000000000000000][0] R[r 0=0000000000000000] R[r 0=0000000000000000] inst=[00000000] DASM(00000000)
repeating the last line 0000....

在模拟过程中,pc 最终增加了,但它仍然打印 0000.. 一遍又一遍,它没有停止。这是我试过的 C 源代码和过程。 (另外,我尝试了许多其他来源。)

int main(){
    int a=0, i;
    for (i=0; i<100; i++){
        a += 1;
    }
    return 0;
}

还有,命令列表。

riscv-unknown-elf-gcc hello.c -o hello
elf2hex 16 16384 hello > hello.hex
emulator-DefaultCPPConfig +dramsim +max-cycles=100000000 +verbose +loadmem=hello.hex none 2> hello.out

我认为模拟器不能正确识别翻译后的十六进制格式。因此,它无法触发正确的指令流。有人可以帮忙吗?

谢谢,

您使用 newlib 编译了您的 hello-world,这需要您 运行 在内核之上。

riscv-unknown-elf-gcc hello.c -o hello
emulator-DefaultCPPConfig +dramsim +max-cycles=100000000 +verbose pk hello 2> hello.out

上面的命令告诉Rocket-chip模拟器加载并执行程序"pk"(代理内核),参数为"hello"。然后 Proxy 内核将加载程序 "hello" 并跳转到其 _start 地址(0x10000)。

如果你想编写自己的裸机 hello world,那么你可以在这里参考这个 SO 答案:

(How can I compile C code to get a bare-metal skeleton of a minimal RISC-V assembly program?)


回答您的具体问题:您需要在您的 $RISCV 安装位置 $RISCV/riscv64-unknown-elf/bin/pk 中找到 "pk",然后生成一个 hex 文件的 pk (pk.hex)。然后你可以把这个hex文件提供给Rocket-chip仿真器。


更多信息:为了解释您看到的输出日志的行为,处理器在 0x2000 处启动。然后它缓存未命中并花费许多周期来获取第一条指令。由于您的 hello world 位于错误的地址 (0x10000),因此处理器只会将“00000000”视为指令。