原创 第 2 章 行为级仿真

2009-11-19 20:49 4228 4 4 分类: FPGA/CPLD

第 2 章 行为级仿真






2.1 行为级仿真简介



当设计完成后,为了验证功能是否正确,设计者必须对其设计源文件进行仿真。因为 这时的设计文件为行为级的 HDL 文件,故称此仿真称为行为级仿真。当设计源文件经过行 为综合,或手工编写,转换为 RTL 级设计文件后,设计者还必须进行 RTL 级仿真。因为 RTL 级仿真与行为级仿真在具体操作上没什么区别,本文将不再讲述 RTL 级仿真。
 2.1.1工具介绍:
synopsys 提供了数个仿真工具: Scirocco 、 VHDL  仿真工具、 Verilog  仿真工具。 不同的仿真工具有不同用途和各自的优点。
1.   Scirocco
Scirocco 为 RTL0 级功能验证提供最快最高性能的 VHDL 仿真。 Scirocco 既支持基于 周期( cycle-based )的仿真也支持事件驱动( event-driven )的仿真。 Scirocco 使基 于周期(cycle-based)的仿真有着事件驱动(event-driven)仿真的灵活性。这个技术为综合 的设计优化提供了最佳性能。它支持混合语言仿真。 Scirocco 支持各级的设计描述,但只 对行为级和寄存器级进行优化。 Scirocco 支持后仿真机制。支持多语言,多平台,多仿真 器。 Scirocco 有强大的纠错能力。
后仿真机制:就是通过把 VCD(a VALUE Change Dump)历史文件作为输入,对事件驱动 仿真不再进行调试,而直接分析 VCD 文件里记录的仿真结果。
2.   VHDL  仿真工具
VHDL  仿真工具用于 Synopsys 高级设计学的功能验证阶段。它包括 Synopsys 系统仿真
器(VSS)和 Cyclone 。 VSS 是一个事件驱动仿真器, Cyclone 是一个基于周期的仿真器。
VSS 和 Cyclone 都可用于确认和验证寄存器级设计, VSS 还可用于验证门级设计。 VHDL 仿
真器工具顾名思义只能对 VHDL 设计进行仿真,但是它可以产生 Verilog 目标文件,使其可
用于 VCS(Verilog Compiled Simulator) 仿真器。同样对于 Verilog 设计,设计者也可通
过 VCS 仿真器产生 VHDL 目标文件,使其用于 VSS 仿真器。这样就解决了混合语言仿真的问
题。
基于周期仿真器:只在每个时钟的有效沿计算设计源代码的值,而对每个周期内的其 他时序信息不与考虑,即对时钟周期间的事件不进行仿真。信号在时钟沿是被假设为稳定 的,因此建立时间,保持时间,脉冲宽度的违约现象都被忽略。虽然两个时钟沿间的信号 和时序信息被忽略了,但是它大大加快了仿真的速度和俭省了内存空间。对复杂的大型设 计,这种仿真机制有着很大的优势。
事件驱动仿真器:在单个周期内,信号值在最后稳定之前,于逻辑路径的任何一点都 可能改变数次。每当某个事件发生,仿真器就对信号值更新一次。仿真器在整个时钟周期 都描绘出所有信号的值。
基于周期仿真和事件驱动仿真的区别如图 2.1 所示:

2009102615424323794.jpg


 


图 2.1 事件驱动与基于周期仿真的区别


