我正在开发一个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在执行期间不呈现相同的值,因此程序分支到失败例程。
任何人都可以指出哪些指令在我的代码中产生了错误的结果?
干杯
答案 0 :(得分:3)
我在spike中运行相同的程序来比较结果并找到了bug。 LUI和ADDIW指令都缺少32位符号扩展。感谢阅读帖子并提出一些想法的人。
答案 1 :(得分:0)
我认为此代码用于RV64I实现(64位)。
LUI指令符号扩展了RV64I实现,而前两行没有这样做。