OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5534|回复: 0

[XILINX] 《DFZU2EG_4EV MPSoc之FPGA开发指南》第四章 Vivado软件的安装和使用(下)

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2023-3-20 10:55:35 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2023-3-14 15:49 编辑

第四章 Vivado软件的安装和使用

1)实验平台:正点原子 DFZU2EG/4EV MPSoC开发板

2) 章节摘自【正点原子】DFZU2EG/4EV MPSoC之FPGA开发指南 V1.0

3)购买链接:https://detail.tmall.com/item.htm?id=692450874670

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz-MPSOC.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)FPGA技术交流QQ群:994244016

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

4.3 在线逻辑分析仪的使用
传统的FPGA板级调试是由外接的逻辑分析仪连接到FPGA的控制管脚,然后将内部信号引出至引脚IO上,进行板级调试。这种方法的缺点是首先我们需要一个逻辑分析仪,而逻辑分析仪一般价格都比较昂贵,且对于需要测试几十个引脚的时候,选择使用外接的逻辑分析仪就比较繁琐了。在线逻辑分析仪克服了以上所有的缺点,其借用了传统逻辑分析仪的理念以及大部分的功能,并利用FPGA中的逻辑资源,将这些功能植入到FPGA的设计当中。一般地,在线逻辑分析仪的应用原理框图如下图所示:  
image001.png
图 4.3.1 在线逻辑分析仪的应用原理框图

