1.信号名称与实际作用不一致:ad_rst命名为高电平复位,实际工作逻辑为低电平复位rstn
这是一种典型的偷懒埋坑行为,容易导致误用,作为开发者现在记得信号的实际作用,但懒得改,过一段时间后如果忘记了,重新进行开发,就会导致错误
2.Simulation时不注意信号正确性,比如要输入一个周期为5ns的时钟,实际输入的是4ns
模拟仿真时忽略细节,会导致有错误未及时发现,导致之后上板调试时出错,调试还非常麻烦 能在模拟仿真时进行debug就在模拟仿真时进行,错误越早发现调试修改的成本就越低 模拟仿真时脑中应该有个预期的逻辑,然后将仿真结果和预期逻辑进行比对,发现错误
3.testbench测试混乱:假如有A,B,C三个模块,建议先测试A,再测试【A,B】(将A的输出作为B的输入),再测试【A,B,C】
学会利用之前的测试结果,假如A模块测试正确,那就可以利用A模块的输出作为B模块的输入,而不是想办法模拟产生B模块的输入,这样会增加测试时间并增加bug的概率
4.时钟定义混乱,一是定义了太多且不需要的时钟,二是有一处需要50M时钟,输入了100M时钟
时钟在顶层模块定义,统一进行管理,最好注释说明每个时钟的用处,避免时钟的使用错误
5.代码逻辑混乱,不符合预期工作逻辑(wr_en,rd_en,dout信号都有不符合预期的现象)
遇到比较复杂的逻辑,就通过任务拆分和模拟仿真调试来不断尝试,在脑中模拟产生想法,然后通过模拟仿真验证,不断优化,直到符合预期工作逻辑
1.学会将复杂任务进行拆分,FPGA设计也拆分成多个模块,每个模块都独立完成一个功能,然后通过顶层模块进行组合,这样设计出来的模块就比较容易复用,也便于维护,也便于进行调试。
2.及时测试,建议每写一个子模块,就对一个子模块进行模拟仿真的测试,不要盲目相信未经过测试的模块的输出,只有经过测试的子模块才是可信的。在子模块输出可信的基础上,可以用前面的子模块的输出作为后面子模块的输入。
3.在开发中,开发者大脑的逻辑清晰和对概念的正确认识是关键,一是写代码前就需要把相关概念弄清楚(通过学习教程,参考别人已经写好的代码是如何处理的,或者自己写过的代码),二是在写代码时,需要把逻辑想明白,想不明白,太复杂了怎么办?解决方法:尝试拆分成子问题;尝试写一点东西,然后进行仿真看是否符合预期,然后再逐步优化;尝试多写文档记录,记录需求,记录思路,记录已有的模块的功能。
4.对于使用AI的建议:AI是一个辅助工具,它可以辅助你进行开发,但不能成为主导;很重要的一点是AI不能代替你的思考,如果你没有做到第3点,大脑里面的逻辑不清晰,在面对复杂的项目时使用AI只会更加让你更加混乱。还有就是,AI给出的每一段代码或每个建议,都一定要进行检验或者测试。如果你大脑比较乱的情况下使用AI,并且不加辨别的使用AI提供的代码,那写出来的东西就是一团乱麻,想debug的话非常困难。但并不是说用AI不好,将AI用做学习和辅助开发的工具能显著提高开发效率和解决问题,关键还是看如何利用好AI。
5.尽量早暴露问题和发现错误,先肉眼排查一遍(结合脑中的逻辑),再模拟仿真测试一遍,确定都没问题了,再上板调试。
本文章使用limfx的vscode插件快速发布