NCVerilog_tutorial 中文
Candence NC-Verilog simulator tutorial
第一章介绍
这个手册将向你介绍使用NC-Verilog simulator和SimVision。
本文使用的是一个用Veilog硬件编程语言编写的一个饮料分配机,通过这个例子你将学会:
·编译Verilog源文件,描述设计,在NC-Launch(用于管理你的大型设计的图形交互接口)上进行设计的仿真。NCLaunch帮助你配置和启动编译器,描述器和仿真器。当然你还可以在NCLaunch上运行像SDF compiler,HDL Analysis and Lint,Code Coverage Analyzer, NCBrowse, and Comparescan.之类的工具。
·在SimVision分析环境下进行对设计中的问题的调试。
SimVision是一个candence 仿真器统一的图形化的调试环境。
SimVision可以用于调试用verilog,vhdl,SystemC或者它们混合写成的数字,仿真,或数模混合电路的设计。
你可以在以下几种模式运行SimVision:
·Simulate模式
在Simulate模式下你可以实时的看到仿真的数据。也就是说,你可以在仿真的过程中就进行数据的分析。你可以通过对设计设置断点和分步来达到控制仿真的。
为了帮助你追踪整个仿真过程,SimVision提供了几个工具:
·控制台窗口 Console Window
·源浏览器 Source Browser
·设计浏览器 Design Browser
·循环阅读器 Cycle Viewer
·原理图追踪 Schematic Tracer
·信号流浏览器 Signal Flow Browser
·波形窗口 Waveform Window
·寄存器窗口 Register Window
这些窗口之间是连接了的,所以如果你在一个窗口中选中了一个对象,那么在其它窗口中也会被选中。
·Post-processing environment (PPE)模式
在PPE模式下,对仿真结果数据的分析是在仿真过程结束了后进行的。
除了仿真器之外,你能访问所有的SimVision的工具。就像Simulator模式中一样,这里所有的窗口也是连接了的,你在一个窗口中选择了的目标也会在其它窗口中选中。要在PPE模式下运行,你必须先对设计进行仿真,然后把仿真的资料存到一个文件中,你可以随时从simulation模式切换到PPE模式,但是不能在PPE模式切换到simulation模式中去。
本指南将向你介绍SimVision的主要几个工具:
控制台Console window:
Console window允许你输入tcl仿真的命令和SimVision 的命令。
Design Browser:
Design Browser让你进入设计的各层,以及信号和变
量的数据库。
Register window:
Register window让你可以使用一个开放式的图形编辑
器来定义一些记录簿,每个都包含了一个自定义的仿真数据
的观点。
Signal Flow Browser:
Signal Flow Browser让你追踪信号的变化。
Source Browser:
Source Browser让你可以看到设计的源代码。
Waveform window:
Waveform window把仿真的资料在X-Y坐标系里面描绘
出来。数据通常被显示为值和时间的关系,但是它也可以是
已经记录下了的数据。
饮料机的例子
饮料机由以下几个模块组成:
Drink-machine:用于计算用户给了的钱,对饮料进行分发,并且给用户找钱。
Coin-counter:用硬币和机器相连,并且确定机器什么时候没有找头了。
Can-counter:用饮料和机器相连,并且确定机器什么时候没有饮料了。
这个例子同样有一个测试模块,它用于初始化饮料机并且用nickel(五美分),dime(十美分),quarter(二十五美分)的不同组合对机器进行投币来买饮料。对于接受硬币和分发饮料的行为被建模成一个状态机。用户已经投入的硬币总量决定了当前的状态。接下来用户投入的硬币的类型决定了下一个状态。举例来说,当没有钱投入的时候,机器处于空闲状态。当用户投入一个nickel的时候,机器进入下一个状态——five。当当前状态是five的时候用户又投入了一个quarter,机器就进入了下一个状态——thirty。当用户投入的钱到了五十美分的时候,机器就分发一罐饮料,同时进入空闲状态。当用户投入的钱超过了五十美分的时候,机器分发一罐饮料,找回零钱,然后进入空闲状态。
更多的信息
SimVision还提供了其它的没有在这个指南里面用到的工具。
第二章开始
在你仿真你的设计以前,你必须编译和描述它。编译过程将把源文件中的用HDL编写的单元编译成内在的描述。描述设计将在设计的实例化,结构化信息的基础上建立设计的层次结构,建立信号的连接,计算所有对象的初始值。你编译,描述和仿真你的设计要用到以下的工具:
Ncvlog:编译Verilog源文件。
ncelab 描述设计并且生成仿真的snapshot。
ncsim 对snapshot进行仿真。
当然你也可以利用ncverilog的命令以一步实现(single-step)的模式来运行NC-Verilog。你也可以使用单一的工具,NCLaunch——一个可以帮助你建立大型的设计工程的用户图形接口平台。NCLaunch帮助你配置和启动仿真的工具。你可以在多步实现(multi-step)或者单步实现(single-step)的模式下运行这些工具。它也可以让你打开 Comparescan, SDF Compiler, HDL Analysis 和 Lint, Code Coverage Analyzer, NCBrowse, 以及其它仿真仿真的工具。这个指南将向你展示怎么在多步实现(multi-step)的模式下使用NCLaunch。
拷贝指南的数据
本例的所有源文件包含在Candence的安装包中。源文件在下面的这个地址:install_dir/doc/ncvlogtut/examples
建立一个新的檔夹(比如说:tutorial), 然后拷贝指南的文件到这个檔夹。例:
mkdir tutorial
cd tutorial
cp install_dir/doc/ncvlogtut/examples/* .
启动NCLaunch
1.在你拷贝了指南的源文件的那个檔夹下启动NCLaunch:
nclaunch -new &
-new选项指名你想要在一个新的设计(design)下面进行接下来的工作。
NCLaunch将出现一个你能运行这个工具的模式的列表,如图2.1。
图2.1NCLaunch运行模式选择
多步模式(Multiple Step)使用ncvlog和ncelab命令来编译和描述你的
设计;单步模式(Single Step)使用ncverilog命令。
2.选择Multiple Step.
NCLaunch显示的主窗口如图2.2 :
图2.2 NCLaunch主窗口
左边的窗口显示了当前目录下的所有的文件,在你编译和描述了设计以后,右边窗口就会显示设计的库。上面是菜单和一些用于启动工具的按键。
编译(compiling)源文件
在你仿真你的设计以前,你必须用编译器编译源文件,并且用描述器(elaborator)把设计描述成snapshot的形式。Snapshot是仿真器将调用的你的设计的表述,它和其它由compiler和elaborator产生的中间目标一起保存在库中。
NCLaunch的主窗口让你可以连接你编译和描述设计所需要的工具,当然还有其它的程序。你利用Tools和Utilities菜单,或者你也可以利用工具栏里面的工具按钮,你可以打开工具和其它程序。不是所有的工具和程序都放在工具栏里面,但是你可以通过自己定义工具栏来确定把自己喜欢的工具和程序放在工具栏里面。
表2-1例出了在工具栏里面的工具。
1.编译你的设计:
选中在设计时建立的Verilog文件:
can_counter.v
coin_counter.v
drink_machine.v
drink_machine_top.v
test_drink.v.
要选择多个檔,需要按住Ctrl键并选中每个檔。
2.按下编译器按钮:
在窗口底部的输入输出区域会显示由于你的选择而输入的命令和运行后的结果,同时它也显示了NC-Verilog在编译过程中的消息。
默认的,NC-Verilog将产生一个叫INCA_libs的目录以及一个叫worklib 的目录。所有设计中的模块都将编译在worklib目录下面。注意INCA_libs现在就出现在了NCLauch左边的浏览器中,同时设计的库worklib也加入了库浏览器(右边窗口)中。
描述(elaborate)你的设计
要描述(elabrate)你的设计,典型的你要展开你的库(worklib),选择顶
层(top-level)的单元,然后选择描述(elabrate)按钮。
尽管如此,为了做一个指南,这里在你描述以前你必须设置一些选项。按照以下几步进行选项的选择然后描述你的设计:
1.通过点击帽子图示旁边的加号展开工作库(worklib)
2.展开顶层设计单元,在这个例子中,顶层设计单元是一个Verilog的测试模块:test_drink.
3.选择module
4.选择Tools- Elaborator以打开Elaborate模式,如图2.3
注意这里的Access Visibility按钮选中并且它的值是All,这个选项意味着全部存取(读,写,连接探测)来仿真目标,这样你就可以在仿真的数据库里面探测目标和范围,调试你的设计。
注意:在使用NCLaunch时,默认是可以调用仿真目标的。但是用命令行接口的时候,进入默认是关闭了的,你必须要输入-access命令来启动elaborator,例:
ncelab -access +rwc worklib.test_drink:module
5.在这个饮料机中只有一个模块包含了时间表的编译指示。因为其它模块都没有定义时间表,为了防止elaborator报错,这里启动Other Option选项然后再文本框输入-timescale 1ns/1ns,如图2.3:
6. 按下OK以开始描述(elaborate)设计。
底部的输入输出窗口显示了ncelab命令,它就是由于你的选择而输入的命令,然后还显示了the elaborator generates的消息。
提示如果你收到了elaborator error的消息你可能是由于在运行这几步的时候出错了。例如:
1.你是不是选择了正确的设计单元名称?
2.是否记得设置-timescale的选项
当你收到了错误的消息以后重新进行这些步骤。
启动Simulator
为了启动simulator:
1.展开Snapshots文件夹,以显示在你的库中你可以选择的snapshot。
2.选中你想要仿真的snapshot,如图2.4
图2.4 选中要仿真的snapshot
3.按下仿真按钮
设计浏览器(Design Browser)和控制窗口(Console window)就会出现。你可以在设计浏览器(Design Browser)中进入设计的各个层,你也可以在控制窗口(Console Window)输入命令来进入SimVision和
Tcl Simulator。
图2.5展示了设计浏览器(Design Browser)打开时的情况。
Simvision把仿真定位在了各层的上面,同时给它定义了名字叫做Simulator。设计的各层的最高层就放置在了仿真的下面。在这个例子中
它就叫做test_drink。
图2.5 Design Browser
在启动的时候,控制窗口(Console Window)有两个窗口,如图2.6。SimVison 窗口让你可以输入SimVison的命令;仿真器(simulator)窗口让你可以输入Tcl simulator命令。在你运行仿真的时候,控制窗口(console window)同样会在SimVision和simulation窗口中显示消息。
图2.6 Console Window
Video :视频
编译和描述设计文件。
退出NCLaunch
调用了仿真器(simulator)以后,你就可以退出NCLaunch了。
要退出NCLaunch:
·点击NCLaunch窗口使之成为当前窗口,然后选择File菜单下的Exit。
更多的信息
本章向你介绍怎么用NCLaunch让NC-Verilog运行在多步的模式下。其实
第三章设计仿真
SimVision让你控制和查询你的设计仿真。他可以帮助你定位和特定的仿真事件相关的程序段。如果你发现设计中有错误,你可以直接编辑源文件,重新编译和描述,而不用离开SimVision的环境。
SimVision中你可以存储个别目标或者范围的仿真数据,这可以使得仿真数据尽量的小。晚些时候,你可以在Waveform中加载仿真数据再检验仿真的结果。选择存储的仿真数据
你可以执行simulator命令来存储仿真器运行过程中的仿真数据。Simulator 命令在仿真过程中对设计进行探测,然后它把探测目标的值存入数据库。
有两种类型探测的命令:
·探测一个特殊的目标或多个目标。这些特殊目标的值存在数据库中。
·探测一个特殊的范围或多一个范围。你可以选择你想存储的信息类型,比如说,这个范围内的输入信号,你能决定探测的是探测一些还是全部的范围。
要探测所有的模表和范围,要从模块的top开始:
1. 在设计窗口中,点击test_drink 图示旁边的加号,展开设计的层次结
构。
2. 选择top范围。在右边窗口里面的信号的列表列出了top范围内的全部
信号,如图3.1。信号列表显示了所有输入信号,输出信号,输入输出信号,内部信号,或者事务级的信号。
。
图3.1 选择top范围
3.选择菜单Simulation--〉Create Probe
SimVision打开Probe的设置窗口,如图3.2,这个窗口允许你选择一层或者多层子范围,选择你要探测的信号类型, 然后记录探测信息到任何数据库。
图3.2 设置probe的窗口
针对这个探测:
·选择Include sub-scopes下拉菜单中的all选项以包含所有设计的子域。·选择Include within each scope下拉菜单中的all选项以包含输入,输出和端口。
·取消选中Add to waveform display。
4. 点击OK确认probe的设置然后关掉窗口。
提示
如果你在控制窗口(console window)输入以下信息你就可以成功的创建probe:
ncsim> database -open waves -into waves.shm -default
Created default SHM database waves
ncsim> probe -create test_drink.top -depth all -all -shm
Created probe 1
5. 在控制窗口(console window)中选择Simulation—〉Run。SimVision
就会仿真设计,然后把仿真的结果数据存在默认的数据库里面。在它运行的时候
将会显示如下信息:
ncsim> run 400loading machine with 5 cans
400 *** machine empty! ***
700 enter nickel
900 enter dime
1100 enter quarter
1300 enter dime
1500 enter quarter
1500 ->drink dispensed
-------------------------------
1800 enter nickel
2100 enter nickel
2300 enter dime
2500 enter dime
2600 *** machine empty! ***
2700 enter quarter
2700 nickel changed
3000 enter nickel
3200 enter dime
3400 enter quarter
3600 enter dime
3800 enter quarter
3900 -> drink dispensed
-------------------------------
. . .
-------------------------------
68400 enter quarter
68700 enter nickel
69000 enter nickel
69200 enter dime
69400 enter dime
Simulation complete via $finish(1) at time 69600 NS +
0 ./test_drink.v:48 $finish;
ncsim>
提示
当你完成了这些步骤,你的工作目录下面将会出现一个新的名为waves.shm 的目录,它里面包含了waves.dsn和 waves.trn两个文件。如果它们的大小分
别远小于65500bytes和360bytes,那么在仿真过程中你就没有探测到了所有的
目标。
为了纠正问题,在控制窗口(console window)中选择Simulation—〉Reinvoke Simulator重新启动simulator或者退出simulator再用下面的命令重新启动simulator:
ncsim -gui worklib.test_drink:module
然后重新执行本章讲的几个步骤。
更多的信息
本章描述了设置探针(probe)和运用控制窗口(console window)来启动
第四章以波形的形式研究仿真的资料
波形显示了信号在仿真过程中任意事件的值,它可以帮助你很好地理解你的设计的行为
波形窗口(waveform window)可以让你选择你想要看的信号以及它在显示的时候的基数,甚至你还可以自己建立一个显示的形式,叫做mnemonic map(助记符映射),这样就可以让图以你最适应的方式显示。
选择显示的信号
在设计浏览器(Design Browser), 你可以选择目标然后把它们放到波形窗口(Waveform window)中
为了要选择你想要显示的信号到波形窗口(Waveform window)中:
1. 点击Edit Buffer 按钮打开edit buffer,如图4.1。edit buffer
让你可以在不同的范围内选择目标,安排他们以你希望的顺序显示,然后把它们都列到波形窗口(Waveform window)中去
图4.1打开edit buffer
2. 在top模块中选择你想要在波形窗口(waveform window)中显示的信
号。为了取样检查,选择nickel_in, dime_in, quarter_in, dispense, nickel_out, dime_out, two_dime_out, and clk 信号。当你点击各个信号的时候,SimVision把它们加入到edit buffer中去。
3. 展开top,然后在vending模块中选择current_state 把它加入edit
buffer中去。
4. 点击Waveform按钮,让这些信号在波形窗口(waveform window)
中显示。
5. 点击隐藏 Edit Buffer按钮,使edit buffer 在设计浏览窗口收
回。
Displaying Data in the Waveform Window
在波形显示窗口(waveform window)中,信号的名字和它们的当前值都显示在了窗口的左边,它们的波形显示在了右边。如图4.2:
图4.2 有波形显示的波形显示窗口(waveform window)
提示
你可以在一个有工具条的波形显示窗口(waveform window)中进入设计浏览或者是设计搜索的窗口中去。更进一步的讲解请查阅SimVision User Guide 中的 Using the Design Browser Sidebar 和 Using the Design Search Sidebar
在波形窗口(waveform window)中,在波形数据的上方,你可以看到当前窗口中仿真的数据的启始和终止时间。在波形数据的下方的滚动条显示的是整个仿真的时间。你可以通过输入一个新的时间范围来调整当前窗口中显示的波形数据的范围
为了输入一个新的范围:
1.在Time Range 文本框中输入一个时间段. 在这个例子中,输入的是0:3000, 如图4.3:
图4.3 输入一个新的时间段
2.点击Enter键以应用新的时间段。
3.在波形数据上方的下拉菜单中选择Keep this view ,这样你就可以保存你的缩放设置。如图4.4:
任意时刻,你能通过下拉菜单选择来快速地回到显示这个缩放段
图4.4 存储一个波形资料的情景
在波形窗口(waveform window)中有两个指标,分别叫做TimeA和Baseline。你可以把它们移到仿真时间的任意点,然后以它们为参考点。
输入一个新的仿真时间:
·你可以拖动指标到你想要探测的时间点,也可以在指标时间输入文本框中输入一个仿真时间来实现目的。
例,改变TimeA的仿真时间到16,700ns,如图4.5:
图4.5 设定指针时间
控制波形数据的显示
波形窗口(waveform window)让你可以控制波形数据的显示方式,比如说你想让信号数据在什么进制下进行显示。
例,要把的current_state显示变成十进制:
1. 在波形窗口(waveform window)的目标列表中选择current_state 。
2. 在Format—〉Radix/Mnemonic菜单中选中Decimal(十进制)
当观察一个波形的时候,有时候把信号的值显示成ASCII码串很有用。比如说,当current_state的值是1的时候,用户投入了5美分;当current_state 的值是2的时候,用户投入了10美分。把current_state的波形显示成5和10比显示成1和2更容易理解。
要把信号定义信号值为ASCII串,需要定义一个mnemonic map:
1. 选择Windows—〉Tools—〉Mnemonic Maps打开Mnemonic Maps的属性
设置窗口,如图4.6:
图4.6 Mnemonic Maps的属性设置窗口
当你定义了一个mnemonic map,你不仅可以定义特殊信号的文本显示方式,而且你还可以定义值在波形窗口(waveform window)中的显示方式,包括波形的形状,联合一个值的特殊情况的图示和颜色。
2. 点击新建Map按钮,新建一个 mnemonic map.
3. 定义mnemonic map的第一个入口,如下:
a. 改变默认的进制,点击’h 不放然后选择’d.
b. 双击Values Matching…区域,输入0, 然后按Tab键,进入Relabel As… 区域。
c. 在Relabel As…区域, 键入串idle然后按Tab键进入下个目标的Values Matching…
前面的区域显示了Waveform窗口会在current_state 等于0的时候怎么显示。它将显示一个里面写着idle的长方形。
5. 在名字的区域里面,改变新的map给current_state。
6. 点击Apply按钮。
现在current_state的十进制值0,1,10,等等就被显示成了idle,five,fifty,等等, 如图4.7:
图4.7 由于Mnemonic Map信息所显示的值
7. 选择—〉File—〉Close Window关闭选项窗口。
更多的信息
本章描述了一些你显示和组织信息在波形窗口(waveform window)中显示