如何在 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”视为指令。
我一直在尝试使用周期精确的 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”视为指令。