【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具

文章目录

  • 硬件调试简介
    • ILA
    • VIO
  • 在 Vivado中进行Simulation功能仿真
    • TestBench
    • 仿真界面
  • ILA IHDL实例化调试探针流程
    • 添加 ILA IP 核
    • 配置 ILA IP 核
    • 修改例化 ILA IP 代码
    • Hardware Manager中观察调试信号
  • ILA网表插入调试探针流程
    • 添加“Make Debug”属性
    • Run Synthesis
    • “ Netlist”子窗口、 Schematic”子窗口以及 Debug”子窗口
      • (1)在综合后的网表中手动为信号添加 mark_debug属性
      • (2 )HDL代码中已经具有 mark_debug属性的信号
    • “Setup Debug”向导
    • XDC约束文件

硬件调试简介

在整个FPGA设计中,硬件调试与验证会花费超过40%的时间

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
其中,待测设计(Design Under Test DUT)就是用户逻辑,它和片内的在线逻辑分析仪都位于 FPGA中。在线逻辑分析仪通过一个或多个探针( Probe)来采集希望观察的信号,然后通过片内的 JTAG硬核组件,来将捕获到的数据传送给下载器,进而上传到 Vivado IDE以供用户查看。 Vivado IDE也能够按照上述数据路径,反向地向 FPGA中的在线逻辑分析仪传送一些控制信息。由此可见,在线逻辑分析仪不需要将待测信号引出至 I/O上,也不需要电路板走线或者探测点,当然更不需要外部的逻辑分析仪的花费,在Vivado中就可以将在线逻辑分析仪添加到设计中。但是,在线 逻辑分析仪会占用一定数量的内部逻辑资源,如块 RAM、查找表、触发器等等。

ILA

ILA(Integrated Logic Analyzer )监控逻辑内部信号和端口信号

ILA相当于一个探针,把关键位置的信号引出来,传到PC端进行观察,并且可以存储一段信息

在Vivado中,在线逻辑分析仪的功能被称为“ 集成逻辑分析器( Integrated Logic AnalyzerILA))”,它以 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约束文件中删除这些命令,然后实现最终的设计。这种方法集成层次最低,一般不会使用这种方法。

VIO

VIO(Virtual Input/Output )实时监控和驱动逻辑内部信号和端口信号

VIO实现PC给出指令,驱动模块运行

在 Vivado中进行Simulation功能仿真

在进行功能仿真之前,我们先看一下典型的FPGA设计流程,流程图如下:

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
3.仿真模型 /库:根据设计内调用的器件供应商提供的模块而定,如: FIFO、 ADD_SUB等。在使用Vivado Simulator时,仿真器所需的仿真模型 /库是预编译好并集成在 Vivado中的,因此不需要进行额外的预编译操作,直接加载 HDL设计和 TestBench即可执行仿真。

TestBench

接下来我们开始在Vivado IDE中进行仿真,首先需要创建一个 TestBench。

我们点击“ Sources”窗口中的“ “+”号 Add Sources命令),在弹出的窗口中选择“ Add or Create Simulation Sources”

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
TestBench源文件名称的前缀“ tb_”可以用来向用户示意:该源文件是一个 TestBench源文件,仅用于仿真,并不能用于设计的综合和实现。

建议大家按照这种规范来创建 TestBench,以免设计源文件和仿真源文件相混淆

接下来直接点击“Finish”按钮,在弹出的自动定义模块窗口中我们直接点击“OK”按钮即可,结束 TestBench源文件端口的定义,如下图所示:

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
我们删除tb_led_twinkle.v文件中默认的代码,然后替换成 LED灯闪烁的 TestBench(激励)代码,代码如下:

编写完成后,单击保存按钮来保存TestBench。

为了让读者能够更好的理解,这里我们就简单介绍一下TestBench源代码。

仿真代码首先要规定时间单位和精度,我们建议大家最好在 Testbench里面统一规定时间单位,不要在工程代码里定义,因为不同的模块如果时间单位不同可能会为仿真带来一些问题。

代码的第 1行 timescale是 Verilog语法中的不可综合的语法,用于定义仿真文件中的单位,表示仿真的时间单位为 1ns,精度为 1ps,这是赛灵思官方推荐的仿真时间单位和精度。