1)   VSS 介绍
VSS 是一种贯穿从概念到 ASIC sign off 的功能强大的仿真器。它可以用于仿真和调 试综合前和综合后行为级,寄存器级和门级描述的 VHDL 设计。它是一个复杂的事件驱动仿 真器。虽然高级设计的三个设计发展阶段:概念确认阶段,功能验证阶段,执行验证阶段, VSS 都可以使用,但是它更适合于概念确认阶段和执行验证阶段(门级仿真)。
它有三种仿真机制:
Interpreted  : 具有充分的内嵌交互调试特性
Compiled  : 具有最快的 RTL 和行为级仿真速度
Gate-level  : 快速门级仿真和 ASIC  sign off 验证
VSS 核心程序: VHDL 分析器(vhdl  -event)、 VHDL 库分析器(liban)、 VHDL 仿真器 (vhdlsim)、 VHDL 调试器(vhdldbx)、波形观察器(waves)。
2)   Cyclone 介绍:
Cyclone 是一个快而功能强大的基于周期的仿真器。它直接计算和仿真 RTL 级源代码,
而不是在仿真前先把  RTL  级代码综合成门级电路。它使用简单的逻辑和强度值。它把
std_logic package 里定义的 9 状态逻辑转换成了 2 状态逻辑(0 , 1 , Z)或 3 状态逻辑(0 ,1 , X , Z)。它映射 L , H , W 弱逻辑状态为 0 , 1 , X 强逻辑状态,减少了仿真时逻辑值的数目。它忽略了逻辑延时值。 Cyclone 有着比 VSS 更高的性能和更少的运行仿真时间。
在功能验证阶段,设计模型较稳定,仿真次数较少(同概念确认阶段相比)。 Cyclone 就是
为这种较稳定模型的的冗长测试优化的。而且它具有良好的直觉性和交互性的调试性能,
方便了设计者在功能验证阶段修改其设计。 Cyclone 与 Synopsys 的综合工具紧密的结合在
一起,它将影响 HDL 源代码,使其更适合于综合。因此在 RTL 功能验证阶段,建议使用 Cyclone 仿真器。
1.   Verilog  仿真工具
Verilog 仿真工具的具体应用和 VHDL 仿真工具类似,只不过它只适用于 Verilog 源代 码的仿真,而 VHDL 仿真器只适合于 VHDL 源代码的仿真。 Verilog 仿真工具的仿真器为 VCS(Verilog Compiled Simulator)。它的具体介绍略。
以上各种软件的使用大同小异,特别是仿真命令几乎没什幺区别。其中有点需要注意 的是:  Scirocco 与其他仿真工具在流程上有点小区别。那就是 Scirocco 因为即支持基于 周期的仿真又支持事件驱动的仿真,所以在它用混合模式分析源文件后,进行混合模式仿 真前,需要产生分块文件给它进行分块处理。如果不对需要进行基于周期仿真的顶层设计用 分块命令语句指定,它将以事件驱动模式运行。分块命令语句为:
cycle  [option] design_root
(design_root 为顶层设计的 configuration-name)。 下面的介绍我们主要以 VHDL 仿真工具中的 VSS 为例。
2.1.2  系统行为级仿真流程(如图 2.2 所示)


2009102615434617558.jpg


图 2.2 系统行为级仿真设计流程
1.   新建 setup 文件
VHDL 仿真工具的 setup 文件.synopsys_vss.setup 指定了你的 VHDL 设计库名与实际 的 UNIX 目录的映射关系,建立了你的查找路径,并给仿真控制变量赋值。
2.   建立设计库
设计库用于存放源程序分析后的中间文件和设计所的 reference 库。
3.   得到 VHDL 源文件
4.   分析 VHDL 源文件
VHDL 分析器检查 VHDL 源文件的句法和语法错误。经检查没有错误的 VHDL 源文件转换 为中间格式的文件存放于设计库中。
5.   设计仿真
VHDL 仿真器根据设计库里的中间文件建立完整的层次结构,计算仿真值。
6.   显示和分析结果
利用波形观察器观察和分析仿真结果。
7.   验证仿真的 coverage
coverage 文件(.cov)列出了 VHDL 源文件每一行源代码的执行时间数。通过这些信息 可以验证设计瓶颈和未被激励的面积。
2.2    setup 文件
仿真工具在每一次启动的时候都将读一次定义了环境变量的 setup 文件。 VHDL 仿真工
具有着三个同名的 setup 文件。一个为安装目录下的 setup 文件。它定义了缺省环境。一
个为你的根目录下的 setup 文件,它定义了了你所有设计的共同 setup 信息。一个为你工
2.3 建立设计库


 


作目录下的 setup 文件,它定义了你这个设计的 setup 信息。当你启动仿真工具时它依次 从你的安装目录,你的根目录,你的工作目录读入这三个 setup 文件。最后读的 setup 文 件有最高的优先权,即相同的变量定义,后面读入的 setup 文件定义将覆盖前面的 setup 文件的定义。
如果想察看 setup 文件定义的变量可用命令 show_setup 列出所有变量。
2.2.1    Setup 文件的编辑
setup 文件的一个简单样本:
 WORK  > LIB1
