第一个阶段:除掉所有的语法错误
- 刚开始在文件夹里加了我的CPU文件但是在工程里面没添加,然后报错:找不到你的的CPU
- IP核没更新到最新版本,由于我的是2019.2的vivado,但用的是2019.1的工程和IP核,所以打开工程时IP核都上着锁。解决办法是:Reports->Report IP Status;然后点击upgrade->OK
- 报错:
[VRFC 10-3180] cannot find port 'en_exception_pc' on this module ["C:/Users/dell/Desktop/nscscc2019_release_v0.01/func_test_v0.01/soc_sram_func/rtl/myCPU/mycpu_top.v":429]
知道是端口的问题,但是改了,没用,倒腾了好久,后来发现是改了之前写的代码,没有改拷贝到工程文件夹下的代码,冤。
报的那两个端口错误,一个是真的接口不对,上下接口不一致——设计有点不一致;另一个是拼写错误en_exception_pc写成了en_excption_pc
错误弄完了,出现了仿真的图片,根据现在的情况,看来我要进行调出绿线的尝试了
第二个阶段:调出绿线
初始状态:

- 绿线问过同学,同学讲要点run,就是那个灰色的右箭头,或者run 10ns,点了果然就出来了。好了今天的任务目的算是达到了……
第三个阶段:调出trace对比机制
- 这里没有什么对比,出来就是刷屏的时间和pc。如何调出有正常的log呢?看mycpu_tb.v
$fscanf(文件指针,读取格式,数组);
display,write用于信息的显示和输出。
display与write的区别是:display会在每次显示信息后自动换行,write不会换行。
- 图中信号无法在波形图中显示,使用“add to wave”:在箭头所指框框内右键,就有这个命令。可以把所浏览的模块的信号添加到左数第三个列表内。此时,点击图线即可观察信号情况。

- 很多线都不是绿色的,蓝线是高阻态,同学说要赋初值,经观察,这些信号之所以呈现高阻态是因为只有一端和信号端口连接,这些信号要么没用,要么需要重新连接,要么是接口信号宽度不对。
- 以上的东西改完了,目前目测没有高阻态了,但是还有好多X,这些X应该是没用到的变量。很奇怪的是有的变量先是变绿了,后又变成X态了,留作之后考虑。这个标号要踩的坑是:

为什么pc一拍取一个,inst却是有三拍才能取到的呢?——后面也有可以一拍取到的。
而且发现有的pc也是持续了两拍,目测可能和跳转指令有关
第一版的图形:

可以看出框出来的这四个变量相等,而它们本不该相等
观察代码:

猜测是stall未赋初值的缘故,赋初值:

再次运行,那四个值不相等了。
然后继续解决那个指令持续三拍的问题:
尝试把flush也赋上初值,收效甚微,但是我无意中看到了inst_sram_rdata,这个原始一点的信号:

可以看出取指没问题,有问题的是电路,一定有什么东西使它延迟了一拍。
最是套路得人心,我现在,欠的债总要还,路还得自己体验,这个居然是取指也要提前准备出来地址,它也得晚一拍。之前问大佬的时候早就知道数据存储器是这样的,另一个大佬讲指令存储器不用晚一拍。现在我死了,调试了好久,找了两小时原因,居然是这个。

目前它正确了,并且目测那些奇怪的“指令也持续好几拍的情况”也没了。
但是仍旧没有能出现trace对比机制,从tb中了解到和trace答案出现有关的信号是最后一级的写使能,排查写使能信号,发现wb级代码错误——一个宏定义写错了,改正后虽然debug_wb_rf_wen出来了,但是出现了另一个错误:在tb中的finish出现了一个错误。

哦,我明白了,这是trace出来了,虽然不知道错误是什么

在finish处暂停了:退出模拟并将控制权交还给操作系统。
由tb代码可知,这里是每当有错误就会停止。
- 往前推进了一点,大概是六条指令的样子。现在是早上六点四十,看来早睡早起对我是有好处的,昨晚调不出来的时候应该睡觉。
错误原因是
下面展示一些内联代码片。
assign inst_sram_en = resetn ? 1'b1 : 1'b0;
这句代码片的冒号左右写反了。
第四阶段:各种调试
- 既然第一步已经走出来了,说明剩下的只需要慢慢调了,以下的步骤均在说明调试中出现的问题
- 遇到ori指令,经分析,译码没有问题,取数据和立即数都没问题,而出现算数错误,考虑在该算数代码模块寻找,发现是extend_unsigned和flag_unsigned写串了,而且符号扩展被我写成了1扩展。
[ 2287 ns] Error!!!
reference: PC = 0x9fc05100, wb_rf_wnum = 0x10, wb_rf_wdata = 0x00000001
mycpu : PC = 0x9fc00704, wb_rf_wnum = 0x1f, wb_rf_wdata = 0x9fc0070c
猜测是一个组合型的错误:跳转计算和地址错误处理。
以上猜测正确性好像不太对:

现发现,应该是以下跳转的问题:


不管之后结果怎样,我现在发现这里少了个default:

不知道是不是必须的,先试试:

好的,从七点半到十点半,又往前推进了一点点
4. 来解决上面那个新的问题:
搞不好将来只剩几秒钟了
ps:在这个调试过程中我逐渐熟悉了vivado,有时间要把vivado的使用小技巧写一写。不过还是有点东西不太方便,我还要再加油。
出错的图是这样的:

本文详细记录了在Vivado环境下使用FPGA进行调试的过程,包括解决语法错误、调出绿线、处理trace对比机制及各类调试技巧。作者分享了从发现问题到定位问题,再到解决问题的全过程,涵盖了端口问题、信号位数不匹配、冒险处理、异常处理等多个方面。

2581

被折叠的 条评论
为什么被折叠?