其中,待测设计(DesignUnder 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约束文件中删除这些命令,然后实现最终的设计。这种方法集成层次最低,一般不会使用这种方法。

本小节同样以LED灯闪烁实验的工程为例,介绍前两种ILA调试流程,即“HDL实例化调试探针流程”和“网表插入调试探针流程”。

4.3.1  HDL实例化调试探针流程
“HDL实例化调试探针流程”需要在HDL源代码中实例化ILA IP核。我们点击“Flow Navigator”窗口中的“IP Catalog”按钮,如下图所示:
image003.png
图 4.3.2 “IP Catalog”按钮

这时“IP Catalog”窗口就被打开了,如下图所示:
image004.png
图 4.3.3 “IP Catalog”窗口

我们在搜索栏中输入“ILA”,这时Vivado会自动根据关键词搜索出相应的结果,我们双击“ILA(Integrated Logic Analyzer)”,如下图所示:
image006.png
图 4.3.4 搜索ILA

接下来会弹出“ILA IP”核的配置页面,如下图所示:
image008.png
图 4.3.5 “Customize IP”窗口

“ComponentName”一栏用于设置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;
“Sample Data Depth”用于设置采样深度,在每个采样时钟下,ILA都会将捕获到的探针信号的值送入RAM中,由于RAM的存储空间是有限的,所以此选项就用于设置RAM最大存储多少个探针信号的值,我们保持其默认1024,其数值越大,消耗的RAM资源也越多。其它选项保持默认即可。

在“Probe_Ports(0..0)”页面中,用于设置每个探针的参数,一般我们只需设置探针宽度“Probe Width [1..4096]”一栏即可,由于“sys_rst_n”、“led”和“cnt”这三个信号的位宽分别是1位、2位和27位,所以我们需要将其分别设置为1、2和27,然后点击“OK”按钮即可,如下图所示:
image010.png
图 4.3.6 设置探针宽度

在弹出的对话框中直接点击OK即可,如下图所示:
image012.png
图 4.3.7 点击OK

接下来就会弹出“GenerateOutput Products”对话框,我们保持默认设置,直接点击“Generate”即可,此时Vivado就开始对该ILA IP核进行OOC综合了。如下图所示:
image014.png
图 4.3.8 开始为ILA IP核生成输出文件

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

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模块的黑盒子才会被打开,这时其网表才是可见的,并参与到全局设计的实现过程中来。

介绍完了OOC综合的概念,现在我们回到ILA的调试流程中。在“Design Runs”窗口中可以看到Vivado正在为ILA IP核运行OOC综合,如下图所示:
image016.png
图 4.3.9 ILA IP核正在进行OOC综合

OOC综合完毕之后如下图所示:
image018.png
图 4.3.10 OOC综合完毕

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

由于我们还没有把它例化到顶层的HDL代码中,所以在层次结构上它与顶层并排。下面我们将其例化到顶层的HDL代码中。在“Source”窗口中的“IP Sources”选项卡中双击ILA IP核的例化模板文本文件,找到例化模板的内容,如下图所示:
image022.png
图 4.3.12 例化模板

将图中的红色方框中的模板代码复制并粘贴到led_twinkle.v顶层HDL代码中,并将ILA的时钟和探针信号连接到顶层设计中,例化ILA IP核的代码如下:
  1. ila_0 u_ila_0 (
  2.     .clk(sys_clk),       // input wire clk
  3.     .probe0(sys_rst_n),  // input wire [0:0]  probe0  
  4.     .probe1(led),        // input wire [1:0]  probe1
  5.     .probe2(cnt)         // input wire [26:0]  probe2
  6. );
复制代码
我们将ILA的时钟连接到了顶层时钟sys_clk信号上,probe0探针连接到了sys_rst_n,probe1探针连接到了led,probe2探针连接到了cnt。代码修改完成后如下图所示:
image024.png
图 4.3.13 例化ILA IP核

保存源文件之后就可以直接综合并实现设计,最后生成比特流。

至此,我们就成功地使用“HDL实例化调试探针流程”将ILA IP核添加到了设计中。接下来就可以将比特流下载到FPGA中,并对信号进行在线观察。

4.3.2 Hardware Manager中观察调试信号
生成比特流之后,我们打开HardwareManager,连接到开发板,并下载比特流,如下图所示:
image025.png
图 4.3.14 下载比特流

在弹出的窗口中,Vivado会自动识别比特流文件和具有调试探针信息的.ltx文件,如下图所示:
image027.png
图 4.3.15 下载比特流和调试文件

.ltx文件存储了调试探针的信息,用来传递给Vivado IDE,它是从我们的设计中被提取出来的。通常,调试探测文件是在实现过程中自动创建的,并位于和比特流文件相同的目录下。若实现后的设计中包含了ILA IP核,则在下载比特流时,Vivado会自动识别出.ltx文件。这里我们不必太多地关注此文件,只要按照Vivado自动的设定来下载设计即可。

我们直接点击“Program”,此时Vivado会自动打开ILA的调试窗口,如下图所示:
image029.png
图 4.3.16 ILA的调试窗口

如果Waveform窗口中显示的信号不全,可以点击“Waveform – hw_ila_1”窗口中的加号,来将所有的探针信号添加到波形窗口中(如果默认已经显示所有待观察的信号,不用重复添加),如下图所示:
image031.png
图 4.3.17 向波形窗口中添加探针信号

我们直接点击触发采集信号的按钮,可以观察到此时信号的波形,如图 4.3.18和图 4.3.19所示:
image033.png
图 4.3.18 点击运行触发的图标

image035.png
图 4.3.19 采集到的信号

采集到信号后,可以点击上图中的放大和缩小的图标,来对波形数据进行放大和缩小。

波形默认以十六进制显示的,可以右击cnt计数器,选择“Radix”→“Unsigned Decimal”,即可切换到无符号的十进制显示,如下图所示:
image037.png
图 4.3.20 更改成无符号十进制显示

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

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

之前我们在HDL代码中设置为了cnt计数器每计数到27'd5000_0000和27'd10000_0000时就改变两个led的状态,为了方便led翻转状态的查看,我们可以将触发条件设置为“cnt等于十进制数50_000_000”,即,当ILA检测到cnt计数器的值等于27'd5000_0000时,就会将RAM中的数据上传到Vivado,如下图所示:
image041.png
图 4.3.22 设置触发条件

然后我们就可以开始进行触发动作了。在波形窗口中有4个触发动作,如下图所示:
image043.png
图 4.3.23 触发动作

从左至右依次是:(1)自动触发开关、(2)开始触发、(3)立即触发、(4)停止触发。下面对他们分别进行介绍:

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

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

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

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

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

将波形放大之后就可以看到counter的具体值,如下图所示:
image046.png
图 4.3.25 将波形放大

此时就可以看到,在当cnt计数到50_000_000时,led的状态就会发生跳变。读者也可以尝试再次点击“开始触发”按钮或打开“自动触发”按钮,来观察波形。

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

然后重新综合并实现,以生成最终的比特流。

4.3.3 网表插入调试探针流程
网表插入调试探针有两种操作方式:

第一种方法是在综合之前在HDL代码中为想要观察的reg或wire信号添加“Mark Debug”综合属性,例如:

(* mark_debug = “true” *)reg  [26:0] cnt ;

其中“(*mark_debug = “true” *)”必须紧挨在变量声明的前面。这样,在综合完成之后并打开综合后的设计时,cnt信号就自动被标记了“Mark Debug”属性。此外,被添加了(* mark_debug = “true” *)属性的reg或wire信号不会被工具优化掉。
在HDL代码中添加(* mark_debug = “true” *)综合属性,如下图所示:
image049.png
图 4.3.27 在HDL代码中添加“Mark Debug”综合属性

添加“Make Debug”属性之后,点击“Run Synthesis”进行综合,综合完之后我们点击“Flow Navigator”窗口中的“Open Synthesized Design”按钮,如下图所示:
image051.png
图 4.3.28 点击“OpenSynthesized Design”按钮

然后点击“OpenSynthesized Design”下的“Schematic”,进入如下图所示的页面。在HDL代码中已经添加了“Mark Debug”综合属性的信号会被自动出现在“Debug Nets”选项卡的“Unassigned Debug Nets”目录下,如下图所示:
image052.png
图 4.3.29 “Debug”窗口布局

接下来就可以进行ILA IP核的配置了。点击“Debug”子窗口中的“Setup Debug”按钮,如下图所示:
image054.png
图4.3.30 “Setup Debug”按钮

弹出“Setup Debug”向导,我们直接点击“Next”按钮,如下图所示:
image056.png
图 4.3.31 “Setup Debug”向导

接下来的页面是选择用于采样待测信号的时钟域,Vivado会自动识别出各个待测信号所属的时钟域并将其自动设定为其采样时钟,本次添加的三个信号属于系统时钟(sys_clk)的时钟域,Vivado也已经自动将“sys_clk_IBUF”时钟设置为了这两个信号的采样时钟,如下图所示:
image058.png
图 4.3.32 选择待测信号的时钟域

当然,用户也可以手动指定各个用于采样待测信号的时钟域,右击待测信号,选择“Select Clock Domain”,弹出“Select Clock Domain”窗口,如图 4.3.33和图 4.3.34所示:
image060.png
图 4.3.33 手动指定待测信号的时钟域1

image062.png
图 4.3.34 手动指定待测信号的时钟域2

在图 4.3.33中“Select ClockDomain”窗口中就可以选择用于采样待测信号的时钟了。“Setup Debug”向导会为每个采样时钟生成一个单独的ILA IP核,由于本例程中只有一个时钟,所以这里最后只会生成一个ILA IP核。
设置完采样时钟后,我们点击next,接下来的页面用于设置ILA IP核的全局设置,如下图所示:
image064.png
图 4.3.35 ILA IP核的全局设置

其中“Sample ofdata depth”用于设置采样深度,“Input pipe stages”用于设置待测信号和其采样时钟之间的同步级数。如果在上一个设置时钟域页面中,存在与其采样时钟之间是异步的待测信号,则为了避免亚稳态,此数值最好不要低于2。由于本例中的两个待测信号的其采样时钟是同步的,所以可以设置为0。

我们点击next,就进入了最后的概览页面,确认无误后直接点击“Finish”按钮即可,如下图所示:
image066.png
图 4.3.36 完成“Setup Debug”向导

在“Debug”子窗口中的“Debug Cores”选项卡中,可以看到Vivado已经添加了ILA IP核,并且“Unassigned Debug Nets”目录下已经没有未被分配的信号了,如下图所示:
image068.png
图 4.3.37 添加了ILA IP核的“Debug”子窗口

网表中被标记为MarkDebug的信号也变为了虚线,以表示其完成了ILA IP核的分配,如下图所示:
image070.png
图 4.3.38 网表中完成Setup Debug的信号

前面我们提到过,在“网表插入调试探针流程”中,用户设置的调试信息最终会以Tcl XDC调试命令的形式保存到XDC约束文件中。在实现阶段,Vivado会从XDC约束文件中读取这些XDC调试命令,并在布局布线时加入这些ILA IP核。此时,我们所做出的所有的更改和设置,都还只是停留在电脑内存中,我们需要将其保存在硬盘的XDC约束文件中,以供Vivado在实现阶段读取。点击工具栏中的保存按钮,如下图所示:
image072.png
图 4.3.39 保存按钮

在出现的消息框中直接点击OK,如下图所示:
image073.png
图 4.3.40 点击OK

如果弹出“SaveConstraints”对话框,询问用户将约束保存在哪个XDC约束文件中,本例的工程中只有一个XDC约束文件,选择“Select an existing file”,位于led_twinkle.xdc文件下,然后点击“OK”按钮即可(有时候也有可能没有弹出这个对话框)。

此时,我们打开led_twinkle.xdc文件,就会看如下图所示:
image075.png
图 4.3.41 将要更新的约束文件

在上图中点击箭头指示的“Reload”更新约束文件,更新后Vivado自动写入了用于debug的约束命令,如下图所示:
image077.png
图 4.3.42 Vivado自动写入的用于debug的约束

在实现阶段,Vivado会读取这些约束,并按照这些命令的参数来自动地加入ILA IP核。

至此,我们就成功地使用“网表插入调试探针流程”将ILA IP核添加到了设计中。接下来就可以实现设计并生成比特流,最后将比特流下载到FPGA中,以对信号进行在线观察。

对信号在线观察的方法请参考“4.3.2Hardware Manager中观察调试信号”一节,操作方法和“HDL 实例化调试探针”的观察波形信号一样,没有任何区别。

如果调试工作完毕之后,可以删除led_twinkle.v源代码信号中的“Make Debug”属性和删除XDC文件中的包含调试信息的Tcl文件,然后重新综合并实现,以生成最终的比特流。至此,在线逻辑分析仪的使用介绍完毕。

网表插入调试探针的第二种方法是需要在综合后的网表中,将要进行调试观察的各个信号标记“mark_debug”属性,即在综合之后的网表中手动选择网络并点击“mark_debug”按钮然后通过“Setup Debug”向导来设置ILA IP核的参数,最后工具会根据参数来自动创建ILA IP核。操作步骤如下:
点击“RunSynthesis”进行综合,综合完之后我们点击“Flow Navigator”窗口中的“Open Synthesized Design”按钮,如下图所示:
QQ截图20230314152623.png
图 4.3.43 点击“OpenSynthesized Design”按钮

在综合后设计的窗口布局选择器中,我们选择“Debug”窗口布局,如下图所示:
image079.png
图 4.3.44 切换到“Debug”窗口布局

此时,Vivado打开了“Netlist”子窗口、“Schematic”子窗口以及“Debug”子窗口。其中,“Netlist”子窗口和“Schematic”子窗口都可以用于标记要进行观察的信号,“Debug”子窗口用于显示并设置ILA IP核的各个参数。如下图所示:
image081.png
图 4.3.45 “Debug”窗口布局

在“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”下。

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

也可以在“Schematic”子窗口中选择网络,然后右键选择“Mark Debug”命令,如下图所示:
image085.png
图 4.3.47 在“Schematic”子窗口中点击“Mark debug”命令

此时在“Debug”子窗口的“Debug Nets”选项卡的“Unassigned Debug Nets”目录下就会出现我们刚刚标记的“led_OBUF[0]”网络。,如下图所示:
image087.png
图 4.3.48 Unassigned Debug Nets信号

按照上面的操作一次添加需要观察的信号,完成后如下图所示,不过在添加信号的过程中我们会发现一些信号被工具优化掉了,例如“cnt”信号,所以在平时使用逻辑分析仪在线调试时不推荐使用这种手动选择网络并点击“mark_debug”按钮然后通过“Setup Debug”向导来设置ILA IP核的参数的办法。

从通过“SetupDebug”向导来设置ILA IP核的参数这里开始往后的操作步骤与图 4.3.30后面所有的操作是一致的,可以完全参考上面的资料。

4.4 在Vivado中进行功能仿真
在进行功能仿真之前,我们先看一下典型的FPGA设计流程,流程图如下:
image089.png
图 4.4.1 FPGA的设计流程

从上图可以看到,在设计输入之后、设计综合之前进行RTL级仿真,称为综合前仿真,也称为前仿真或功能仿真。前仿真也就是纯粹的功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟。在完成一个设计的代码编写工作之后,可以直接对代码进行仿真,检测源代码是否符合功能要求。这时,仿真的对象为HDL代码,可以比较直观的观察波形的变化,在设计的最初阶段发现问题,节省大量的精力。

在布局布线后进行的仿真称为布局布线后仿真,也称为后仿真或时序仿真。时序仿真真实地反映了逻辑的时延与功能,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,是否存在时序违规。

Vivado设计套件内部集成了仿真器Vivado Simulator,能够在设计流程的不同阶段运行设计的功能仿真和时序仿真,结果可以在VivadoIDE集成的波形查看器中显示。Vivado还支持与诸如ModelSim、Verilog Compiler Simulator (VCS)、Questa Advanced Simulator等第三方仿真器的联合仿真。

功能仿真需要的文件:
1.设计HDL源代码,也被称为UUT(Unit Under Test):可以是VHDL语言或Verilog语言,既可以是设计的顶层模块,也可以是设计的下层子模块。

2.测试激励代码,也被称为TestBench:根据UUT顶层输入/输出接口的设计要求,来产生顶层输入接口的测试激励并监视顶层输出接口。由于不需要进行综合,书写具有很大的灵活性。

TestBench和UUT之间的关系如下图所示:
image091.png
图 4.4.2 TestBench和UUT之间的关系

3.仿真模型/库:根据设计内调用的器件供应商提供的模块而定,如:FIFO、ADD_SUB等。在使用Vivado Simulator时,仿真器所需的仿真模型/库是预编译好并集成在Vivado中的,因此不需要进行额外的预编译操作,直接加载HDL设计和TestBench即可执行仿真。
接下来我们开始在VivadoIDE中进行仿真,首先需要创建一个TestBench。我们点击“Sources”窗口中的“+”号(Add Sources命令),在弹出的窗口中选择“Add or CreateSimulation Sources”,如图 4.4.3和图 4.4.4所示:
image093.png
图 4.4.3 点击“Add Sources”

image094.png
图 4.4.4 选择添加仿真源文件

点击“NEXT”按钮,在接下来的页面中点击“Create File”,如下图所示:
image096.png
图 4.4.5 点击“Create File”

在弹出的对话框中输入TestBench的文件名“tb_led_twinkle”,并点击“OK”按钮,如下图所示:
image098.png
图 4.4.6 输入TestBench的文件名

TestBench源文件名称的前缀“tb_”可以用来向用户示意:该源文件是一个TestBench源文件,仅用于仿真,并不能用于设计的综合和实现。建议大家按照这种规范来创建TestBench,以免设计源文件和仿真源文件相混淆。
接下来直接点击“Finish”按钮,如下图所示:
image100.png
图 4.4.7 点击“Finish”按钮

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

紧接着会弹出一个模块定义的确认按钮,点击“YES”按钮即可,如下图所示:
image104.png
图 4.4.9 模块定义确认按钮

此时我们就可以在Source窗口→Simulation Sources→sim_1下找到tb_led_twinkle.v文件,这个文件就是刚刚创建的TestBench文件,双击打开后发现其模块内部只定义了模块名,如下图所示:
image106.png
图 4.4.10 打开TestBench文件

我们删除tb_led_twinkle.v文件中默认的代码,然后替换成LED灯闪烁的TestBench(激励)代码,代码如下:
  1. 1  `timescale 1ns/ 1ps
  2. 2  
  3. 3  module tb_led_twinkle();
  4. 4  
  5. 5  //输入
  6. 6  reg           sys_clk_p;
  7. 7  reg           sys_clk_n;
  8. 8  reg           sys_rst_n;
  9. 9  
  10. 10 //输出
  11. 11 wire  [1:0   led;
  12. 12
  13. 13 //信号初始化
  14. 14 initial begin
  15. 15     sys_clk_p =1'b0;
  16. 16     sys_clk_n =1'b1;
  17. 17     sys_rst_n =1'b0;
  18. 18     #200
  19. 19     sys_rst_n =1'b1;
  20. 20 end
  21. 21
  22. 22 //生成时钟
  23. 23 always #5 sys_clk_p= ~ sys_clk_p;
  24. 24 always #5 sys_clk_n= ~ sys_clk_n;
  25. 25
  26. 26 //例化待测设计
  27. 27 led_twinkle u_led_twinkle(
  28. 28     .sys_clk_p   (sys_clk_p),
  29. 29     .sys_clk_n   (sys_clk_n),
  30. 30     .sys_rst_n   (sys_rst_n),
  31. 31     .led         (led)
  32. 32     );
  33. 33
  34. 34 endmodule
复制代码

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

为了让读者能够更好的理解,这里我们就简单介绍一下TestBench源代码。仿真代码首先要规定时间单位和精度,我们建议大家最好在Testbench里面统一规定时间单位,不要在工程代码里定义,因为不同的模块如果时间单位不同可能会为仿真带来一些问题。代码的第1行timescale是Verilog语法中的不可综合的语法,用于定义仿真文件中的单位,表示仿真的时间单位为1ns,精度为1ps,这是赛灵思官方推荐的仿真时间单位和精度。代码的第3行就是TestBench的模块名定义,其中第5行至第11行是我们的数据类型定义, 第13~19行是信号的初始化,第22-24行用于生成时钟信号,到了第26-32行是对被测模块(led_twinkle)的例化。

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

这里,我们通过双斜杠“//”将源代码注释掉,并将源代码复制一份放到源代码的后面,并修改计数器的值。待仿真结束后进行分析和综合时,再将标记为“仅用于仿真的”的语句注释掉或者直接删除。

在“FlowNavigator”窗口中点击“Run Simulation”并选择“Run Behavioral Simulation”,如下图所示:
image110.png
图 4.4.12 Run Simulation命令

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

下面分别介绍仿真界面中的各个子窗口:
(1)Scope窗口。Scope(范围)是HDL设计的层次划分。在Scope窗口中,您可以看到设计层次结构。当您选择了一个Scope层次结构中的作用域时,该作用域内的所有HDL对象,包括reg、wire等都会出现在“Objects”窗口中。您可以在“Objects”窗口中选择HDL对象,并将它们添加到波形窗口中。

(2)Object窗口。“Objects”窗口会显示在“Scopes”窗口中选择的范围内的所有HDL仿真对象。例如,我们在Scope窗口中选择“u_led_twinkle”,在“Objects”窗口中就会自动显示出led_twinkle模块中所有的对象。如下图所示:
image113.png
图 4.4.14 “Objects”窗口中的对象

可以看出,在led_twinkle顶层模块中除了顶层端口sys_clk_p、sys_clk_n、sys_rst_n、led之外,还包括在内部定义的计数器cnt,与差分输入转单端输出的系统时钟sys_clk。

(3)波形窗口。用于显示所要观察信号的波形。若要向波形窗口添加单个HDL对象或多个HDL对象,在“Objects”窗口中,右键单击一个或多个对象,然后从下拉菜单中选择“Add toWave Window”选项。例如,我们把“u_led_twinkle”模块下的“cnt”计数器与系统时钟sys_clk添加到波形窗口中,如下图所示:
image114.png
图 4.4.15 将“counter”计数器添加到波形窗口中

image116.png
图 4.4.16 将“sys_clk”系统时钟添加到波形图窗口中

添加到波形窗口中的“cnt”计数器与系统时钟sys_clk如下图所示:
image118.png
图 4.4.17 添加到波形窗口中的“cnt”计数器与系统时钟“sys_clk”

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

之后会弹出“SaveWaveform”对话框,提示用户将当前波形配置信息保存为“.wcfg”后缀的文件,且工具已经自动地输入了文件名“tb_led_twinkle_behav”,文件的保存目录也被工具自动设置为了当前的工程目录,所以我们保持其默认状态即可,直接点击“Save”。如下图所示:
image120.png
图 4.4.19 保存.wcfg文件

注意,.wcfg文件只是包含波形窗口的配置信息,并不包含波形的数据文件,波形的数据文件被存储在另外的文件中。

之后会弹出一个消息框,询问用户是否将刚刚创建的波形配置信息文件tb_led_twinkle_behav.wcfg添加到当前工程中,我们直接点击“Yes”即可。如下图所示:
image122.png
图 4.4.20 将led_tb_behav.wcfg文件添加到工程中

(4)仿真工具栏。仿真工具栏包含运行各个仿真动作的命令按钮,如下图所示:
image124.png
图 4.4.21 仿真工具栏

上图中的工具栏从左至右依次是:

• Restart:将仿真时间重置为零,此时波形窗口中原有的波形都会被清除。下次执行仿真时,会从0时刻重新开始。

• Runall:运行仿真,直到其完成所有事件或遇到HDL语句中的$stop或$finish命令为止。注意,如果没有在TestBench语句中加入$stop或$finish命令,当点击Run all命令时,仿真器会无休止地一直仿真下去,除非用户点击仿真工具栏中的“Break”按钮来手动地结束仿真。但是,如果此时需要仿真的设计比较复杂,则仿真器在运行仿真时会耗费电脑大量的CPU和内存资源,此时有可能会造成电脑卡顿甚至死机的情况。所以,如果设计比较复杂,且没有在TestBench语句中加入$stop或$finish命令,最好不要轻易点击Run all命令。

• Run For:运行特定的一段时间。紧随在后面的两个文本框用于设定仿真时长的数值大小和时间单位。

• Step:按步运行仿真,每一步仿真一个HDL语句。

• Break:暂停当前仿真。

• Relaunch:重新编译仿真源并重新启动仿真。在使用Vivado仿真器来调试HDL设计时,您可能会根据仿真结果来对您的HDL源代码进行修改。在修改完HDL源代码后,可以点击Relaunch按钮来重新加载UUT设计和TestBench,以重新对修改后的HDL源代码进行仿真。此时就不需要再关闭并重新打开仿真器了。

介绍完各个窗口和命令按钮的使用后,下面我们开始进行仿真。

在刚打开仿真器时,仿真器会将TestBench中的信号加入到波形窗口中,并执行一段时长的仿真,仿真的时长由Settings设置窗口中的参数值指定,如下图所示:
image126.png
图 4.4.22 Settings窗口中设置默认仿真时长的参数值

可以看到,仿真器启动后默认立即执行的仿真时长是1000ns。由于我们是在默认立即执行仿真结束之后,才加入了“cnt”计数器信号,所以新加入的cnt信号并没有波形。此时我们需要将仿真时刻重置为0,重新开始仿真。点击Restart按钮,波形窗口中的当前仿真时刻点(黄色标尺)就会回归到0ns,且原先的所有波形都被清除,如下图所示:
image128.png
图 4.4.23 Restart仿真

此时点击仿真工具栏中的Run For按钮,默认仿真时长是10us,如下图所示:
image130.png
图 4.4.24 Run For按钮

此时就可以看到波形窗口中就出现了波形,我们点击波形窗口中的显示工具栏中的“Zoom Fit”按钮,波形就会自动缩放到整个窗口,如下图所示:
image131.png
图 4.4.25 “ZoomFit”按钮

按住“Ctrl”键并滚动鼠标滚轮,就可以放大/缩小波形,如下图所示:
image133.png
图 4.4.26 放大波形

cnt信号默认显示为16进制,为了方便观察,我们将其设置为10进制。对cnt信号右键,在弹出的菜单中依次选择“Radix”——“Unsigned Decimal”,如下图所示:
image134.png
图 4.4.27 按无符号10进制显示

修改显示后的波形如下图所示:
image136.png
图 4.4.28 波形

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

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

紧接着会弹出一个关闭仿真的确认窗口,点击“OK”按钮即可。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表