文章目录
- 硬件调试简介
-
- 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%的时间
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设计流程,流程图如下:
TestBench
接下来我们开始在Vivado IDE中进行仿真,首先需要创建一个 TestBench。
我们点击“ Sources”窗口中的“ “+” Add Sources命令),在弹出的窗口中选择“ Add or Create Simulation Sources”
建议大家按照这种规范来创建 TestBench,以免设计源文件和仿真源文件相混淆。
接下来直接点击“Finish”按钮,在弹出的自动定义模块窗口中我们直接点击“OK”按钮即可,结束 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,如下图所
示:
对于testbeach的生成,其实也有自动化生成的工具,需要的可以移步
仿真界面
之后我们就进入了仿真界面,如下图所示:
(3)波形窗口。
用于显示所要观察信 的波形。若要向波形 窗口添加单个 HDL对象或多个 HDL对象,在 “Objects”窗口中,右键单击一个或多个对象,然后从下拉菜单中选择 “Add to Wave Window”选项。
例如,我们把“u_led_twinkle”模块 下的“ cnt”计数器添加到波形窗口中 如 下图所示
一般地,每当我们进行一次仿真时,都会把当前波形的配置信息保存下来,包括波形窗口中具有哪些信 等等,以便在下一次打开仿真器进行仿真时,继续使用上一次仿真的配置 信息。我们点击波形窗口中的保存按钮。
(4 )仿真工具栏。
仿真工具栏包含运行各个仿真动作的命令按钮,如下图所示:
cnt信 默认显示为 16进制,为了方便观察,我们将其设置为 10进制。对 cnt信 右键,在弹出的菜单中依次选择 “Radix”——“Unsigned Decimal”
可以看出,cnt每计数到 4和 10,两个 led的电平状态就切换一次。证明我们的 HDL设计达到了我们想要的功能。
在仿真结束后,可以在Flow Navigator窗体中找到 SIMULATION,鼠标右击 SIMULATION,选择Close Simulation来关闭仿真的界面,如下图所示:
配置 ILA IP 核
接下来会弹出“ILA IP”核的配置页面,如下图所示
在这里,我们简要介绍一下Vivado的 OOC Out-of-Context)综合的概念。对于顶层设计 Vivado使用自顶向下的全局( Global)综合方式,将顶层之下的所有逻辑模块都进行综合,但是设置为 OOC方式的模块除外,它们独立于顶层设计而单独综合。 通常,在整个设计周期中,顶层设计会被多次修改并综合。但有些子模块在创建完毕之后不会因为顶层设计的修改而被修改,如 IP,它们被设置为 OOC综合方式。OOC模 块只会在综合 顶层 之前被综合一次,这样在顶层的设计迭代过程中, OOC模块就不必跟随顶层模块,而一次次的产生相同结果的多余综合了 。所以, OOC流程减少了设计 的 周期,并消除了设计迭代,使您可以保存和重用综合结果。
这时可以在“Source”窗口中看到已经出现了 ILA IP核,如下图所示:
修改例化 ILA IP 代码
我们将ILA的时钟连接到了顶层时钟 sys_clk信 上, probe0探针连接到了 sys_rst_n probe1探针连接到了 led probe2探针连接到了 cnt。代码修改完成后如下图所示:
前面我们介绍过, ILA会将所采集到的探针数据存放在 RAM中,然后通过 JTAG和下载器上传到 Vivado。那么触发就是决定 ILA会在什么时候将 RAM中的探针值数据上传到 Vivado,当 ILA检测到 触发条件得到满足时,就会把 RAM中的探针值数据上载到 Vivado,然后 Vivado将探针数据的波形显示出来。
我们在“Trigger Setup”窗口中添加触发条件,点击 “+” ,将 cnt信 添加进来,如下图所示:
(1)自动触发开关,它和“开始触发”按钮联合在一起使用。若打开了此选项,则在 ILA开始运行触发(即点击了“开始触发”按钮)后,会不断地对触发条件进行检测,每次触发条件被满足时(即 cnt计数到了 25_000_000),都会将 RAM中存储的所有的探针值数据上传到 Vivado Vivado上显示的波形也会随之不断更新,直到用户点击了“停止触发”按钮。若没有点击此选项,则在 ILA开始运行触发(即点击了“开始触发”按钮)后,在检测到触发条件得到满足并完成了上传数据之后,就会停止触发,等待用
户下一步的指令。
(2)开始触发,它和“自动触发开关”按钮联合在一起使用。点击之后 ILA就会开始进行触发操作。
(3)立即触发,立即将当前 ILA RAM中的数据上传到 Vivado,而不管触发条件是否得到满足。
(4)停止触发,停止当前正 在进行的触发活动。
我们这里直接点击“开始触发”按钮,而不打开“自动触发”开关。然后由于cnt计数器每隔 500ms就会计数到 25_000_000,所以我们几乎马上就可以看到波形窗口中出现了波形,如下图所示
如果调试工作完毕之后,可以在 led_twinkle.v源代码中删除对 ILA IP核的例化,或者通过添加“和“ “*/”注释掉这段代码,如下图所示
Run Synthesis
添加“Make Debug”属性之后,点击 Run Synthesis”进行综合
在综合后设计的窗口布局选择器中,我们选择Debug”窗口布局,如下图所示
这两个选项卡都用于显示所有的已标记为“ 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”命令,如下图所示
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!