如何在硬件中进行有效地调试
扫描二维码
随时随地手机看文章
最有趣的行业统计数据之一是,84%的FPGA设计至少存在一个错误。
当然,我们可以尝试通过遵循良好的FPGA开发过程来减少这种情况,从而实现结构化方法。这样的方法可以完成高质量的设计。通常,该开发过程将包含几个不同的阶段、过程和审查,以执行结构化方法,包括:
•系统需求评审——评审系统需求和验证方法,以及符合/不符合矩阵。
•初步设计评审——根据要求对建筑设计进行评审,以确保满足要求。审查架构的可行性和技术风险。
•关键设计评审——根据需求和体系结构评审已实现的设计及其验证包、仿真和定时关闭/实现报告。
遵循这个过程,当然,需要审查阶段的检查表和与供应商规则一致的优秀编码/设计指南,例如超快编码方法。
一旦FPGA设计完成,项目离完成还有很长的路要走。
设计必须集成到硬件中,与现实世界的传感器、执行器、驱动器和应用软件接口。
在此阶段,在产品发布之前,有几个技术挑战/风险可能导致需要在硬件上执行调试。
在硬件上进行调试需要能够理解逻辑设计、应用软件和现实世界之间的交互——不幸的是,有时现实世界与验证设计的方式是不同的——例如,不同的时序、操作模式或意想不到的硬件/软件交互。
当这种情况发生时,我们需要能够找到问题的根本原因并采取纠正措施。在集成过程中发现的任何东西都应该反馈到模拟中,以确保未来的产品更新/回归测试不会忘记实验室的惨痛教训。
为了做到这一点,作为工程师,我们有几个工具-从简单的万用表测量电压和电流,到逻辑分析仪/模式发生器和示波器。
然而,有时我们想要内部查看我们的SoC/FPGA,以了解IP核或嵌入式硬核和软核处理器之间的交互。
AMD ChipScope是集成到Vivado设计套件中的片上调试和验证工具包。它使开发人员能够实时观察,捕获FPGA或SoC设计的内部信号并与之交互,而无需外部探针或逻辑分析仪。
ChipScope工具包的关键要素之一是集成逻辑分析仪。
什么是ILA
集成逻辑分析仪(ILA)是嵌入在AMD fpga和soc中的硬件调试工具,允许工程师捕获和分析内部数字信号。
ILA提供实时硬件调试功能,允许用户设置触发条件并直接在FPGA结构上捕获信号数据。ILA能够捕获具有一系列接口定义的信号,从简单的逻辑信号和矢量到AXI和AXI流接口。
System ILA是一个增强版本,可以跨多个接口和时钟域进行更全面的系统级调试。它提供监视AXI接口、内存控制器和其他系统互连的功能。
与基本ILA相比,系统ILA可以捕获更长的跟踪缓冲区,支持更复杂的触发条件,并同时监视更多数量的信号。这使得它对于调试复杂的片上系统(SoC)设计特别有价值,其中多个组件通过不同的接口和协议相互交互。
调试方法
在调试应用程序时,我们需要采用逻辑方法。因此,在使用System ILA或ILA时,我们应该理解FPGA设计是一个迭代过程,如果我们从逻辑上解决问题,这是最成功的。
最好的方法是:
•把问题分解成更小的部分
•通过减少变量和变化来简化
•做一个预测,然后验证结果
•在设计周期的早期计划如何以及在哪里进行调试
插装方法
当在实际设计中使用集成逻辑分析仪(ILA)时,重要的是要有策略地使用仪器来平衡调试可见性和FPGA资源使用。
ILAs消耗逻辑和块RAM,这在已经接近容量的设备中成为一个关键问题。
捕获深度和被监测信号的宽度直接影响BRAM的使用——更宽的探针和更长的捕获窗口会迅速耗尽可用内存。
在早期的版本中,遵循上面概述的方法,重点关注关键控制信号、重置线和状态或错误指示器,因为这些通常提供对系统行为的直接洞察,并帮助在调试周期的早期识别问题。
系统内的关键AXI总线,特别是那些最接近处理系统接口的总线,如Zynq UltraScale+ mpsoc上的M_AXI_HPM_FPD(高性能主)和S_AXI_HP_FPD(高性能从),也应该考虑用于仪器仪表。
虽然这些宽总线是资源密集型的,但它们承载着可编程逻辑和处理系统之间的基本流量,并且可以揭示数据处理和系统集成中的微妙问题。
从精心选择的控制、复位、状态/错误和这些关键AXI接口的混合开始,在适当的捕获深度提供了对系统级行为的有价值的可见性,同时为迭代调试改进保留了空间。
演示项目
为了演示如何在FPGA设计中利用ila提供的功能,我们将创建一个简单的演示项目。
该项目将针对安富利ZU板,并连接到Digilent ZMod AWG以生成简单的模拟输出。
在这个项目中,我将使用两种不同的ILA来帮助确保正确的操作。
•ILA -用于监控时钟向导锁定信号、DAC初始化信号和DAC错误信号
•系统ILA -监控系统中的AXI和AXI流数据
第一步是创建一个新项目。如果未安装ZU板,则使用Vivado中的Boards选项卡下载。
一旦创建了项目,下一步就是创建Vivado设计。要做到这一点,第一步是创建一个块设计。
随着块设计的开放,添加Zynq UltraScale+ MPSoC处理系统。
运行块自动化配置处理系统为ZU板定义。
在配置了处理系统之后,我们可以从Vivado库中添加ZMod AWG控制器。
双击IP并选择“将IP添加到块设计”。
ZMod AWG需要一个轴流输入,而处理系统有一个AXI4输出。然而,Vivado能够实现必要的内存映射到流转换架构。连接ZMod AWG输入数据流端口到处理系统的h0 - fpd端口。
这将打开一个连接自动化对话框。对于时钟,从处理系统中选择100 MHz输出时钟。
这将生成如下图所示的图表。将系统时钟连接到与DAC I/O时钟相同的时钟,因为两者都将处于100 MHz。
重新定义轴流FIFO并取消启用传输控制选项。
添加一个新的时钟向导并按如下所示进行配置;我们想要一个100 MHz的输出偏移距输入90度。
如图所示,将时钟连接到ZMod AWG的DAC CLK输入端。
连接复位。
增加一个常数块设置为DAC使能的逻辑高。
添加一个常数块设置为逻辑低禁用测试模式。
除了ZMod AWG块上的顶部两个端口,并将它们标记为外部。
添加系统ILA;我们将使用它来监视系统中的AXI和axis - stream数据。
按如下方式配置System ILA属性;启用其触发输入和输出端口。这将使我们能够与Vitis Unified的软件开发进行交叉探索。
0号槽位保持当前配置不变。
改变槽1的属性来监控轴流。
如下所示连接System ILA插槽0和插槽1,以及时钟和复位。
重新定制处理系统以禁用HPM1,并启用PS到PL和PL到PS的交叉触发。这种交叉触发允许ILA和Vitis Unified环境相互触发。
输出触发是指在Vitis中遇到断点时,也可以同时触发所连接的ILA,以观察断点触发时硬件的行为。
输入触发是指当ILA到达它的触发器时,处理器上的软件执行也停止,使得软件的状态也可以被观察到。
如图所示连接Trigger端口。
添加一个ILA;我们将用它来监测设计中的一些简单的逻辑信号。
用三个输入探针配置ILA,如下所示。
如下所示连接ILA;我们将监视时钟向导锁定信号,DAC初始化信号和DAC错误信号。
最终的设计应该如下所示。
验证设计,创建包装器,并使用下面提供的XDC文件构建比特流。
HW设置
确保硬件设置如下所示,将ZU板通过PL HSIO端口连接到ZMod DAC。DAC通道1 SMA的输出应使用SMA- bnc电缆连接到示波器。
此外,确保ZU板通过USB- c连接供电,并通过USB JTAG连接到开发机器。
SW设计
为了开始软件设计,我们首先需要确保ZU板上的启动模式设置为JTAG。我们将使用JTAG端口访问ILAs。如果您正在使用PetaLinux,您也可以通过以太网进行访问,如本项目所示;然而,这超出了本项目的范围。
在Vitis Unified中,基于刚刚导出的XSA创建一个新的硬件平台。
选择刚刚从Vivado导出的XSA。
选择一个独立的操作系统和第一个A53处理器。
完成平台的创建。
下一步是创建应用程序项目。对于这个项目,我们将使用Hello World模板,并将其命名为AWG_Example。
选择刚刚创建的平台。
按照指示离开域。
完成应用程序的创建。
下一步是构建应用程序并使用应用程序的启动配置交叉探测。json文件。
要添加交叉探测(我们需要添加两个,每个方向一个),选择add Item选项。
我们将设置的第一个交叉探针使触发器能够使用FTM从A53-0处理器转到可编程逻辑,从而转到系统ILA。
一旦设置了第一个交叉探测,我们需要添加另一个从可编程逻辑到A53处理器的交叉探测。
现在,我们可以调试标准的Hello World应用程序,以确保该流程按预期工作,并提前查看ZMod AWG状态。
我们将在终端中看到输出;这有助于证明我们有一个具有基本功能的构建。
在开发主应用软件之前,下一步是确认ZMod AWG已被正确配置和初始化。这里的任何错误都表明时钟或控制信号映射有问题。
在Vivado中,打开硬件管理器,并在ILA1上,仔细检查时钟向导是否被锁定并且DAC已初始化。由于这些是静态信号,我们可以立即触发ILA。
如果我们看到一个配置错误,我们将需要进一步研究ZMod AWG的接口和时钟。
下一步是在系统ILA上启用触发器并武装它。
然后我们可以开发主应用软件,对于本例,它将向DAC中写入一个斜坡计数。这是一种通常在集成早期执行的测试,以确保DAC没有丢失的位或卡住的代码。
应用程序代码如下:
下一步是使用System ILA检查数据是否正确地传输到轴流FIFO。
在for循环中添加一个断点来执行写操作。
当遇到断点时,ILA也将触发,并且可以观察到AXI写入。
这证明数据正在写入轴流FIFO。现在我们需要检查数据是否从FIFO输出。
在Vivado中,更改System ILA触发器,并将其设置为在axis - stream上有效的数据上升沿触发,然后武装ILA。
重新启动应用程序软件,ILA将随着软件的停止而触发,就像在断点处一样。我们可以看到数百个数据包正在输出。
放大后,您可以看到斜坡的值和值按预期增加。
在Vitis中,您还将看到该软件已被停止。
当我们将输出驱动到DAC时,这应该会导致DAC输出端出现模拟输出。然而,在连接到硬件的示波器上,没有观察到任何信号。
我们知道处理系统正在生成数据,我们知道它正在被发送到ZMod DAC驱动程序,我们知道ZMod被正确初始化-但是作用域中没有出现任何东西。
让我们看看ZMod AWG用户指南,看看我们是否遗漏了什么。该指南的链接在这里。
阅读文档,我们看到了这个问题:目前,测试波形被放置在较低的位,但ZMod AWG期望它在较高的位。
纠正这个错误(很有帮助,这是一个软件修复)可以再次在ILA中验证;但是,我们现在可以在作用域输出中看到结果。
由于DAC代码是有签名的,因此将计数器从0调到最大刻度将导致作用域显示一个正斜坡,然后在设置MSB后显示一个负斜坡。
总结
本项目展示了我们如何使用AMD ChipScope调试解决方案、ILAs和System ILAs在实时项目中发现问题并快速识别它们。该项目还概述了如何通过使用交叉探测功能来调试硬件和软件交互,从而可以轻松地分析集成问题。
ChipScope, ILA和System ILA是开发人员可以用来快速轻松地调试应用程序的重要元素。
本文编译自hackster.io