前言
FPGA开发的最终目的是能够实现预期稳定的功能,这是设计的目的,保证逻辑有效的源头可以说一个设计问题,而保证设计的正确性需要对自己的硬件逻辑设计进行调试,调试的方式常常有两种:
仿真 硬件调试这里的仿真,一般指的就是行为仿真,暂时不考虑时序,但并不是可以不关注时序去设计,我的意思是假设时序可以通过的情况下,考虑功能性的问题,这是有区别的。
逻辑的设计过程,首先要时时刻刻把时序考虑在内,这和经验有关,需要不断积累。 行为仿真可以帮你最终的上板调试扫除大部分的BUG,不仅如此,上板调试的过程中,也会需要行为仿真的参与,用仿真的方式去模拟自己故障发生的条件,是不是存在仿真用例没有遍历的地方。
硬件调试一般指的是上板调试,测试自己的逻辑设计在实际的运行环境中是否预期稳定工作,这是设计的最终目的,这是工程师的目的(和销售的目的有所区别,工程师比较习惯考虑设计的功能,稳定预期运行的设计才是令工程师最开心的)。
仿真
稍微大型或复杂一点的逻辑的设计以及编译过程要花费大量的时间,所以充分的仿真是必须的也是最值得做的一件事。
充分的仿真是提高逻辑可靠性的保证。
如何仿真呢?或者仿真什么呢?
一方面,仿真需要看设计的逻辑是否按预期运行,随便举个简单例子,我内部的一个模块是否按预期运行,还或者我设计的一个计数器是否按预期运行,在各种状态,各种情况下是否都能如期运行(逻辑设计中常常存在在不同的情况下模块运行不符合预期的情况,要考虑一种情况运行完之后,让模块恢复或保持一个特定状态,作为下一次运行的起点)。
另一方面,FPGA经常需要与外部设备进行通信,这些外部设备需要对仿真逻辑和测试设计者做出反应,就像它们存在于硬件中一样。
因此,对于那些需要与外部设备交互的FPGA设计的模块,仿真需要为数字逻辑以及需要与之交互的每个外部组件提供一个外部组件仿真器和接口验证器。组件仿真器,我指的是创建输入和处理输出的东西,就像真实的硬件组件那样。接口验证器,我指的是能迅速引起开发者对接口协议中任何违规行为的注意的东西。
这意味着,我对任何仿真能力的最低要求是能够仿真我设计中的所有外部元件。
你的设计中是否有一个UART?那么你的仿真应该能够模拟UART。你的设计应该能够创建一个UART波形,而你的外部设备仿真器应该能够处理它,并可能将结果放在你的仿真终端上。你应该能够在仿真终端上输入任何东西,并将其发送到你的外部UART仿真器上。然后,外部组件模拟器应该翻译它所读取的任何东西,并将其作为适当的UART信号发送到你的设计中。
你的设计中是否有一个Flash组件?作为仿真的一部分,你应该能够启动、擦除、编程并从Flash中读取。
你的设计是否包括按钮或开关?你应该能够仿真按钮和开关,而且你的仿真应该足够好,能够测试你可能具有的任何情况。
你的设计内有一个SD卡吗?你应该能够与仿真的SD卡进行通信,甚至有一个仿真的SD卡可以与你希望在设计中使用的SD卡相匹配。
你的设计中是否有一个VGA?你的仿真应该能够解码你的VGA输出,以证明你产生了正确的同步信号,然后将像素画到屏幕上,你可以验证你的VGA代码是否工作。
你的设计有EDID成分吗?你的仿真器应该能够通过一个适当的I2C端口将EDID信息传达给你的设计。
您的设计中是否有(DDRx)SDRAM?你的仿真器应该能够以时钟的方式匹配SDRAM的能力。你甚至可能希望对任何DDR3 SDRAM进行详细的调试。
你的设计中是否有一个CPU?你的仿真器应该能够模拟CPU,它的启动过程(使用flash,如果你有的话),它应该允许你看到CPU启动时的内部情况。你应该能够跟踪CPU执行的指令,以及你设计中使用的任何逻辑。你想在你的CPU上运行一个程序吗?你应该能够在CPU中做到这一点,而且它应该能够以类似于真实环境的方式与环境互动。
看到这些,是否觉得仿真真的是一门需要下功夫的学问,任重而道远,你仿真的越精细,你的设计就会越完美。
硬件测试
我也没有天真到相信一个设计第一次被下载在实际的FPGA中就会工作。出于这个原因,我坚信在实际的硬件上进行测试也是很重要的。
硬件测试包括组件测试,以及综合设计测试。
使用你的硬件,你应该能够通过以下方式测试组件。
向它们发布个别命令,并验证个别互动是否有效
然后发出更复杂的命令串
在这两种情况下,你应该能够从一个(大致)已知的条件开始,命令硬件开始测试,然后能够测量测试的结果。这样做需要某种形式的内部逻辑分析器。
赛灵思将其集成逻辑分析仪(ILA)作为Vivado设计套件的一部分,或者是更古老的ISE的Chipscope,这些都是必要的调试工具,不同厂家会提供这些内部逻辑分析仪供你进行硬件测试。
硬件调试的过程中可能会遇到一些BUG,对于很多bug,如果你的设计是可综合的,那么通过仿真就可以解决大部分问题,对于前期仿真没有仿真到的bug,硬件调试时,还可以通过模拟手动操作,仿真复现故障,这也是解决问题的一个手段。
但如果仿真确实没问题,你应该考虑仿真条件是否真实还原手动硬件调试的操作,还或者是硬件设计的问题,使用了仿真可以通过,但是实际却不允许的逻辑,还或者是时序出了问题,检查自己的约束吧。
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:FPGA的设计艺术(30)FPGA硬件逻辑调试刍论 https://www.yhzz.com.cn/a/12149.html