尽管指令匹配的部分早就已经完成,但这并不代表代码方面就不会再检测出漏洞。cpu-test这个测试集文件夹里面的测试代码只是覆盖了一部分内容,即使是全部通过,你的代码也仍有可能是错误的。
当我在处理其他内容时,突然间nemu就卡在了代码某处提示地址错误。重新打开difftest,定位到某处jal跳转发生问题,PC寄存器的参考值和实际值不对应。此时问题就来了:难道是我的指令写的有问题?但是这些都是检验过的指令,为什么会报错?
多次检查之后才发现,原来是补充的J型立即数的符号拓展宏一处代码写错了。本来是BITS(30,21),失误写成了BITS(31,21)。 就是这一处错误,导致nemu遇到这条特殊的jal指令时不能正确拓展立即数,导致最终跳转地址计算错误。而在之前的指令测试环节,测试集里所有的jal指令都很巧的在这个bit上没有出现立即数拓展问题,导致这个问题被掩盖了起来,直到今天才发现并修补。所以,随时做好自己以前写过的代码会被测试环节发掘出新问题的准备。此外,我们也可以意识到,对待一个大工程,测试真的是一个十分重要的环节。比如用来快速定位寄存器问题的difftest,在测试方面做好基础工程真的能省下大量debug时间,节省很多功夫。包括itrace mtrace ftrace dtrace等,早点完成对后续开发有很大帮助。
标签:代码,ysyx,问题,jal,指令,测试,跳转,不够 From: https://www.cnblogs.com/namezhyp/p/18333592