一生一芯f6 debug艰难历程


电路长的不好看

电路搭搭挺快的,虽然有点丑。

长得好看的电路一般是两个思路,一是用网络标签,二是用子电路,可惜两个一个都没用。

没用网络标签是因为感觉网络标签一多排错时候找起来也不方便,子电路用的不多是因为一开始画了w_ctrl这个子电路,直接打乱了整个布局,后面很多逻辑部分直接共用了。如果电路要再简洁,应该把逻辑部分和写控制做进一个子电路里面,一一对应。

最终设计

连线复杂其实不是排错复杂的罪魁祸首,即使连线不复杂也排不出来。

这是不是bug?

搭完电路运行了mem和sum测试用例都能正常通过,于是兴致勃勃开始跑vga测试用例,诶也能正常跑,但是跑一半卡死了,并且执行周期远超预计的628000。

一开始其实也怀疑指令集有问题,但是考虑还是能正常跑的,最后不放心还是让ai写了几个测试指令集单个指令的demo,都能正常通过。

所有是不是bug呢?

记录PC值

决定使用一个ram记录下执行期间每个周期的PC值,然后把前几千周期扔给ai,让他根据我上传的hex和反汇编文件猜测正确执行结果然后分析。叽里咕噜分析了一大通,后面在bne函数里面兜兜转转的问题是分析出来了,怎么进去的说了一堆我也没办法验证(事实证明ai分析的也是错的)。

当务之急是找到办法获得正确的指令执行顺序。

一开始求助了做过DLCO实验的同学,他们的模拟器虽然功能非常完备,但是外设定义不一样,跑不了我们的程序。然后试图使用他们的RARS模拟器,但是模拟器并不支持直接运行hex文件,并且汇编代码需要手动写内存,也只好作罢。

最后花了亿点点时间找到了能正确执行的模拟器(我发誓我没有抄作业),然后用同样的方法获得了各个执行周期的正确PC值,对比分析。

打上断点

为了对比分析为什么从某个点开始跳转错误,于是通过比较器输出结果和时钟信号做与运算的办法给CPU打上了断点,然后检查断点处寄存器值,将不一样的地方扔给ai,分析上一步出错在哪里,最后定位到e84之前的几步sb指令,高位读入了错误的数据。

奇妙的MUX

奇妙的MUX

注意看这个MUX,在输入1000并选通的时候,居然输出了EE00,然后断开控制信号和输出信号,发现控制信号居然还能输出1,输出信号依然是EE00。

这个问题误导了我和答疑群里的大佬好一会,实际原因是仿真暂停的情况下,端口状态不会实时更新,并不代表这些端口还有输出能力。

答疑群里大佬突然提醒我检查一下RAM下面有没有藏起来的线,我草!

我草

省流:断开了就全部正常了。

为什么之前所有的测试用例都正常

我不理解!(奉化口音)

总之机器永远是对的!


文章作者: tukwhy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 tukwhy !
  目录