LIB1  : user/design/lib1
TIMEBASE  = ns
设计库的映射:
library_logical_name  > design_library_name
design_library_name  : host_directory_name
library logical name :是指你在 VHDL 源文件中库语句所写的库名,既 LIBRARY , USE 语句中的库名。
design_library_name :是指仿真工具使用的中间库名。
host_directory_name :是指你的库所存放的实际目录  。
如:上华的库 csmc06 我们放在根目录的 csmchdlib 子目录下。我们任取一个 有效的 design library name—libs ,则设计库的映射写为:
csmc06  > libs
libs  :  /home/usr/csmchdlib
有关设计库映射的详细说明请见建立设计库那一节。 变量定义
variable_name  = VALUE
 如:TIMEBASE  = ns
 其他常用命令
如果你的命令需要续行请用续行符号  “\”
如: libs:  /home/usr/ggh/sample_projects/example  \
 /debugger/lib1
如果你要注释一个语句,请用注释符  “-  -“ 如:--this is time base
注意:如果你想改变你的仿真精度,则修改你的 TIMEBASE 变量。 建立设计库
设计库用于存放设计分析后的中间文件,仿真器从设计库里取出中间文件仿真。
设计库还用于存放你的设计所引用的 reference 库, reference 库在你的 VHDL 源文件 里用库语句说明(USE, LIBRARY)。
设计库有三个名字: a logical name, a library name, a physical name 。
a logical name :是 VHDL 源文件里调用的库的名字,既 library , use 语句里指明的 库名。
a library name :是仿真工具使用的中间库名,它映射库的 logical name 到 physical name 。
a physical name :是你实际的主机上目录,它用于存放你的分析后的中间文件,或你 的资源库。


它们的关系如图 2.3 所示:


 2009102615450224863.jpg


图 2.3 三个设计库的关系


设计库有两种,一种为存放仿真分析后的中间文件的工作库(work library),一种为存 放你的设计调用的库的资源库(resource library)。
当你想改变你的 VHDL 源文件中调用的库时,我们可以通过改变 setup 文件中设计库的 映射来方便的实现。既我们不用改变 VHDL 源文件中 LIBRARY 语句。而是在 setup 文件中更 改设计库的 design library name 和 design physical name ,使其映射到新的目录,从而 达到了改变 VHDL 源文件所调用的库的目的。
创建 work  library
work library 的约定 design logical name 为 WORK ,当然我们也可在调用 VHDL 分 析器的命令中利用-work 选项覆盖这个缺省的 design logical name 。我们任选一个合法的 design library name ,把 logical name 映射到这个名字:
WORK  > design_library_name 。
我们再创建一个系统目录作为 design physical name ,在 setup 文件中把这系统目录映射 到 design library name : design_library_name : design_physical_name 。这就完成了 work library 的创建。
创建 resource  library
根据 VHDL 源文件中 LIBRARY 语句指定的库名,我们得到 design logical name 。如: LIBRARY csmc06 ,则这 csmc06 就是我们的 design logical name 。然后我们任意指定一个 合法的 design library name, 在 setup 文件中把 design logical name 映射到 library name: design_logical_name > design_library_name 。再我们找到这资源库所存放的目录, 把其作为我们的 design physical name  ,在 setup 文件中映射: design_library_name  : design_physical_name 。这就完成了 resource library 的创建。
特别注意:
a design library name 必须映射到一个存在的目录,而不是一个空目录,否则 VHDL 分析器在分析源文件的时候将报错,且停下来。
我们分析完源文件,在对中间文件进行仿真前,不能更改 setup 文件中设计库的映射 关系,否则仿真器将会找不到你的设计。
一个 design library name 只能对应一个目录。如果你的设计库有多个名字。请用多 个 design logical name 与之对应。
设计分析
调用 VHDL 分析器对设计源文件进行分析,我们可以使用 vhdlan 或 gvan 命令。 vhdlan 命令格式: vhdlan  [options] filename_list
例如我们分析 mux.vhd 文件
%vhdlan mux.vhd
gvan 命令格式: gvan  [options] filename_list
vhdlan 支持基于周期的仿真(-cycle)和事件驱动的仿真(-event),但是-cycle  的分 析必须是用 Cyclone 仿真器进行仿真。
gvan 命令调用  VHDL 分析器的图形界面,它把所有它检查到的错误都显示在错误浏览


