1、第三章 Cadence仿真器,学习内容 逻辑仿真算法 如何启动Verilog-XL和NC Verilog仿真器 如何显示波形,仿真算法,主要有三种仿真算法 基于时间的(SPICE仿真器) 基于事件的(Verilog-XL和NC Verilog仿真器) 基于周期的(cycle),仿真算法,基于时间的算法用于处理连续的时间及变量 在每一个时间点对所有电路元件进行计算 效率低。在一个时间点只有约210%的电路活动 基于事件的算法处理离散的时间、状态和变量 只有电路状态发生变化时才进行处理,只模拟哪些可能引起电路状态改变的元件。仿真器响应输入引脚上的事件,并将值在电路中向前传播。 是应用最为广泛的仿真
2、算法 效率高。“evaluate when necessary” 基于周期的仿真以时钟周期为处理单位(与时间无关) 只在时钟边沿进行计算,不管时钟周期内的时序 使用两值逻辑 (1, 0) 只关心电路功能而不关心时序,对于大型设计,效率高 仅适用于同步电路。,基于事件仿真的时轮(time wheel),仿真器在编译数据结构时建立一个事件队列。 只有当前时间片中所有事件都处理完成后,时间才能向前。 仿真从时间0开始,而且时轮只能向前推进。只有时间0的事件处理完后才能进入下一时片。 在同一个时间片内发生的事件在硬件上是并行的 理论上时间片可以无限。但实际上受硬件及软件的限制。,一个时间片的事件可引起
3、新的事件,在当前时片或以后,时间片 timeslice,Cadence Verilog仿真器,Verilog-XL和NC Verilog仿真器都是基于事件算法的仿真器。仿真器读入Verilog HDL描述并进行仿真以反映实际硬件的行为。Verilog-XL和NC Verilog仿真器遵循IEEE 1364 Verilog规范制定的基于事件的调度语义仿真器可用于 确定想法的可行性 用不同的方法解决设计问题 功能验证 确定设计错误,仿真过程,Verilog仿真分下列步骤: 编译 读入设计描述,处理编译指导(compiler directive),建立一个数据结构定义设计的层次结构 这一步有时分为两
4、步:compilation,elaboration 初始化 参数初始化;没有驱动的Net缺省值为Z;其它节点初始值为X。这些值延着设计层次传播。 仿真 刚开始时间为0时,仿真器将initial和always中的语句执行一次,遇到有时序控制时停止。这些赋值可产生在时间0或其后时间的事件。 随着时间推进,被调度事件的执行引起更多的调度事件,直至仿真结束。,Versus 交互式编译仿真器,Verilog-XL是一个交互式仿真器,过程如下: 读入Verilog描述,进行语义语法检查,处理编译指导(compiler directive) 在内存中将设计编译为中间格式,将所有模块和实例组装成层次结构(设计
5、数据结构)。源代码中的每个元件都被重新表示并能在产生的数据结构 找到。 决定仿真的时间精度,在内存中构造一个事件队列的时间数据结构(时轮) 。 读入、调度并根据事件执行每一个语句,Verilog-XL采用多种加速算法提高各种抽象级的仿真速度。 每次重新启动Verilog-XL,将重复上述步骤。 当进入交互模式时,可以输入Verilog HDL语句并加到设计的数据结构中。,Versus 交互式编译仿真,Verilog-XL仿真器是与Verilog HDL同时开发的,因此它成为Verilog HDL仿真器的事实上的标准。Verilog-XL采用了多种加速算法,对每种抽象级描述都能很好的仿真。这些加
6、速算法包括Turbo算法,XL算法及Switch-XL算法。在后面的教程中将对这些算法进行更为详尽的介绍。,NC Verilog-全编译仿真,NC Verilog是全编译仿真器,它直接将Verilog代码编译为机器码执行。其过程为: ncvlog编译Verilog源文件,按照编译指导(compile directive)检查语义及语法,产生中间数据。 ncelab按照设计指示构造设计的数据结构,产生可执行代码。除非对优化进行限制,否则源代码中的元件(element)可能被优化丢失。产生中间数据。 ncsim启动仿真核。核调入设计的数据结构,构造事件序列(时轮),调度并执行事件的机器码。有些事件
7、可能消失(从不执行)除非限制优化过程。,编译后的所有代码的执行使用同一个核。 当重新启动仿真时,要对修改过的模块重新编译。省略这个手工过程的方法是直接对设计进行仿真,这将自动地对修改过的模块进行重新编译。 当采用交互模式时,可以使用Tcl命令和针对NC Verilog的Tcl扩展命令。,NC Verilog全编译仿真,NC Verilog是最近才开发的,但其对描述的仿真与Verilog-XL完全相同 NC Verilog仿真器用同一个核(kernel)对所有抽象级进行混合仿真,也就是说用户可以采用各种不同抽象级混合设计。但在门级仿真的效率差一些。 NC Verilog仿真器对源代码采用增量编译
8、方式,减少了编译时间。 在交互模式下,可以使用Tcl命令及其针对NC Verilog的扩展命令来修改设计和控制仿真。这将在后面进行详细描述。,对Verilog语言的支持,Verilog-XL和NC Verilog计划支持Verilog语言全集。用户可依据下列标准进行设计: IEEE1364-1995 Verilog语言参考手册 OVI 2.0 Verilog语言参考手册,但不支持: Attributes: Verilog描述中对象的属性。 函数中output或inout变元(argument):OVI2.0允许函数中output和inout变元值能够返回。,启动Verilog-XL,在命令窗口
9、启动Verilog-XL:verilog verilog-xl_options design_files 没有option启动的例子verilog mux.v test.v 使用 c选项只对设计进行语法和连接检查verilog c mux.v test.v 使用-f选项指定一个包含命令行参数的文件verilog f run.frun.f文件的内容Verilog-XL将所有终端输出保存到名为verilog.log的文件,mux.v test.v -c,启动NC Verilog,虽然NC Verilog仿真过程包括三个分立的步骤(ncvlog, ncelab, ncsim),但仿真时不需要三个命令
10、,可以用带有命令行参数的ncverilog命令启动NC Verilog:ncverilog ncverilog_options verilog-xl_arguments Examples: ncverilog mux.v test.v ncverilog c mux.v test.v ncverilog f run.frun.f文件的内容NC Verilog将所有终端输出保存到名为ncverilog.log的文件,mux.v test.v -c,NC Verilog有什么不同?,除+gui、-q和-s这些只影响运行时间的参数外,其它任何命令行参数的改变将使设计重新编译、elaborate及仿真
11、。 如果更新了源文件及仿真时用到的SDF文件,则与它们相关的文件将重新编译,设计也将重新elaborate和仿真。,NC Verilog为编译的元件及其它文件建立一个库结构。增量编译依赖于源文件、SDF文件和命令行参数。,ncverilog还有其它一些命令行参数,如,在调试时有完全的读、写及连接操作,用+access + argumentncverilog f run.f + access+RWC 要得到源文件行操作能力,用+linedebugncverilog -f run.f +linedebug 强制重编译所有设计单元,使用+noupdate,NC Verilog有什么不同?,使用+ac
12、cess选项可以设置对所有对象的缺省操作。对象的缺省设置是无操作。用+access+打开操作,+access-关掉操作。args可以是R、W、C的任何组合。使用+linedebug可以打开R、W、C,同时可对源文件行进行操作,如在行上设置一断点。使用+noupdate强制重编译整个设计。缺省时只重新编译修改过的文件。只有当库可能被破坏时才这样做。+gui选项启动图形界面;-q选项抑制标识信息;-s选项使仿真器在时间0时停止,进入交互模式。,波形显示工具SignalScan, signalscan & 或 signalscan 数据库文件名 &,波形显示工具SignalScan,Title Ba
13、r:显示这是SignalScan窗口并以数字编号。若启动几个SignalScan窗口它们将顺序编号。 Menu Bar:通过菜单可以执行所有基本命令。 Tool Bar中的按钮有:copy, cut, paste, undo, delete, zoom, create marker, expand buses, launch the Design Brower等等。用户可以自定义。,在命令行输入signalscan启动。SignalScan窗口包括:,注:必须用Design Brower在波形窗口中添加信号。,Groups Pane列出用户建立的波形组 Waveforms Region显示加入
14、信号的波形 Names Pane在波形的左边显示信号名。这些信号名可以拖拽,在pane中双击右键可以移动插入的marker Time-Display Region显示两个指针的时间值及其时间差,SHM:波形数据库,波形显示工具从数据库,如SHM数据库中读取数据。使用下面的系统任务可以对SHM数据库进行操作:,例子: initial begin$shm_open(“lab.shm”);$shm_probe(); end,SHM:波形数据库,仿真历史管理器(Simulation History Manager,SHM)数据库记录用户的设计在仿真时数据信号的变化。只记录用户要观察(probe)的信号
15、。用户可以用$shm_系统任务打开一个SHM数据库,设置信号探针并将结果保存到数据库中。这些系统任务的功能除$shm_probe外都非常直观。对$shm_probe将在下面详细讨论。用户必须在仿真前(时间0前)设置探针信号才能看到信号在仿真过程中全部变化。,用$shm_probe设置信号探针,在$shm_probe中使用scope/node对作为参数。参数可以使用缺省值或两个参数都设置。例如:$shm_probe( ); 观测当前范围(scope)所有端口$shm_probe(“A”); 观测当前范围所有节点$shm_probe(alu, adder); 观测实例alu和adder的所有端口$
16、shm_probe(“S”, top.alu, “AC”); 观测:(1): 当前范围及其以下所有端口,除库单元(2):top.alu模块及其以下所有节点,包括库单元,用$shm_probe设置信号探针,$shm_probe的语法:$shm_probe(scope0, node0, scope1, node1, .);每个node都是基于前面scope的说明(层次化的)scope参数缺省值为当前范围(scope)。node参数缺省值为指定范围的所有输入、输出及输入输出。,相关工具,Affirma NC VHDL仿真器 Envisia Ambit综合工具 Verilog-XL故障仿真器, 用于评
17、价用户测试向量的有效性 SignalScan-TX图形界面调试工具包 Affirma equivalence checker完成门级设计之间或门级与RTL级之间的静态功能验证 Affirma model checker形式验证工具,将Verilog或VHDL描述与设计说明进行验证 Affirma model packager,用户的Verilog, VHDL或C语言可执行模型分发时进行编译及分发许可证 Affirma Advanced Analysis Environment includes CoverScan, a code profiler, and HAL, a lint checke
18、r,与Cadence Verilog仿真器相关的工具有:,总结,逻辑仿真 运行Verilog-XL和NC Verilog仿真器 探测及显示波形,本章学习内容,复习,基于事件的仿真器是如何做到并行的? 时间t的事件能否调度同一时间t的事件? NC Verilog仿真器不支持IEEE 1364 Verilog LRM的什么元件?,通过调度在一个给定的时间片内发生的所有事件来得到并行性。实际上仿真器串行处理给定时间片内的事件,但理论上它们都是在同一时间片内发生的。 任何时间片的事件能够调度在同一时间片或其以后产生的事件。 NC Verilog希望支持IEEE 1364 LRM规范全集。目前主要还不支
19、持实例阵列(array of instances)。请参见产品发布手册。,第四章 设计举例,进一步学习Verilog的结构描述和行为描述 Verilog混合(抽象)级仿真,学习目标:,语言的主要特点,module(模块),module能够表示: 物理块,如IC或ASIC单元 逻辑块,如一个CPU设计的ALU部分 整个系统 每一个模块的描述从关键词module开始,有一个名称(如SN74LS74,DFF,ALU等等),由关键词endmodule结束。,module是层次化设计的基本构件,逻辑描述放在module内部,语言的主要特点模块端口(module ports),端口在模块名字后的括号中列出
20、,端口可以说明为input, output及inout,端口等价于硬件的引脚(pin),注意模块的名称DFF,端口列表及说明 模块通过端口与外部通信,语言的主要特点,模块实例化(module instances),module DFF (d, clk, clr, q, qb);endmodulemodule REG4( d, clk, clr, q, qb);output 3: 0 q, qb;input 3: 0 d;input clk, clr;DFF d0 (d 0, clk, clr, q 0, qb 0);DFF d1 (d 1, clk, clr, q 1, qb 1);DFF d
21、2 (d 2, clk, clr, q 2, qb 2);DFF d3 (d 3, clk, clr, q 3, qb 3); endmodule,语言的主要特点,可以将模块的实例通过端口连接起来构成一个大的系统或元件。 在上面的例子中,REG4有模块DFF的四个实例。注意,每个实例都有自己的名字(d0, d1, d2, d3)。实例名是每个对象唯一的标记,通过这个标记可以查看每个实例的内部。 实例中端口的次序与模块定义的次序相同。 模块实例化与调用程序不同。每个实例都是模块的一个完全的拷贝,相互独立、并行。,模块实例化(module instances),一个完整的简单例子 test fix
22、ture,被测试器件DUT是一个二选一多路器。测试装置(test fixture)提供测试激励及验证机制。 Test fixture使用行为级描述,DUT采用门级描述。下面将给出Test fixture的描述、DUT的描述及如何进行混合仿真。,DUT 被测器件 (device under test),module MUX2_1 (out, a, b, sel);/ Port declarationsoutput out;input a, b, sel;wire out, a, b, sel;wire sel_, a1, b1;/ The netlistnot (sel_, sel);and (
23、a1, a, sel_);and (b1, b, sel);or (out, a1, b1); endmodule,注释行,已定义的 Verilog基本单元的实例,a, b, sel是输入端口,out是输出端口。所有信号通过这些端口从模块输入/输出。 另一个模块可以通过模块名及端口说明使用多路器。实例化多路器时不需要知道其实现细节。这正是自上而下设计方法的一个重要特点。模块的实现可以是行为级也可以是门级,但并不影响高层次模块对它的使用。,多路器由关键词module和endmodule开始及结束。,Test Fixture template,module testfixture;/ Data t
24、ype declaration/ Instantiate modules/ Apply stimulus/ Display resultsendmodule,为什么没 有端口?,由于testfixture是最顶层模块,不会被其它模块实例化。因此不需要有端口。,Test Fixture 如何说明实例,module testfixture;/ Data type declaration/ Instantiate modulesMUX2_1 mux (out, a, b, sel);/ Apply stimulus/ Display resultsendmodule,多路器实例化语句,MUX的实例化
25、语句包括:模块名字:与引用模块相同实例名字:任意,但要符合标记命名规则端口列表:与引用模块的次序相同,Test Fixture 过程(procedural block),所有过程在时间0执行一次 过程之间是并行执行的,过程语句有两种:initial :只执行一次always :循环执行,Test Fixture 过程(procedural block),通常采用过程语句进行行为级描述。test fixture的激励信号在一个过程语句中描述。 过程语句的活动与执行是有差别的 所有过程在时间0处于活动状态,并根据用户定义的条件等待执行; 所有过程并行执行,以描述硬件内在的并行性;,Test fix
26、ture 激励描述,module testfixture;/ Data type declarationreg a, b, sel;wire out;/ MUX instanceMUX2_1 mux (out, a, b, sel);/ Apply stimulusinitialbegina = 0; b = 1; sel = 0;#5 b = 0;#5 b = 1; sel = 1;#5 a = 1;#5 $finish;end/ Display results endmodule,Time Valuesa b sel 0 0 1 0 5 0 0 0 10 0 1 1 15 1 1 1,例子
27、中,a, b, sel说明为reg类数据。reg类数据是寄存器类数据信号,在重新赋值前一直保持当前数据。 #5 用于指示等待5个时间单位。 $finish是结束仿真的系统任务。,Test Fixture 响应产生,$time 系统函数,给出当前仿真时间 $monitor 系统任务,若参数列表中的参数值发生变化,则在时间单位末显示参数值。$monitor (“format_specifiers”, ); 例如:$monitor($time, o, in1, in2);$monitor($time, , out, , a, , b, , sel);$monitor($time, “%b %h %d
28、 %o”, sig1, sig2, sig3, sig4);,Verilog提供了一些系统任务和系统函数,包括:,注意不能有空格,Test Fixture 响应产生,$time是一个系统函数,返回当前返回仿真时间。时间用64位整数表示。 $monitor 在时间单位末,若参数列表中的参数值发生变化则显示所列参数的值。由$time引起的变化不会显示。 $monitor系统任务支持不同的数基。缺省数基是十进制。支持的数基还有二进制、八进制、十进制。,完整的Test Fixture,module testfixture;/ Data type declarationreg a, b, sel;wir
29、e out;/ MUX instanceMUX2_1 mux (out, a, b, sel);/ Apply stimulusinitial begina = 0; b = 1; sel = 0;#5 b = 0; #5 b = 1; sel = 1;#5 a = 1;#5 $finish;end / Display resultsinitial$monitor($time,“ out=%b a=%b b=%b sel=%b“, out, a, b, sel); endmodule,0 out= 0 a= 0 b= 1 sel= 0 5 out= 0 a= 0 b= 0 sel= 0 10
30、out= 1 a= 0 b= 1 sel= 1 15 out= 1 a= 1 b= 1 sel= 1,结果输出,时间单位末的概念,timescale 1ns/1ns module testfixture;/ Data type declarationreg a, b, sel;wire out;/ MUX instanceMUX2_1 mux (out, a, b, sel);/ Apply stimulusinitial begina = 0; b = 1; sel = 0;#5.7 b = 0; #5 b = 1; sel = 1;#5 a = 1; #5 $finish;end / Di
31、splay resultsinitial$monitor($time,“ out=%b a=%b b=%b sel=%b“, out, a, b, sel); endmodule,0 out= 0 a= 0 b= 1 sel= 0 6 out= 0 a= 0 b= 0 sel= 0 11 out= 1 a= 0 b= 1 sel= 1 16 out= 1 a= 1 b= 1 sel= 1,结果输出,VCD数据库,Verilog提供一系列系统任务用于记录信号值变化保存到标准的VCD(Value Change Dump)格式数据库中。大多数波形显示工具支持VCD格式。,VCD数据库,用户可以用$d
32、ump*系统任务打开一个数据库,保存信号并控制信号的保存。除$dumpvars外,其它任务的作用都比较直观。 $dumpvars将在后面详细描述。 必须首先使用$dumpfile系统任务,并且在一次仿真中只能打开一个VCD数据库。 在仿真前(时间0前)必须先指定要观测的波形,这样才能看到信号完整的变化过程。 仿真时定期的将数据保存到磁盘是一个好的习惯,万一系统出现问题数据也不会全部丢失。 VCD数据库不记录仿真结束时的数据。因此如果希望看到最后一次数据变化后的波形,必须在结束仿真前使用$dumpall。,VCD数据库是仿真过程中数据信号变化的记录。它只记录用户指定的信号。,$dumpvars,
33、$dumpvars(, *);scope可以是层次中的信号,实例或模块。 仿真时所有信号必须在同一时间下使用$dumpvars。 就是说可以使用多条$dumpvars语句,但必须从同一时间开始。如:initial begin$dumpfile (“verilog. dump”);$dumpvars (0, testfixture.a);#1 $dumpvars (0, testfixture.b);end,$dumpvars语法:,此语句将引起一个警告信息并被忽略,$dumpvars,$dumpvars; / Dump所有层次的信号 $dumpvars (1, top); / Dump top
34、模块中的所有信号 $dumpvars (2, top. u1); / Dump实例top. u1及其下一层的信号 $dumpvars (0, top. u2, top. u1. u13. q); / Dump top.u2及其以下所有信号,以及信号top. u1. u13. q。 $dumpvars (3, top. u2, top. u1); / Dump top. u1和top. u2及其下两层中的所有信号。用下面的代码可以代替前面test fixture的$monitor命令:initialbegin$dumpfile (“verilog. dump”);$dumpvars (0, testfixture);end,要给$dumpvars提供层次(levels)及范围(scope)参数,例如,