赞
踩
我是 雪天鱼,一名FPGA爱好者,研究方向是FPGA架构探索和数字IC设计。
关注公众号【集成电路设计教程】,获取更多学习资料,并拉你进“IC设计交流群
”。
QQIC设计&FPGA&DL交流群
群号:866169462
。
Vivado IDE提供了三种具有不同集成层次的ILA插入方法:
这里我选择的是【网表插入调试探针流程】,在 Vivado 综合后的网表中,分别标记要进行调试观察的各个信号,然后通过一个简单的“Setup Debug”向导来设置各个探针和 ILA IP 核的工作参数,然后Vivado 会根据用户设置的参数,自动地加入各个 ILA IP 核。废话不多说,开始 debug!
还是以 tinyriscv 为例,打开 jtag_dm.v
文件,可以为想要进行观察的 reg 或 wire 信号添加“Mark Debug”属性,例如:
(* mark_debug = "true" *)reg [25:0] cnt ;
其中“(* mark_debug = “true” *)”必须紧挨在变量声明的前面。这样,在综合完之后打开综合后的设计,cnt 信号就自动被标记了“Mark Debug”属性。
对于输入输出端口信号,不能直接在端口名前加此属性,可以额外声明个 wire变量进行查看,如
(* mark_debug = "true" *)wire JTAG_TCK = jtag_TCK;
查看 jtag_TCK 输入信号。
然后运行下综合(Synthesis)
综合完成后点击【Open Synthesized Design】打开设计,并将视图切换为【Debug】 窗口布局。
也可以在 【Netlist】子窗口中标记目标信号,但我试了下由于信号命名改变了,所以挺难找到所需要进行标记的信号,建议还是直接在源码中进行标记。
在网表子窗口选中要进行观察的信号,然后右键点击,选择 Mark Debug
即可。
然后可以在 Debug
子窗口查看已标记的信号。
再点击 Setup Debug
。
接下来的页面是选择用于采样待测信号的时钟域, Vivado 会自动识别出各个待测信号所属的时钟域并将其自动设定为其采样时钟。
这里 jtag_TCK是外部时钟信号,没有时钟域,右键点击下选择个时钟域即可。设置完采样时钟后,点击 next,接下来的页面用于设置 ILA IP 核的全局设置,如下图所示:
注:若采样深度过大,信号又较多,会导致FPGA Bram不够用,报下述错误
其中“Sample of data depth”用于设置采样深度(即一个采样时钟周期内采样多少次),“Input pipe stages”用于设置待测信号和其采样时钟之间的同步级数,这里保持默认即可。点击 next,就进入了最后的概览页面,确认无误后直接点击 finish 即可,如下图所示:
在“Debug”子窗口中的“Debug Cores”选项卡中,可以看到 Vivado已经添加了 ILA IP 核,并且“Unassigned Debug Nets”目录下已经没有未被分配的信号了,如下图所示:
在“网表插入调试探针流程”中, 用户设置的调试信息会以 Tcl XDC 调试命令的形式保存到 XDC 约束文件中,在实现阶段, Vivado 会读取这些 XDC 调试命令,并在布局布线时加入这些 ILA IP
核。此时,我们所做出的所有的更改和设置,都还只是停留在电脑内存中,我们需要将其保存在硬盘的 XDC约束文件中,点击工具栏中的保存按钮,如下图所示:
将生成的约束文件中的代码都复制到自己原来的 约束文件中。
然后进行实现和比特流生成即可。
生成比特流之后,打开 Hardware Manager,连接到开发板,并下载比特流,如下图所示:
在弹出的窗口中, Vivado 会自动识别比特流文件和具有调试探针信息的.ltx 文件,如上图所示。
这里我下载完后有 warning,也没有弹出波形窗口:
INFO: [Labtools 27-1434] Device xc7a35t (JTAG device index = 0) is programmed with a design that has no supported debug core(s) in it.
WARNING: [Labtools 27-3361] The debug hub core was not detected.
Resolution:
1. Make sure the clock connected to the debug hub (dbg_hub) core is a free running clock and is active.
2. Make sure the BSCAN_SWITCH_USER_MASK device property in Vivado Hardware Manager reflects the user scan chain setting in the design and refresh the device. To determine the user scan chain setting in the design, open the implemented design and use 'get_property C_USER_SCAN_CHAIN [get_debug_cores dbg_hub]'.
For more details on setting the scan chain property, consult the Vivado Debug and Programming User Guide (UG908).
WARNING: [Labtools 27-3413] Dropping logic core with cellname:'u_ila_0' at location 'uuid_23E7D65A79BC59F7BC47406C1714DFAE' from probes file, since it cannot be found on the programmed device.
WARNING: [Labtools 27-3413] Dropping logic core with cellname:'u_ila_1' at location 'uuid_3B505A030738513C98471D25F5B1F848' from probes file, since it cannot be found on the programmed device.
查看了下实现后的网表中是有 u_lia_0、u_lia_1、dbg_hub
的,应该是采样时钟的问题。
仔细查看了下,原来是因为我 dbg_hub的时钟绑定为了 jtag_TCK时钟,而时钟是外部时钟,非 free clock,修改下 1.3 Setup Debug
中待观察信号绑定的时钟域即可。
正确的时钟域;
这次就没问题了,可以看到 Vivado 已经自动地将待测探针信号添加到了波形窗口中,如下图所示:
ILA 会将每个采样时钟周期所采集到的探针数据存放在 RAM 中,然后通过 JTAG 和下载器上载到 Vivado。那么触发就是决定 ILA会在什么时候将 RAM 中的探针数据上载到 Vivado,当 ILA 检测到触发条件得到满足时,就会把 RAM 中的探针数据上传到 Vivado,然后 Vivado 将探针数据的波形显示出来。
在 Trigger Setup
中
这里我设置触发条件为 halt 请求有效,即为高电平时为触发条件,加载数据。
点击【自动触发模式】和【开始触发】,开始实时检测触发条件是否满足,一旦满足触发条件就会将数据加载到 Vivado 中:
调试器连线连接好后,就可以通过 openocd 进行连接(具体操作可看我此专栏之前的博客):
通过 telnet 连接,输入 halt 指令进行暂停:
回到 Vivado查看所抓取的信号数据;
可以看到成功抓取到了 halt 请求有效时的信号值。搞定!又掌握了一种 debug 项目的手段。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。