窗口里。 gvan 命令不支持基于周期的仿真。
2.4.1    simdepends
当你的设计源代码或工作环境有所改变时,必须先重新分析这有改变的源文件,同时
也要重新分析包含了这设计单元的其他源文件,对于一个庞大而复杂的设计来说,要找出
这些有关联的源文件是一件非常困难的事。分析器的 simdepends  应用帮助你解决了这麻
烦。 simdepends 列出了所有你相互之间有关联的文件列单,并且在重新分析源文件的同时
帮你自动重新分析相关联的源文件。它的输出文件就是 UNIX 中的 makefile 文件。
运行 simdepends 产生依赖文件列单命令: simdepends  [options] design_unit
注意:这里的  design_unit  必须是你的顶层设计单元,可以是  configuration  , package , entity 。
simdepends 的使用步骤如下:
a)   用 vhdlan 或 gvan 分析你的设计: gvan design1 design2 design3  ……
b)   运行 simdepends 产生依赖列单: simdepends  -o makefile top_design_unit
c)   仿真你的设计:
d)   修改你的设计:
e)   使用 UNIX 的 make 命令重新分析你的源文件和相关的源文件:
 make ANALYZER="gvan" all
2.4.2    simcompiled
如果你是为 compiled 模式仿真分析源文件,且想知道将来哪个 compiled 选项在这个 设计单元中使用,则在这个  design  unit  上调用  simcompiled,它将为你提供这方面的 compiled 仿真消息。命令为:
simcompiled  [options] design_unit [-u design_unit]
设计的仿真与结果分析
仿真机制
VSS 提供三种仿真机制:
Interpreted:
拥有强大的调试性能,在仿真过程中可以设置 monitors 和断点。它的调试可以是源代 码级的,例如它可以监测变量和设计模块(block)中的源代码。
Compiled:    利用  compiled  模块最大化你的仿真速度。但是它只支持少数的调试功 能,例如不能设置断点。
优化了的 FTGS 门级(Gate-Level):
精确的门级仿真,优化了的 FTGS 门级仿真机制利用 ASIC 供应商的门级模型,精确的 仿真设计中的物理器件。
在设计的早期,设计者需经常修改设计,建议使用 Interpreted 机制。当设计稳定下 来以后,为加快仿真速度,建议使用 Compiled 机制。当然也可使用混合仿真机制,对未稳 定的设计部分使用 Interpreted 机制,稳定了的设计部分使用 Compiled 机制。对于综合后 的门级仿真和 ASIC 的完成验证当然是使用 Gate-Level 机制。
何时使用何种仿真机制, VSS 根据你的设计文件自动调用。例如目标文件(.o)VSS 自 动 调 用  Compiled  机 制 , 但 是 你 也 可 以 利 用    蔽 调 试 功 能 对 已 编 译 设 计 强 制 使 用 Interpreted 机制来进行进一步的调试。要使用   蔽调试功能在启动 VSS 时加上-fi 或者fi_all 选项即可。
2.5.2    VSS 的启动
启动 VSS 可以有两中方法,一种是 vhdlsim ,使用命令行界面;一种是 vhdldbx,使用 图形窗口界面。
调 用  vhdldbx:  %vhdldbx  [options]  design  或 %vhdldbx  & 再 在  Vhdldbx-Select Simulator Arguments 窗口中选择仿真单元。
调用 vhdlsim:  %vhdlsim  [options] design  显示命令行提示符  #
design  可以是[libname]cfgname,也可以是[libname]  entname,[libname]  entname archname 。较常用的是[libname] cfgname 。
options 中有很多的选项和 setup 文件中定义的变量功能是相同的, options 中的变
量优先级高于 setup 文件中的变量,即 options 的定义将覆盖 setup 文件中的变量定义。
2.5.3 常  常
Pg12Pg12


 


行为级仿真 7


常用 options:
-i filename      启动时调用命令文件 filename
-e filename      启动时调用命令文件,同时显示执行的命令 -sdf filename.sdf      读入 SDF 文件。
常用的命令行命令:
run  [n] 运行 n 个时间单位
trace  [options] object_name_list 绘出 name 的波形在波形观察器里
ls [name] 列出 name 匹配的对象
cd region 改变当前工作域
quit 结束仿真
restart 重启
include filename 调用命令文件 filename
help topic 特定主题和命令的帮助
assign  (VHDL_expression)  {VHDL_object_name}    给对象赋值
evaluate vhdl_expression_list 计算并显示表达式的值
statue  [-t]  {process_name|dignal_name} 列出准备运行或等待事件发生的进程
调用命令文件的方法有四:
# include filename
或% vhdlsim  -i filename design_unit
或% vhdlsim  -e filename design_unit  /*执行时显示命令*/
或在. Synopsys_vss.setup 文件中设置: RUNREAD  = filename VSS ,则每次调用都 执行这个文件。如果调用 VSS 时使用- i filename , VSS 先执行 RUNREAD 指定的文件,再 执行-i filename 指定的文件。
得到 configuration informations:  # environment  > sim_config
#  !show_setup  >> sim_config
暂时逃到操作系统执行数条命令方法:
#!
First command
Second command


