我一直在尝试使用周期精确的RISC-V Rocket-chip C ++仿真器来模拟小型二进制文件(转换为十六进制)。模拟器的构建过程成功, make run 生成正确的测试/基准测试结果。
但是,当我编译自定义源代码并对其进行模拟时,它只是在日志文件中打印了大量的000000 ...当然,我检查了那些具有足够周期数的日志,并且在运行时没有任何变化。它只是在操作数,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
我认为模拟器无法正确识别翻译的十六进制格式。因此,它无法触发正确的指令流。有人可以帮忙吗?
谢谢,
答案 0 :(得分:0)
您使用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仿真器加载并执行带有参数“hello”的程序“pk”(proxy-kernel)。然后代理内核将加载程序“hello”并跳转到其_start
地址(0x10000)。
如果你想写自己的裸机hello世界,那么你可以在这里咨询这个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”,然后为pk生成hex
个文件( pk.hex)。然后,您可以将此hex文件提供给Rocket-chip仿真器。
更多信息:为了解释您看到的输出日志的行为,处理器在0x2000处启动。然后它缓存未命中并需要很多周期来获取第一条指令。由于您的hello世界位于错误的地址(0x10000),因此处理器仅将“00000000”视为指令。