在线逻辑分析仪简介
传统的 FPGA 板级调试是将逻辑分析仪连接到 FPGA 的 IO 引脚上 ,然后将内部信号引出至 IO 引脚,再进行板级调试,这种方法的缺点是我们需要一个逻辑分析仪,且还要在 PCB 中预留测试点。在线逻辑分析仪克服了以上所有的缺点,其借用了传统逻辑分析仪的理念以及大部分的功能,并利用 FPGA 中的逻辑资源,将这些功能植入到 FPGA 的设计当中,在线逻辑分析仪的应用原理框图如下图所示:
其中,待测设计(Design Under Test,DUT)就是用户逻辑,它和片内的在线逻辑分析仪都位于 FPGA中。在线逻辑分析仪通过一个或多个探针(Probe)来采集希望被观察的信号,然后通过片内的 JTAG 硬核组件,将捕获到的数据传送给下载器,进而上传到 Vivado 供用户查看。Vivado 也能够按照上述数据路径,反向地向 FPGA 中的在线逻辑分析仪传送一些控制信息。
在 Vivado 中,在线逻辑分析仪的功能被称为“集成逻辑分析器(Integrated Logic Analyzer,ILA)”,它以 IP 核的形式来加入到用户设计中。Vivado 提供了三种具有不同集成层次的插入 ILA 方法:
- 直接在 HDL 代码中例化一个 ILA IP 核,也被称为“HDL 实例化调试探针流程”,这是集成层次最高的方法。ILA IP 核可以在 IP Catalog(IP 目录)中找到,并对其进行配置,以符合所需的调试需求,这是最直接的方法,但其灵活性也较差。在调试工作完毕之后,还需要在 HDL 源代码中删除 ILA IP 核,然后重新综合以生成最终的比特流。
- 在 HDL 代码中为要观察的 reg 或 wire 信号添加“mark debug”属性,然后通过“Setup Debug”向导来设置各个探针和 ILA IP 核的工作参数,工具会根据用户设置的参数,自动地生成各个 ILA IP 核,这个方法也被称为“使用 Debug 标记创建 ILA 调试环境”。用户设置的调试信息会以 Tcl XDC 调试命令的形式保存到 XDC 约束文件中,在实现阶段,Vivado 会读取这些 XDC 调试命令,并在布局布线时加入这些 ILA IP 核。在调试工作完毕之后,用户可以在 HLD 代码中删除之前添加的“Mark Debug”综合属性,并且在 XDC 文件中删除调试命令,然后再对设计进行重新编译,以生成最终的比特流。
- 在综合后的网表中标记要观察的信号,然后通过“Setup Debug”向导来设置各个探针和 ILA IP 核的工作参数,工具会根据用户设置的参数,自动地生成各个 ILA IP 核。这个方法也被称为“网表插入调试探针流程”。在此流程中,用户不需要修改 HDL 源代码,并且能够单独控制每个 ILA IP 核以及每个探针,这样就提供了很大的灵活性。用户设置的调试信息会以 Tcl XDC 调试命令的形式保存到 XDC 约束文件中,在实现阶段,Vivado 会读取这些 XDC 调试命令,并在布局布线时加入这些 ILA IP 核。在调试工作完毕之后,用户就可以在 XDC 文件中删除调试命令,然后再对设计进行重新编译,以生成最终的比特流。第3种方法与第二种方法的使用区别很小,只是标记信号的方式不同,第2种是在综合前标记,第三种是在综合后标记。
HDL 实例化调试探针流程
- 点击“Flow Navigator”窗口中的“IP Catalog”按钮
这时“IP Catalog”窗口就被打开了,如下图所示:
- 搜索栏中输入“ILA”,这时 Vivado 会自动根据关键词搜索出相应的结果,然后双击“ILA(Integrated Logic Analyzer)”
双击“ILA(Integrated Logic Analyzer)”会弹出“ILA IP”核的配置页面,ILA IP 核的默认配置页面如下图所示:
- 工具栏介绍
左上角工具栏主要有 Documentation、IP Location、Switch to Defaults 三个设置。
(1)Documentation:IP 相关文档入口,点击后会展开相应的菜单。其中”Product Guide IP“手册查看入口,点击可自动跳转到 Xilinx 官方文档 DocNav 软件;”Change Log“是 IP 版本更新记录,点击可显示 IP 更新记录;”Product Webpage“是 IP 的介绍网页,点击可跳转到 Xilinx 官方有关该 IP 介绍的网站; ”Answer Records“是与 IP 相关的 Xilinx 官方疑问解答记录网页。
(2)IP Location:设置 IP 的存放路径,点击后再弹出的对话框中可以选择 IP 的存放路径
(3)Switch to Default:点击后会将所有设置恢复到默认值。 - ILA IP 核命名
在”Component Name“中可以设置 IP 核的名称。 - 配置参数介绍
General Options(常规选项)主要有两部分。
(1)Monitor Type:ILA 探针接口类型设置,ILA 探针接口有两种类型,Native 与 AXI,Native 是普通接口模式;AXI 是 AXI 接口模式。Native 通常是用来测量电平或一定位宽信号,AXI 用来测量 AXI 总线的信号。这里以 Native 模式为例进行讲解。
Number of Probes:探针数量设置,在 GUI 界面最大可设置 64 个,如果需要调试的内部信号超过 64 个,可以通过 TCL 脚本去生成 IP Core,或者可以通过生成多个 ILA IP Core 去调试更多信号。
Sample Data Depth:采样数据深度,设置的数值越大,采样的数据越多,看到的波形数据越多,但是最终占用的资源也会越多,并不是设置的越大越好。
Same Number of Comparators for All Probe Ports:这里是设置相同探针接口的 Comparators 的个数,如果该选项不被勾选,接下来的 Number of Comparators 选项就会消失。
Trigger Out Port:触发输出端口,可用于 ILA 模块的级联或一些高级功能
Trigger In Port:触发输入端口,可用于手工设置添加触发信号或进行 ILA 模块的级联或一些高级功能
Input Pipe Stages:设置待探测信号打拍次数
(2)Trigger And Storage settings:触发器和存储设置。
Capture Control:捕获控制,支持基本触发(时间点捕获)外的捕获类型,比如信号变化的间歇捕获。这里如果勾选,可在调试查看波形窗口进行对 Capture mode 的设置;如果不勾选,后面有关 Capture mode 就不可修改,会保持常用捕获模式,基本捕获模式满足大部分调试需求。
Advanced Trigger:高级触发,该模式下可以创建和使用复杂的触发序列。如果这里勾选,可在调试查看波形窗口进行对 Trigger mode 的设置;如果不勾选,后面有关 Trigger mode 就不可修改。
Probe_Ports(探针端口)包含一个表格,一共有四列,重点关注第二列核第四列,分别是配置端口宽度和类型(触发或数据,或者两者都)。
- 此处对09 呼吸灯中的代码进行调试,使用在线逻辑分析仪抓取顶层模块中的sys_rst_n、led、duty_cycle这3个信号,因此 ILA IP 核的配置如下:
- ILA IP 核配置完成,接下来点击右下角的“OK”退出配置界面,接下来就会弹出“Generate Output Products”对话框,保持默认设置,直接点击“Generate”即可,此时 Vivado 就开始对该 ILA IP 核进行 OOC(Out-of-Context)综合了
Vivado 使用自顶向下的全局(Global)综合方式,将顶层之下的所有逻辑模块都进行综合,但是设置为 OOC 方式的模块除外,它们独立于顶层设计而单独综合。通常在整个设计周期中,顶层设计会被多次修改并综合,但有些子模块在创建完毕之后不会因为顶层设计的修改而被修改,如 IP,它们可设置为 OOC 综合方式。OOC 模块只会在综合顶层之前被综合一次,这样在顶层的设计迭代过程中,OOC 模块就不必跟随顶层模块而一次次产生相同结果的多余综合了。 - 综合完成后在“Source”窗口中看到已经出现了 ILA IP 核。由于还没有把它例化到顶层的 HDL 代码中,所以在层次结构上它与顶层并排。
- 例化ILA IP核,在顶层设计中加入如下代码:
//例化ILA IP核
ila_0 u_ila_inst0(
.clk(sys_clk), //input wire clk
.probe0(sys_rst_n), //input wire [0:0] Probe0
.probe1(led), //input wire [0:0] Probe1
.probe2(duty_cycle) //input wire [31:0] Probe2
);
- 至此完成了在设计中添加ILA IP核的工作。
“mark_debug”标记要调试的信号
- 在综合代码之前,需要在代码中对要调试的信号添加"mark_debug"属性(其中“(* mark_debug = “true” *)”必须紧挨在变量声明的前面)。
- 点击“Flow Navigator”→“SYNTHESIS”窗口中的“Run Synthesis”进行综合
- 综合完成后,需要将 Debug 信号与探针关联,接下来点击“Flow Navigator”→“SYNTHESIS”窗口中的“Open Synthesized Design”按钮
- 选择“Debug”窗口布局
此时,Vivado 打开了“Netlist”子窗口、“Schematic”子窗口、“Debug”子窗口,其中“Netlist”子窗口和“Schematic”子窗口都显示了被标记的信号,“Debug”子窗口用于显示并设置 ILA IP 核的各个参数
- 将 Debug 信号与探针关联,接下来点击“Flow Navigator”→“SYNTHESIS”→“Open Synthesized Design”窗口中“Set Up Debug”的按钮
点击“Set Up Debug”按钮后进入 Debug 信号与探针关联引导页面面,如下图所示,直接点击“Next”。
点击“Next”后进入未关联引脚配置页面,如下图所示。
Name:会列出所有需要进项调试的信号,即在 HDL 代码中添加“(* mark_debug = “true” *)”综合属性的信号且未关联的调试信号
Clock Domain:是选择用于采样待测信号的时钟域,一般情况下 Vivado 会自动识别出各个待测信号所属的时钟域并将其自动设定为其采样时钟,若 Vivado 未识别出来,或者需要修改时钟域可以点击待测信号,在弹出的菜单中选择“Select Clock
Domain”,打开“Select Clock Domain”窗口重新选择时钟域。
Driver Cell:驱动单元
Probe Type:对探针设置触发器或数据类型。有 3 种可选,(Data and Trigger)既是数据又可作为触发条件,(Data)仅作为数据,不可作为触发条件,(Trigger)仅可作为触发条件。
Find Nets toAdd…按钮:点击可打开添加网络的窗口,对于多余的端口可以选中后点击“—”删除
接下来点击“Next”
对 ILA IP 核的全局设置,设置完成点击“Next"
最后点击点击“Finish”按钮即可
- 点击保存或者按ctrl+s进行保存操作
- 此时可见xdc文件中增加了如下内容
- 接下来就可以编译工程并生成比特流,在这个过程中 Vivado 会自动添加相应的 ILA IP 核
网表插入调试探针流程
- 点击“Flow Navigator”→“SYNTHESIS”窗口中的“Run Synthesis”进行综合
- 来点击“Flow Navigator”→“SYNTHESIS”窗口中的“Open Synthesized Design”按钮
- 选择“Debug”窗口布局
此时,Vivado 打开了“Netlist”子窗口、“Schematic”子窗口、“Debug”子窗口,其中“Netlist”子窗口和“Schematic”子窗口都可以用于标记要进行观察的信号,“Debug”子窗口用于显示并设置 ILA IP 核的各个参数
- 在“Netlist”子窗口中的“Nets”目录下找到需要调试的信号,右击该网络在弹出的菜单中心选择“Mark Debug”命令
同样也可以在“Schematic”子窗口中选择需要调试的网络,然后右键选择“Mark Debug”命令
- 为信号记了“Mark Debug”之后,就可以进行 ILA IP 核的配置了,对可以参考**“mark_debug”标记要调试的信号**中的第5步。
- 完成后进行保存,同样会在xdc文件中追加debug 的约束命令。
注意
Vivado在综合是会对代码进行优化,可能会进行多余的信号删除、变量位宽缩小、设置对信号进行重命名的操作,此时可能会导致无法找到需要调试的信号(可能被优化掉了,可能重命名了)
在 Hardware Manager 中观察调试信号
- 生成比特流之后,我们打开 Hardware Manager,连接到开发板并下载比特流。
其中的.ltx 文件存储了调试探针的信息,用来传递给 Vivado IDE,它是从我们的设计中被提取出来的。通常,调试探测文件是在实现过程中自动创建的,并位于和比特流文件相同的目录下。若实现后的设计中包含了 ILA IP 核,则在下载比特流时,Vivado 会自动识别出.ltx 文件。
2. 下载完成后 Vivado 会自动打开 ILA 的调试窗口
3. 有时候 ILA 的采样波形窗口界面没有自动弹出,可以双击左侧 hardware 窗口中带 ila 特征的硬件选择按钮打开波形窗口。
4. 波形窗口中显示的信号不全,可以点击“Waveform – hw_ila_1”窗口中的加号,将所有的探针信号添加到波形窗口中
当然对于多余的信号也可以点击”—“删除
-
信号添加完成后,就可以开始进行触发动作了。在波形窗口中有 4 个触发动作,如下图所示
从左至右依次是:(1)循环触发、(2)开始触发、(3)立即触发、(4)停止触发
(1)循环触发:它和“开始触发”按钮联合在一起使用。若打开了此选项,在点击了“开始触发”按钮后,会不断地对触发条件进行检测,每次触发条件被满足时,都会将RAM中存储的探针值数据上传到Vivado,Vivado上显示的波形也会随之不断更新,直到用户点击了“停止触发”按钮,波形将不再更新。如果探针一直没有检测到触发条件,那么触发操作一直在进行,直到点击停止触发按钮,这次触发操作才会结束。
(2)开始触发:点击之后 ILA 就会开始进行触发操作。点击该按钮后,ila 探针自动寻找触发条件,当探针检测到触发条件后,会将 RAM 中存储的探针值数据上传到 Vivado,Vivado 上显示的波形发生改变,一次触发操作完成;如果探针一直没有检测到触发条件,那么触发操作一直在进行,直到点击停止触发按钮,这次触发操作才会结束。
(3)立即触发:立即将当前 RAM 中的数据上传到 Vivado,而不管触发条件是否得到满足
(4)停止触发:停止当前正在进行的触发活动。
另外在 ILA 的状态控制窗口也有这几个操作按钮,同时还会再状态窗口中显示 ILA 状态
-
采集到信号后,可以点击上图中的放大和缩小的图标,来对波形数据进行放大和缩小
当然也可以通过鼠标滚轮调节大小 -
波形默认以十六进制显示的,可以选择信号单击鼠标右键选择“Radix”→“Unsigned Decimal”设置显示的进制数。
-
可以在“Trigger Setup”窗口中添加触发条件,点击“+”号选择需要触发的信号
如下设置再LED信号跳变时进行触发
当存在多个触发时可以选择他们之间的逻辑关系
设置触发条件后点击触发,但触发信号满足时会将当前 RAM 中的数据上传到 Vivado,并进行显示,触发条件不满足时会进行等待。