last command
exit
#
纠错:# help vss-error_number
得到变量的值:$ variable
显示变量的值: echo  $variable
设置变量的值: set      如: set PROMPT  ^>  ^
产生用户定义的变量:如: set MY_REGION  /CPU/alu/addwe/nand2
产生波形文件(.ow ),在 setup 文件中设置: WAVEFORM="wif" ,同时调用 Waveform Viewer 则设置为: WAVEFORM="wif"+waves
产生命令过程:    # comm name
>first command
>  .
>  .
> end
#
运行的话,只需打入过程的名字就行了。
产生监测(monitors):    monitor  [options] condition 编辑 monitors:  #edit monitor_name
2.6 设  设
Pg13Pg13


 


行为级仿真 8


重导 monitor 的输出: redirect device_tag monitor_list
coverage  -- 计算和显示在 interpreted simulation 中执行的 VHDL 源代码的每一行
的时间数
#coverage  [options]  [vhdl_source_file_list] /*产生*/
% coverage  [options]  {filename} /*调用*/
VCD(a VALUE Change Dump) 文件:包含有时间量程,范围定义,堆放了的时间类型和 随着时间的增加实际值的改变等信息的 ASCII 文件。
产生常规的 VCD file:
启动 vhdlsim  ,
执行  vcdfiel  vcdcomment,vcdaddobjectsvcddumpobjects 和其他 SCL  命
令。
产生扩展的 VCD fi 文件同上。 SCL 命令不同: vcdaddports 等 也可同时产生这两个文件,用 vcdon  ,vcdoff,vcdlimit 等
使用 WIF 文件作为激励文件:
% vhdlsim  -iw input_wif_filename.ow design_name
产生 SAIF(a Switching Activity Interchange Format) 文件  :
% vhdlsim  -saiffile alarm_clock_saif cfg_tb_top_behavioral 设计实例
对于 I2C , DDFS , couter 等涉及来说,操作的方法相同,由于篇幅的限制,本文只 介绍 DDFS 设计。
实例: DDFS 设计源文件:
ddfs.vhd,froma.vhd,fromb.vhd,croma.vhd,cromb.vhd(注意这里的 VHDL 源文件不要 忘了加 configuration 。)
testbench 文件为 DDFS_TB  (源文件见附录)
1. 仿真前准备
转到工作目录,设工作目录为/home/usr/design
% cd /home/usr/design
% mkdir vhdl
把设计源文件存放在 vhdl/目录下
2. 创建 setup 文件
在工作目录下创建 setup 文件, setup 文件的内容如下: WORK  > DEFAULT
DEFAULT  : work
TIMEBASE  = ps
3. 创建设计库
% mkdir work
4. 设计分析
产生设计分析的命令文件 analyze1.sh,内容为:
 #!/bin/sh  -f
vhdlan  -event \
vhdl/ddfs.vhd  \
vhdl/froma.vhd  \
vhdl/fromb.vhd  \
vhdl/croma.vhd  \
vhdl/cromb.vhd  \
vhdl/DDFS_TB.vhd
注;更好的命令文件是把创建设计库也写在里面,其内容见附录。 执行命令文件,对源文件进行分析:
% analyze1.sh
5.  设计调用仿真器进行设计仿真
产生仿真命令文件 simfile ,其最基本的内容为:
Pg14Pg14


 


行为级仿真 9


trace  -wif  -waves  /DDFS__TB/*’signal run  10000000
注:在这命令文件里,如果你想观察波形文件的话,切记不要写上 quit  ,因为退出 vhdlsim 后,波形观察器同时也是关闭的。
调用 vhdlsim 仿真器进行仿真;
% vhdlsim  -i simfile TESTBENCH_FOR_DDFS
注: TESTBENCH_FOR_DDFS 为 testbench 文件的 configuration 的名字。 仿真结果如图 2.4 所示:


 


 


 


 


 


 


 


 


 


 


 



图 2.4 行为级仿真结果


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条