VIVADO仿真功能系列

版权声明:本文为CSDN博主「FPGADesigner」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FPGADesigner/article/details/81807296

一、仿真功能概述

仿真FPGA开发中常用的功能,通过给设计注入激励和观察输出结果,验证设计的功能性。Vivado设计套件支持如下仿真工具:Vivado Simulator、Questa、ModelSim、IES、VCS、Rivera-PRO和Active-HDl。

Vivado的仿真流程如下图所示:
这里写图片描述
仿真可以在设计阶段的不同时间点进行,主要包括如下三个阶段:

  • RTL级行为仿真:在综合和实现前便可验证设计,用来检查代码语法和验证代码像设计者想要的功能一样工作,早期的行为级仿真可以尽早发现问题;
  • 综合后仿真:使用综合网表仿真,验证综合后设计满足功能需求。该阶段仿真不太常用,可以用时序仿真(timing simulation)来估计时间;功能仿真(functional sumulation)由层次化的网表组成,最底层由Xilinx原语构成;
  • 实现后仿真:可以进行功能仿真和时序仿真,且与FPGA硬件上的工作情况最为接近,确保实现后设计满足功能和时序要求。

时序仿真相比功能仿真要耗费大量的时间,但是可以检测到功能仿真无法检测的问题,比如:

  • 由于属性设置(综合属性、UNISIM库属性等),或不同仿真器对语法的不同解释,导致综合后或实现后功能发生改变;
  • 双口RAM读写冲突;
  • 错误的、不合适的时序约束;
  • 异步路径操作问题;
  • 由于优化技术引起的功能问题

Vivado Simulator支持VHDL(IEEE-STD-1076-1993)、Verilog(IEEE-STD-1364-2001)、SystemVerilog中的可综合子集(IEEE-STD-1800-2009)三种硬件描述语言,此外还支持IEEE P1735加密标准。


使用TestBench和激励文件

TestBench也是由HDL语言代码编写,其实例化了需要仿真的设计,生成设计所需要的激励信号,监测设计输出结果并检查功能的正确性。一个简单的TestBench可以仅仅将激励顺序地加载到设计的输入管脚上;一个复杂的TestBench可能会包含子程序调用、从外部文件读取激励信号、条件化激励和其它更多复杂的结构。

