RiscV ISS 实现中的错误
mistakes in a RiscV ISS implementation
我正在开发一个 RiscV ISS,当我 运行 验证套件时,我在添加指令时遇到错误。我确定了这部分代码的问题(在执行期间将状态注册为注释):
lui ra,0x80000 ;; ra = 0x80000000
lui sp,0xffff8 ;; sp = 0xffff8000
add t5,ra,sp ;; t5 = 0x17fff8000
lui t4,0xffff0 ;; t4 = 0xffff0000
addiw t4,t4,-1 ;; t4 = 0xfffeffff
slli t4,t4,0xf ;; t4 = 0x7fff7fff8000
li gp,7 ;; gp = 7
bne t5,t4,800005f0 <fail> ;; The program branches to fail :(
显然,寄存器 t5 和 t4 在执行期间不呈现相同的值,因此,程序分支到失败例程。
任何人都可以指出哪些指令 is/are 在我的代码中产生了错误的结果吗?
干杯
我运行同一个程序在秒杀中比较结果,发现了bug。
LUI 和 ADDIW 指令都缺少 32 位符号扩展。感谢阅读 post 并提出一些想法的人。
我认为此代码适用于 RV64I 实现(64 位)。
LUI 指令符号扩展到您在前两行中未完成的 RV64I 实现。
我正在开发一个 RiscV ISS,当我 运行 验证套件时,我在添加指令时遇到错误。我确定了这部分代码的问题(在执行期间将状态注册为注释):
lui ra,0x80000 ;; ra = 0x80000000
lui sp,0xffff8 ;; sp = 0xffff8000
add t5,ra,sp ;; t5 = 0x17fff8000
lui t4,0xffff0 ;; t4 = 0xffff0000
addiw t4,t4,-1 ;; t4 = 0xfffeffff
slli t4,t4,0xf ;; t4 = 0x7fff7fff8000
li gp,7 ;; gp = 7
bne t5,t4,800005f0 <fail> ;; The program branches to fail :(
显然,寄存器 t5 和 t4 在执行期间不呈现相同的值,因此,程序分支到失败例程。
任何人都可以指出哪些指令 is/are 在我的代码中产生了错误的结果吗?
干杯
我运行同一个程序在秒杀中比较结果,发现了bug。 LUI 和 ADDIW 指令都缺少 32 位符号扩展。感谢阅读 post 并提出一些想法的人。
我认为此代码适用于 RV64I 实现(64 位)。
LUI 指令符号扩展到您在前两行中未完成的 RV64I 实现。