其中,待测设计(Design Under Test,DUT)就是用户逻辑,它和片内的在线逻辑分析仪都位于 FPGA 中。在线逻辑分析仪通过一个或多个探针(Probe)来采集希望观察的信号,然后通过片内的 JTAG 硬核组件,来将捕获到的数据传送给下载器,进而上传到 Vivado IDE以供用户查看。Vivado IDE 也能够按照上述数据路径,反向地向 FPGA 中的在线逻辑分析仪传送一些控制信息。由此可见,在线逻辑分析仪不需要将待测信号引出至 I/O 上,也不需要电路板走线或者探测点,当然更不需要外部的逻辑分析仪的花费,在Vivado 中就可以将在线逻辑分析仪添加到设计中。但是,在线逻辑分析仪会占用一定数量的内部逻辑资源,如块 RAM、查找表、触发器等等。
在 Vivado 中,在线逻辑分析仪的功能被称为“集成逻辑分析器(Integrated Logic Analyzer,ILA)”,它以 IP 核的形式来加入到用户设计中。
Vivado 提供了三种具有不同集成层次的插入 ILA 方法,以满足不同 Vivado 用户群的不同需求:
第一种方法是直接在 HDL 代码中例化一个 ILA IP 核,也被称为“HDL 实例化调试探针流程”,这是集成层次最高的方法。ILA IP 核可以在 IP Catalog(IP 目录)中找到,并对其进行配置,以符合所需的调试需求。这是最直接的方法,但其灵活性也较差。在调试工作完毕之后,还需要在 HDL 源代码中删除ILA IP 核,然后重新综合并实现,以生成最终的比特流。
第二种方法是在综合后的网表中,分别标记要进行调试观察的各个信号,然后通过一个简单的“Setup Debug”向导来设置各个探针和 ILA IP 核的工作参数,然后工具会根据用户设置的参数,自动地生成各个
ILA IP 核。这个方法也被称为“网表插入调试探针流程”。在此流程中,用户不需要修改 HDL 源代码,并且能够单独控制每个 ILA IP 核以及每个探针,这样就提供了很大的灵活性。用户设置的调试信息会以 Tcl XDC 调试命令的形式保存到 XDC 约束文件中,在实现阶段,Vivado 会读取这些 XDC 调试命令,并在布局布线时加入这些 ILA IP 核。在调试工作完毕之后,用户就可以在综合后的网表中删除 ILA IP 核,或者在 XDC 文件中删除调试命令,然后再对设计进行实现,以生成最终的比特流。
第三种方法是手动地在 XDC 约束文件中书写对应的 Tcl XDC 调试命令,在实现阶段工具会自动读取这些命令,并在布局布线时加入这些 ILA IP 核。在调试工作完毕之后,用户还需要在 XDC 约束文件中删除这些命令,然后实现最终的设计。这种方法集成层次最低,一般不会使用这种方法。
1 HDL 实例化调试探针流程
“HDL 实例化调试探针流程”需要在 HDL 源代码中实例化 ILA IP 核。
1 IP Catalog按钮
2 IP Catalog窗口
3 搜索 ILA
双击“ILA (Integrated Logic Analyzer)”
4 Customize IP窗口
“Component Name”一栏用于设置 ILA IP 核的名称。
IP 核的配置包含两个子页面,分别是“General Options”和“Probe_Ports(0..0)”, “General Options” 页面用于设置 ILA IP 核的总体设置,“Probe_Ports(0..0)”页面用于对每个探针的参数进行设置。
在“General Options”页面中,“Number of Probes”一栏用于设置所需的探针数量,一般地,一个探针用于连接一个待测信号,例如,我们想要观察“sys_rst_n”、“led”和“cnt”这三个信号,则需要把 “Number of Probes”设置为 3;
Out-of-Context(OOC) 综合是一种自底向上的设计流程,默认情况下,Vivado 设计套件使用 OOC 的设计流程来综合 OOC 模块。OOC 模块可以是来自 IP Catalog 的 IP、来自 Vivado IP Integrator 的 block design或者顶层模块下手动设置为 OOC 方式的任何子模块。
来自 IP Catalog 的 IP 就默认使用 OOC 的综合方式,例如上图中的“Synthesis Options”选项就设置为了“Out of Context Per IP”。这些 IP 会在顶层的全局综合之前,单独地进行 OOC 综合并生成输出产品(Generate Output Products),包括综合后的网表等各种文件。在对顶层进行综合时,OOC 模块会被视为黑盒子,并且不会参与到顶层的综合中来。在综合之后的实现过程中,OOC 模块的黑盒子才会被打开,这时其网表才是可见的,并参与到全局设计的实现过程中来。
8 OOC 综合完毕
这时可以在“Source”窗口中看到已经出现了 ILA IP 核,如下图所示:
添加的 ILA IP 核
由于我们还没有把它例化到顶层的 HDL 代码中,所以在层次结构上它与顶层并排。下面我们将其例化到顶层的 HDL 代码中。在“Source”窗口中的“IP Sources”选项卡中双击 ILA IP 核的例化模板文本文件,找到例化模板的内容,如下图所示:
例化模板
将图中的红色方框中的模板代码复制并粘贴到 led_twinkle.v 顶层 HDL 代码中,并将 ILA 的时钟和探针信号连接到顶层设计中,例化 ILA IP 核的代码如下:
不同之处在于,“Debug Cores”选项卡是一个更加以 ILA IP 核为中心的视图,所有已标记为“Mark_Debug”的信号并且已经被分配到 ILA 探针的信号都会被显示在各个 ILA IP 核的视图树下,已标记为“Mark_Debug”的信号但是还没有被分配到 ILA 探针的信号被显示在“Unassigned Debug Nets”下,当然也可以在其中查看和设置 ILA IP 核的各种属性和参数。
“Debug Nets”选项卡仅显示已标记为“Mark_Debug”的信号,但不显示 ILA IP 核,所有已标记为 “Mark_Debug”的信号并且已经被分配到 ILA 探针的信号都会被显示在“Assigned Debug Nets”下,已标记为“Mark_Debug”的信号但是还没有被分配到 ILA 探针的信号被显示在“Unassigned Debug Nets”下。
在“Select Clock Domain”窗口中就可以选择用于采样待测信号的时钟了。“Setup Debug”向导会为每个采样时钟生成一个单独的 ILA IP 核,由于本例程中只有一个时钟,所以这里最后只会生成一个 ILA IP 核。
设置完采样时钟后,我们点击 next,接下来的页面用于设置 ILA IP 核的全局设置,如下图所示:
ILA IP 核的全局设置
其中“Sample of data depth”用于设置采样深度,“Input pipe stages”用于设置待测信号和其采样时钟之间的同步级数。如果在上一个设置时钟域页面中,存在与其采样时钟之间是异步的待测信号,则为了避免亚稳态,此数值最好不要低于 2。由于本例中的两个待测信号的其采样时钟是同步的,所以可以设置为0。