下面是编写TestBench时极度推荐的一些注意事项:

  • **在Verilog TestBench中总是使用timescale规定时间,如`timescale 1ns/1ps;
  • 在仿真时间的0时刻,将所有的设计输入初始化位为一个确定的值;
  • 在综合后和实现后的时序仿真中,会自动触发全局置位/复位脉冲(GSR),这会让所有的寄存器在仿真的前100ns内锁定其值。因此在100ns之后再赋值激励数据;
  • 在全局置位、复位脉冲释放之前就确保时钟源已经开始工作。

二、Vivado Simulator基本操作

Vivado Simulator是一款硬件描述语言事件驱动的仿真器,支持功能仿真和时序仿真,支持VHDL、Verilog、SystemVerilog和混合语言仿真。点击运行仿真后,工具栏中显示了控制仿真过程的常用功能按钮:
这里写图片描述
这些控制功能依次是:

  • Restart:从0时刻开始重新运行仿真;
  • Run All:运行仿真一直到处理完所有event或遇到指令指示停止仿真 ;
  • Run For:按照设定的时间运行仿真,每点击一次都运行指定时长;
  • Step:运行仿真直到下一个HDL状态;
  • Break:暂停仿真运行;
  • Relaunch Simulation:重新编译仿真源文件且restart仿真,当修改了源代码并且保存了文件后,只需要Relaunch即可,而不必关闭仿真再重新打开运行。

Scope窗口

Vivado Simulator中将HDL设计中的一个层次划分称作一个scope,比如实例化一个设计单元便创建了一个scope。在Scope窗口中可以看到设计结构,选中一个scope后,该scope中所有的HDL对象都会显示在Object窗口中。可以选择将Object窗口中的对象添加到波形窗口中,这样便可以观察到设计中的内部信号。
这里写图片描述
Scope窗口中可以在Settings中设置显示哪种类型的scope,但注意当某一scope被关闭显示后,其内部的所有对象(不论什么类型)都会被隐藏。对某一scope右键,弹出菜单如下:
这里写图片描述

  • Add to Wave Window:将所有状态为可见的HDL对象添加到波形窗口,值从添加到仿真波形的时刻开始显示,想要显示插入之前的值,必须restart(注意不是relaunch,否则会耗费更多的时间);
  • Go to Source Code:打开定义选中scope的源代码;
  • Go to Instantiation Source Code:打开实例化选中实例的源代码(对于Verilog而言是module,对于VHDL而言是entity)
  • Log to Wave Database:可以选中记录当前scope的对象,或者记录当前scope的对象与所有下级的scope。相关数据会存储在project_name.sim/sim_1/behav目录下的wdb文件中。

Objects窗口

该窗口中显示了当前选中的scope所包含的HDL对象,不同类型或端口的对象显示为不同的图标,***在Settings中可以设置显示的类型:***
这里写图片描述
Object的右键菜单中有一些新的设置功能:

  • Show in Wave Window:在波形窗口中高亮选定的对象;
  • Radix:设置Objects窗口中选定对象的值的显示数字格式,包括默认、2进制(Binary)、16进制(Hexadecimal)、8进制(Octal)、ASCII码、无符号10进制(Unsigned Decimal)、带符号10进制(Signed Decimal)和符号量值(Signed Magnitude)。注意此处设置不会影响到波形窗口中的显示方式;
  • Defult Radix:设置Radix中Default所表示的值;
  • Show as Enumeration:显示SystemVerilog枚举信号的值,不选中时,枚举对象的值按radix的设置方式显示;
  • Force Constant:将选中对象的值强行定义为一个常量;
  • Force Clock:将选中对象强行设定为一个来回振荡的值(像时钟一样);
  • Remove Force:移除选定对象的所有Force设置。

Wave窗口

当运行仿真后,会自动打开一个波形窗口,默认显示仿真顶层模块中的HDL对象的波形配置。如果关闭了波形窗口,可以点击Window->Waveform重新打开。
这里写图片描述
窗口中的HDL对象和分组情况称作一个波形配置,可以将当前配置保存为wcfg文件,下次运行仿真时就不需要重新添加仿真对象或分组。窗口中还有游标、记号、时间尺等功能帮助设计者测量时间。右键菜单中有一些新的设置功能:

  • Show in Wave Window:在Object窗口中高亮选定的对象;
  • Find/Find Value:前者是搜寻某一对象,后者是搜索对象中的某一值;
  • Ungroup:拆分group或虚拟总线(virtual bus);
  • Rename/Name:前者设置用户自定义的对象显示名称,后者选中名称的显示方式:long(显示所处层次结构)、short(仅显示信号名称)、custom(Rename设置的名称);
  • Waveform Style:设置波形显示为数字方式或模拟方式;
  • Signal Color:设置波形的显示颜色;
  • Divider Color:设置隔离带的颜色;
  • Reverse Bit Order:将选定对象的数值bit显示顺序反转;
  • New Virtual Bus:将选定对象的bit组合为一个新的逻辑向量;
  • New Group:将选定对象添加到一个group中,可以像文件夹一样排列;
  • New Divider:在波形窗口中添加一个隔离带,将信号分开,便于观察。

Vivado Simulator会将配置(用户接口控制和Tcl命令)保存到仿真运行目录的xsimSettings.ini文件中,下次打开仿真时就会自动恢复相关设置。使用此功能时在Simulation Settings中关闭clean up simulation files,以防止重新运行仿真时配置文件被删除。如果想要恢复默认设置,则开启clean up simulation files,或直接删除xsimSettings.ini文件即可。

运行功能和时序仿真

工程创建好后,便可运行行为级仿真(behavioral simulation),在成功地综合和实现之后,可以运行功能仿真(functional simulation)和时序仿真(timing simulation)。在Flow Navigator中点击Run Simulation,弹出菜单中选择需要运行的仿真:
这里写图片描述

  • 综合后功能仿真:综合后,通用的逻辑转换为器件相关的原语,综合后功能仿真可以确保综合优化不会影响到设计的功能性。运行时,会生成一个功能网表,并使用UNISIM库。
  • 实现后功能仿真:实现后,设计已经在硬件中完成布局和布线工作,实现后功能仿真可以确保物理优化不会影响到设计的功能性。运行时,会生成一个功能网表,并使用UNISIM库。
  • 综合后时序仿真:该仿真使用器件模型中估算的时间延迟,并且不包括内部连线延迟。通用的逻辑转换为器件相关的原语后,可以使用估算的布线和组件间延迟。使用此仿真可以在实现之前查看潜在的时序严苛路径。
  • 实现后时序仿真:该仿真使用真实的时间延迟。使用该仿真来检查设计功能是否能工作在设定的速度上,可以检测出设计中未约束的路径、异步路径时序错误(比如异步复位)。

添加仿真启动脚本文件

设计者可以创建一个批处理文件,添加到工程中,其中的命令将在仿真开始后运行,常用的流程步骤如下所示:

  1. 创建一个包含仿真命令的Tcl脚本,比如如果想仿真运行到5μs,添加“run 5us”命令;如果想监测设计内部信号,将其添加到波形窗口中,添加“add_wave/top/I1/signalName”命令;
  2. 将脚本文件命名为post.tcl并保存;
  3. 将post.tcl文件以仿真源文件的形式添加到工程中,会显示在Sources窗口的Simulation文件夹下;
  4. 在仿真工具栏中点击“Relaunch”重新编译运行仿真,Vivado会自动读取并执行文件中的命令。

三、 Waveform功能详解

Vivado Simulator允许用户自定义波形显示方式,当前的显示状态称作波形配置。波形配置可以保存为WCFG文件,供以后使用。一个波形配置对应一个Wave窗口,没有保存的波形配置显示为untitled。打开仿真后,File菜单中有与波形配置相关的指令:
这里写图片描述

这些控制功能依次是:

  • New Waveform Configuration:创建一个新的波形配置,Vivado会打开一个新波形窗口,但是不包含任何HDL对象,设计者从Scope或Object窗口中人工添加;
  • Open Waveform Configuration:打开配置文件同时打开一个波形窗口,会显示存储在WCFG文件中对象的波形数据;
  • Saving a Wave Configuration:保存当前波形配置到WCFG文件中。

如果关闭了仿真,下次需要使用是只是想查看上次仿真的结果,而不是重新运行仿真,点击Flow菜单下的Open Static Simulation,选择WDB文件即可(在project.sim/sim_1/behav路径下)。静态仿真模式下,Vivado Simulator会从WDB文件中读取数据并显示。

运行仿真过程中,会将显示的HDL对象的波形活动、Sope窗口中的对象、Objects窗口中的对象存储到WDB文件中。但注意,Vivado不能打开2014.3版本之前创建的WDB文件。


窗口对象(wave object)

向波形配置中添加一个HDL对象,其实并不是直接添加该对象,Vivado会创建一个窗口对象,该对象与HDL对象有联系也有区别。借助此特性,一个HDL对象可以创建多个与其相关的窗口对象,且每个窗口对象的显示设置可以不同。比如一个用16进制显示,另一个用10进制显示。

由HDL对象而来的窗口对象称作设计窗口对象,除此之外,还有其它的对象类型:隔离带(divider)、群组(group)、虚拟总线(virtual buses),鼠标在信号上右键,选择NEW DIVIDER等。这些对象都是为了提高观察波形的便捷性,前两者示例如下图。虚拟总线是将多个信号组合为一个总线显示。
这里写图片描述
波形窗口中包含Name、Value和波形三部分。

  • Name默认显示为short形式,右键菜单中Rename指令可以创建custom名称,Name指令选择显示方式为short、long(显示对象所处层次路径)或custom。

  • Value根据格式和基数设置显示方式不同,注意波形窗口中的radix和Objects窗口中的radix设置只作用于各自的窗口。

默认Value显示的基数为16进制,想要改变默认设置,在波形窗口中点击Settings,选择一个Radix:
这里写图片描述
顺便再介绍下其它设置选项实现的功能效果:

  • Elide Setting:如果信号名字太长无法完整显示,该选项设置从哪边开始省略字符显示,包括left、middle和right。
  • Draw Waveform Shadow:选中,波形显示会带有阴影效果。
  • Show signal indices:选中,波形对象的Name左侧会显示对应的行数,并且可以拖动行数之间的横线来改变波形对象的高度。???????
  • Show grid lines:选中,波形窗口中会显示网格线。
  • Snap to Transition/Floating Ruler:与测量有关,具体在下文介绍。

在选中对象的右键菜单->Radix中可以设置单个信号的基数(应与该信号的本质相符),常见的基数已经非常熟悉。Radix还可以选择为Real,设计者可以在Real Setting中设置Value按指定的定点数或浮点数格式显示,提供了极大的便利性。

该功能非常实用,比如CORDIC IP核在计算arctan函数时,输出数据为带符号、小数点从MSB三位后的格式,只需要在这里设置相应格式,就可以直接显示为-pi~pi的范围,而不需要人工计算。
这里写图片描述


设置模拟波形显示方式

有时总线数据用模拟波形的方式观察更直观,但注意信号的Radix设置必须符合其本质,才能显示正确的波形。比如一个总线数据按带符号二进制补码编码,Radix必须设置为一种带符号格式;如果一个数据为浮点数格式,必须选择real并做正确的设置。

在对象右键->Waveform Style,可选择模拟(Analog)或数字(Digital)显示方式,Anolog Settings中可以设置模拟波形的显示方式。注意:模拟显示仅支持位宽不超过64Bits的总线。
这里写图片描述
下面介绍一下各选项的设置方法和效果:

  • Row Height:规定选中对象的显示高度,单位为像素点数目,相当于收缩或拉伸波形的高度(digital显示方式高度为20,analog显示高度默认为100)。
  • Y Range:规定波形区域的数值显示范围。Auto模式下根据当前的仿真时间内的值自动选择范围,且会随时间更新;Fixed设置固定的显示范围。
  • Interpolation Style:设置将数据点连成线的插值方式,Liner表示线性插值,Hold表示保持插值,两个点之间的数据会保持前一个点的数据值。
  • Off Scale:设置超出显示范围的波形该如何处理,Hide会隐藏超出范围的部分,Clip会超出范围为的部分限制在最大值/最小值(即削顶),overlap在超出范围时仍然会显示波形,但是波形会叠在其它波形对象上。
  • Horizontal Line:选中会在指定值处画一条水平线。

此外,某些总线信号的有效顺序可能与定义的Bit顺序相反,可以在右键菜单中选择“Reverse bit order”交换总线Bit顺序,如bus[7:0]交换后为bit[0:7],信号的值和波形也会跟着改变。

在时间刻度上右键,可以设置显示时间的方式,包括fs、ps、ns、us、ms、s,Auto会自动选择最适合的单位,Default表示HDL设计中规定的仿真精度。此外还有Samples以离散采样数值的方式显示,User为用户自定义的时间单位,但这两个设置对HDL无效。


观察波形辅助工具

上文提到窗口对象中还包括如下三类,来帮助设计观察仿真结果:

  • Group:一个Group相当于一个容器,将相关的波形对象组合在一个文件夹中。选中想要添加的对象,右键->New Group即可建立一个新组。注意选中group后delete会删除掉该组和内部所有的对象,如果只是想解散组,使用右键菜单中的Ungroup
  • Divider:divider用来隔离不同的HDL对象,点击信号的右键菜单中->New Divider,会在其下方创建一条隔离带,delete即可删除。
  • Virtual Bus:可以将多个标量或向量组合在一起作为虚拟总线显示,按顺序选中要添加的对象,右键->New Virtual Bus。同样delete会删除掉虚拟总线所有对象,仅删除虚拟总线应使用Ungroup

除此之外,Vivado还提供了一些其它特性帮助设计者分析波形中的数据:

1.光标

在波形上单击,会出现黄色的光标,称之为主光标;按住Shift键,再在另一个地方点击,会出现第二个光标,称之为辅助光标(虚线,会替换原主光标所在位置)。顶部会显示每个光标所处的时间点,底部有刻度尺且显示两者之间的时间差(显示刻度尺需要在设置中选中Floating Ruler)。单击波形窗口的任意地方,即可隐藏辅助光标。
这里写图片描述
如果设置中选中了Snap to Transition,拖动光标过程中会有一个根据数据转换状态变换的圈(不选中该功能始终为空心圈,不会变化)。空心圈○表示光标处在信号的两个过度点之间(过度点即为值发生改变的点);实心圈●表示光标位于过度点处或标记(marker)上。如下图所示:
这里写图片描述
通过此功能,设计者即可准确地将光标置于信号的边缘处。波形窗口工具栏中还有Previous TransitionNext Transition两个功能,可以改变光标位置到选定对象的前一个或后一个过度点。可以同时选中多个对象。

2.标记

标记(Marker)用来指示波形中设计者关心的重大事件,可以对与标记事件相关的时间进行测量。在窗口工具栏中点击Add Marker(如下图红框)添加标记,自动测量并显示标记与光标之间的时间差。
这里写图片描述
标记同样支持Snap to Transition功能,让设计者可以准确地标记信号边缘。在标记上右键,选中Delete Marke**r或**Delete All Markers即可删除标记。底部也会显示时间刻度尺辅助时间测量,0时刻从辅助光标开始,如果没有辅助光标会从选中的Marker处开始。

3.查找功能

右键菜单中Find/Find Value可分别用于查找某一对象或者选中对象中的特定值。空白框中输入带查找字符串,必须与设置的Radix相符,否则编辑框会变为红色提示错误(如十六进制就只能输入0-F)。
这里写图片描述

句号的点‘.’相当于通配符,如查找“1.2”,便会找到102、112等等。Match用于设置匹配模式,Beginning、End(以查找内容为开头或结尾)或Exact(精确值)。PreviousNext在结果之间切换,如果没有找到工具条会显示“Value not found”。

四、仿真中的Debug特性

Vivado Simulator提供了在仿真过程中debug设计的特性,通过为源代码添加一些可控制的执行条件来检查出问题的地方。总的来说有三种调试方法:

1.使用Step逐行调试

Step命令一次只执行HDL代码中的一行,从而验证和调试设计。运行仿真后,点击Run->Step或工具栏中的Step可执行该命令。Restart可以将时间复位到TestBench的开始。当前执行的代码会高亮显示并且前方有箭头指示:
这里写图片描述
运行Step后会打开与顶层设计单元相关的HDL文件窗口,在窗口名称上右键->新建水平分组新建垂直分组即可同时查看HDL和波形窗口。

2.使用断点(breakpoint)调试

Step调试的缺点是在大型设计中很繁琐且花费大量时间。设计者可以在源代码中自行指定运行停止的点,称为断点。运行仿真时,仿真器遇到断点就会暂停。可设置断点的行前有一个空心圈,点击可设置断点,转变为实心圈。
这里写图片描述
对应的Tcl命令为“add_bp file_name line_number”。仿真调试过程中,断点和Step调试是可以一起使用的。在实心圈上右键,或Run菜单中点击Delete All Breakpoints可以删除所有断点。

3.条件调试

在设计中添加条件断点,仿真器检测到条件为真时就会暂停当前仿真。条件必须用Tcl命令添加,示例如下:

add_condition   #命令模板
add_condition {reset == 1 && clk == 1} {puts “Reset went to high”; stop}
#当clk与reset同时为高暂停仿真,控制台打印消息输出
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

遇到条件断点并暂停后,只有等到下一个仿真命令才会继续运行仿真。


将对象强制到特定值

Vivado Simulator提供了Force功能将信号、wire或reg强制为某一值,该操作会重写信号定义在HDL设计中的行为。考虑如下应用情况:

  • TestBench中没有对某一信号进行驱动,可以使用Force功能给予激励;
  • Debug过程中使用Force纠正错误的值,以继续进行仿真分析。

使用Force Constant、Force Clock、Remove Clock相关命令配置Force功能,而且仿真restart后仍然会保留已经设置了的Force特性。

1.Force Constant功能

该命令会将信号固定为一个常数值,重写了其HDL代码中的赋值。在Objects窗口或波形窗口中选中某一对象,右键->Force Constant,打开如下窗口:
这里写图片描述
Force value按照value radix选择的基数设置常数值;设置的值开始于Starting after time offset设置的时间,如果不带单位则默认为ns;Cancel after time offset设置的时间后会取消应用Force功能。

2.Force Clock功能

该命令会使信号以一定速率在两个值之间来回转换,类似于时钟信号一样(但不局限于生成时钟信号,可以定义任意振荡的值)。在Objects窗口或波形窗口中选中某一对象,右键->Force Constant,打开如下窗口:
这里写图片描述
Leading edge valueTrailing edge value分别指定两个振荡状态的值;Duty cyclePeriod设置占空比和周期。右键菜单中的Remove Force用来清除设置。灵活使用Force特性可以加快设计仿真的调试验证,而不需要修改HDL代码。

你可能感兴趣的:(#,Xilinx/FPGA,xilinx,Vivado)