代码的第 3行就是 TestBench的模块名定义

代码的第 5行至第 10行是我们的数据类型定义 , 第 12~18行是信号的初始化

代码的第 20-21行用于生成时钟信号

代码的第 23-28行是对被测模块led_twinkle)的例化。

在开始仿真之前,有一点需要注意,我们在Vivado软件中实现的功能是 LED闪烁效果,它的间隔时间是 500ms,如果我们想要仿真这个功能,那么我们仿真软件运行时间最低就是 500ms。这 500ms在我们看来是很短的,而对仿真软件来说是很漫长的,毕竟我们的仿真时间单位可是 1ns。为了便于我们仿真,这里我们需要稍微改动一下“ led_twinkle.v”文件的代码,将计时器 cnt的最大计时值设为 10,如下图所
示:

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具

对于testbeach的生成,其实也有自动化生成的工具,需要的可以移步

【ZYNQ】从入门到秃头[番外] Vivado VSCode现代化编辑工具配置

仿真界面

之后我们就进入了仿真界面,如下图所示:

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
可以看出,在led_twinkle顶层模块中除了顶层端口 sys_clk、 sys_rst_n、 led之外,还包括在内部定义的计数器 cnt。

(3)波形窗口。

用于显示所要观察信号的波形。若要向波形 窗口添加单个 HDL对象或多个 HDL对象,在 “Objects”窗口中,右键单击一个或多个对象,然后从下拉菜单中选择 “Add to Wave Window”选项。

例如,我们把“u_led_twinkle”模块 下的“ cnt”计数器添加到波形窗口中 如 下图所示

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具

一般地,每当我们进行一次仿真时,都会把当前波形的配置信息保存下来,包括波形窗口中具有哪些信号等等,以便在下一次打开仿真器进行仿真时,继续使用上一次仿真的配置 信息。我们点击波形窗口中的保存按钮。

(4 )仿真工具栏。

仿真工具栏包含运行各个仿真动作的命令按钮,如下图所示:

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
可以看到,仿真器启动后默认立即执行的仿真时长是1000ns。 由于我们是在 默认立即执行仿真结束之后,才 加入了 cnt”计数器信号,所以新加入的 cnt信号并没有波形。此时我们需要将仿真时刻重置为0,重新开始仿真。点击 Restart按钮,波形窗口中的当前仿真时刻点(黄色标尺)就会回归到 0ns,且原先的 所有波形都被清除,如下图所示:
【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具

cnt信号默认显示为 16进制,为了方便观察,我们将其设置为 10进制。对 cnt信号右键,在弹出的菜单中依次选择 “Radix”——“Unsigned Decimal”

可以看出,cnt每计数到 4和 10,两个 led的电平状态就切换一次。证明我们的 HDL设计达到了我们想要的功能。

在仿真结束后,可以在Flow Navigator窗体中找到 SIMULATION,鼠标右击 SIMULATION,选择Close Simulation来关闭仿真的界面,如下图所示:

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
这时“IP Catalog”窗口就被打开了,如下图所示
【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具

配置 ILA IP 核

接下来会弹出“ILA IP”核的配置页面,如下图所示

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
这里选择监控 sys_rst_n,led,cnt,加起来是 1 + 2 + 26 = 29 位
【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具

在这里,我们简要介绍一下Vivado的 OOC Out-of-Context)综合的概念。对于顶层设计 Vivado使用自顶向下的全局( Global)综合方式,将顶层之下的所有逻辑模块都进行综合,但是设置为 OOC方式的模块除外,它们独立于顶层设计而单独综合。 通常,在整个设计周期中,顶层设计会被多次修改并综合。但有些子模块在创建完毕之后不会因为顶层设计的修改而被修改,如 IP,它们被设置为 OOC综合方式。OOC模 块只会在综合 顶层 之前被综合一次,这样在顶层的设计迭代过程中, OOC模块就不必跟随顶层模块,而一次次的产生相同结果的多余综合了 。所以, OOC流程减少了设计 的 周期,并消除了设计迭代,使您可以保存和重用综合结果。

这时可以在“Source”窗口中看到已经出现了 ILA IP核,如下图所示:

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
将图中的红色方框中的模板代码复制并粘贴到led_twinkle.v顶层 HDL代码中,并将 ILA的时钟和探针信号连接到顶层设计中,例化 ILA IP核的代码如下:

修改例化 ILA IP 代码

我们将ILA的时钟连接到了顶层时钟 sys_clk信号上, probe0探针连接到了 sys_rst_n probe1探针连接到了 led probe2探针连接到了 cnt。代码修改完成后如下图所示:

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
在弹出的窗口中,Vivado会自动识别比特 流文件和具有调试探针信息的 .ltx文件,如下图所示:
【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
如果Waveform窗口中显示的信号不全,可以点击“ Waveform – hw_ila_1”窗口中的加号,来将所有的探针信号添加到波形窗口中(如果默认已经显示所有待观察的信号,不用重复添加),如下图所示:
【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
下面开始触发条件的设置,在这里简要介绍一个触发的概念。

前面我们介绍过, ILA会将所采集到的探针数据存放在 RAM中,然后通过 JTAG和下载器上传到 Vivado。那么触发就是决定 ILA会在什么时候将 RAM中的探针值数据上传到 Vivado,当 ILA检测到 触发条件得到满足时,就会把 RAM中的探针值数据上载到 Vivado,然后 Vivado将探针数据的波形显示出来。

我们在“Trigger Setup”窗口中添加触发条件,点击 “+”号,将 cnt信号添加进来,如下图所示:

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
从左至右依次是:(1)自动触发开关、 2)开始触发、 3)立即触发、 4)停止触发。下面对他
们分别进行介绍:

(1)自动触发开关,它和“开始触发”按钮联合在一起使用。若打开了此选项,则在 ILA开始运行触发(即点击了“开始触发”按钮)后,会不断地对触发条件进行检测,每次触发条件被满足时(即 cnt计数到了 25_000_000),都会将 RAM中存储的所有的探针值数据上传到 Vivado Vivado上显示的波形也会随之不断更新,直到用户点击了“停止触发”按钮。若没有点击此选项,则在 ILA开始运行触发(即点击了“开始触发”按钮)后,在检测到触发条件得到满足并完成了上传数据之后,就会停止触发,等待用
户下一步的指令。

(2)开始触发,它和“自动触发开关”按钮联合在一起使用。点击之后 ILA就会开始进行触发操作。

(3)立即触发,立即将当前 ILA RAM中的数据上传到 Vivado,而不管触发条件是否得到满足。

(4)停止触发,停止当前正 在进行的触发活动。

我们这里直接点击“开始触发”按钮,而不打开“自动触发”开关。然后由于cnt计数器每隔 500ms就会计数到 25_000_000,所以我们几乎马上就可以看到波形窗口中出现了波形,如下图所示

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
此时就可以看到,在当cnt计数到 25_000_000时, led的状态就会发生跳变。读者也可以尝试再次点击“开始触发”按钮或打开“自动触发”按钮,来观察波形。

如果调试工作完毕之后,可以在 led_twinkle.v源代码中删除对 ILA IP核的例化,或者通过添加“和“ “*/”注释掉这段代码,如下图所示

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具

Run Synthesis

添加“Make Debug”属性之后,点击 Run Synthesis”进行综合

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具

在综合后设计的窗口布局选择器中,我们选择Debug”窗口布局,如下图所示

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具
在“Debug”子窗口中,又包含两个选项卡 Debug Cores”和 Debug Nets”。

这两个选项卡都用于显示所有的已标记为“ Mark_Debug”的信号。

不同之处在于 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”下。

(1)在综合后的网表中手动为信号添加 mark_debug属性

如果未在HDL代码中书写 (* mark_debug = “true” *)综合属性,则需要首先标记要进行观察的信号。在综合后的网表中,信号的名称可能会发生一定的变化,以 led信号为例,在“ Netlist”子窗口中的 Nets目录下,找到“ led_OBUF[0]”网络,右击该网络(此时右边的 Schematic”子窗口也会自动地高亮选择此网络,因为“ Netlist”子窗口中的对象和 Schematic”子窗口中的对象,两者之间是 交叉选择的),在弹出的菜单中心选择“ Mark Debug”命令,如下图所示

【ZYNQ】从入门到秃头03 Vivado软件的现代化仿真、调试工具

来源:“逛丢一只鞋”

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年11月12日
下一篇 2021年11月12日

相关推荐