NC-verilog 仿真教程和实验实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Cadence IC设计实验
实验六 NC-Verilog Simulator实验
实验目的:NC_verilog仿真器的使用,包括编译、运行和仿真。
预备工作:
cp /eva01/cdsmgr/ training_IC_data/NCVlog_5_0.tarZ .
tar -vxfZ NCVlog_5_0.tarZ
Lab1。
运行一个简单的Verilog设计
[1]、设置设计环境
1.cd NCVlog_5_0/lab1-mux
这个目录包含了用来描述一个多路选择器和其测试平台的verilog 模块。
以下是mux_test.v模块内功能模块的端口框图。
建议:如果有时间,你最好看一看各模块(module)的Verilog代码!
2.创建cds.lib文件,
vi cds.lib(回车)
按小写”i”切换到编辑模式,在其中写入:
Define lab1muxlib ./lab1-mux.lib
有关vi的编辑命令,请参阅相关资料。
如”Esc”键切换到命令状态,在命令状态下,”x”
是删除当前字符,”a”是在当前光标后写入,”:wq”是存盘退出,”:!q”是不保存退出。
存盘退出
3.创建(库)文件夹(即目录):
mkdir lab1-mux.lib (回车)
4.类似步骤1,创建hdl.var文件,在其中写入:
Define WORK lab1muxlib
存盘退出
5.查看verilog源文件。
mux.v是2选1多路选择器MUX2_1 的门级建模源文件,mux_test.v
是mux.v的测试台,包含了输入激励信号和监控程序运行的任务语句。
[2]、编译源文件(ncvlog命令):
当前目录应为。
/你的学号/NCVlog_5_0/lab1-mux。
1.ncvlog mux.v –messages ,这条指令是编译mux.v。
2.vi hdl.var打开hdl.var文件,在其中添加:Define NCVLOGOPTS –messages 存盘退出
注:用NCVLOGOPTS变量定义常用的ncvlog命令行操作,从而避免每次都敲入同样的命令行。
3.编译测试平台源文件:
ncvlog mux_test //可以不加后缀.v
4.ncls –all
这一步目的是看一看前面两个ncvlog生成了哪些library objects?
答案是:module lab1muxlib.MUX2_1:module (VST)
module lab1muxlib.mux_test:module (VST)
现在你明白lab1muxlib的作用了吗?ncvlog编译后生成的模块放入lab1muxlib工作库中。
[3]、扩展与连接(elaboration详细描述)顶层设计(ncelab命令):
1.ncelab mux_test
2.ncls –all ,查看ncelab生成了哪些library object。
[4]、仿真:
ncsim mux_test
观察仿真器的输出情况。
你还可以查看ncls.log, ncelab.log, ncsim.log, ncvlog.log文件内容了解更多的信息。
以下Lab2至lab4是编译、扩展与连接(详细描述)和仿真步骤的高级操作。
Lab2。
编译的高级技术
一、Lab2-1:寄存器设计
实验目的:学习如何使用hdl.var中的WORK、VIEW、LIB_MAP和VIEW_MAP 变量。
你将学会使用:
1.分别用hdl.var中的WORK变量和用-work选项忽略WORK变量进行编译。
2.分别用hdl.var中的VIEW变量和用-view选项忽略VIEW变量进行编译。
3.用hdl.var中的LIB_MAP和VIEW_MAP变量进行编译。
4.用hdl.var中的LIB_MAP和VIEW_MAP变量进行阐述。
下图是Lab2实验用到的register和counter的端口框图。
[1].在Terminal窗口进入:NCVlog_5_0/lab2-reg目录;
cd .. 回到上一级目录,即NCVlog_5_0
cd lab2-reg进入lab2-reg目录
[2].参照lab1步骤,创建cds.lib文件,输入如下内容:
Define lab2reglib ./lab2-reg.lib
Define projectlib ../project.lib 注意:两个点
Define techlib ../technology.lib 注意:两个点
存盘退出。
[3].创建关联目录。
在:NCVlog_5_0/lab2-reg目录下,创建lab2-reg.lib目录;
在:NCVlog_5_0目录下,创建project.lib 和technology.lib 目录。
[4]、使用hdl.var 中WORK变量:
1.进入NCVlog_5_0/lab2-reg目录,
2.创建hdl.var文件,打开,输入如下内容:
Define WORK lab2reglib
存盘退出
3.编译register_test.v包含message选项:
ncvlog register_test –mess
问题:ncvlog编译后module放入了哪个库中?
提示:ncls –all , 答案:module lab2reglib.register_test:module (VST)
[5]、使用-work命令行选项编译:
ncvlog register –mess –work projectlib
注:-work命令行选项使得projectlib替代了原来在hdl.var文件中lab2reglib WORK库。
用ncls –all命令查一下ncvlog将编译好的register module防在哪个库?
答案:module projectlib.register:module (VST)
[6]、使用hdl.var中VIEW变量编译:
1.打开hdl.var,加入如下内容:
Define VIEW behav
Define NCVLOGOPTS –messages
存盘退出
2.编译clockgen.vb:
ncvlog clockgen.vb –work projectlib
用ncls -all查看一下,答案:module projectlib.clockgen:behav (VST)
[7]、比较:使用 -view命令行选项编译:
1.编译clockgen.vg
ncvlog clockgen.vg –work projectlib –view module
说明:clockgen.vb是行为级建模,clockgen.vg是行为级和门级混合建模,二者行为相同。
2.用ncls -all 查看ncvlog编译结果,这个module新增添了module 类型view。
如果你没有指定,ncvlog会将按hdl.var文件中的命令将这个module存入behav view。
[8]、使用hdl.var 中LIB_MAP和VIEW_MAP变量:
1.编辑hdl.var文件如下:
#Define WORK lab2reglib (#注释掉)
#Define VIEW behav
Define NCVLOGOPTS -messages
Define LIB_MAP ( . => projectlib, ./cell_lib => techlib)
Define VIEW_MAP ( .vg => gate, .vr => rtl, .vu => udp)
存盘退出
说明:将源文件路径映射到WORK库名,将源文件扩展名映射view。
2.编译cell_lib/AND2.v和不同描述的dff模块:
ncvlog cell_lib/AND2.v dff.vg dff.vr dff.vu
3.查看ncls –all , ncvlog将cell_lib/AND2.v编译存储到哪个库或者view中?
[9]、扩展与连接顶层设计:
1.用-messages和-libverbose扩展与连接register测试平台:
ncelab register_test –mess –libverbose
失败的原因是projectlib和techlib中找不到‘gate’,’rtl’,’udp’ view。
2. 在hdl.var文件VIEW_MAP变量中添加默认view:
Define VIEW_MAP (+ => module,.vg => gate, .vr => rtl, .vu => udp )
3.再次ncelab:
!n (即重复前次ncelab register_test –mess –libverbose命令)
[10]、仿真顶层设计:
ncsim register_test –mess
二、Lab2-2:计数器设计
实验目的:学会如何使用 –specificunit(特定单元)和-unit选项进行ncvlog编译。
[1].进入NCVlog_5_0/lab2-cnt目录。
[2].创建cds.lib文件并如下编辑:
Define lab2cntlib ./lab2-cnt.lib
Define projectlib ../project.lib
Define techlib ../technology.lib
[3].创建lab2-cnt.lib目录
[4].创建文件hdl.var文件并如下编辑:
Define WORK techlib
Define VIEW gate
Define NCVLOGOPTS -messages
[5].编译cell_lib.v:(在NCVlog_5_0/lab2-cnt目录中)
ncvlog cell_lib.v
看一下cell_lib中的module处在哪些工作库和view。
[6].比较:用-specificunit 和–view命令行选项编译:
ncvlog cell_lib.v –specificunit dff –view rtl
ncvlog将dff存入哪个view?(用ncls -all)
ncvlog cell_lib.v –specificunit MUX2_1 –view module
ncvlog将MUX2_1存入哪个library.cell和view?
[7].使用-unit命令行选项编译
1.打开文件cell_lib.v,模块MUX2_1描述是不正确的,原模块中
and ( al , in_a , sel );
and ( b1 , in_b , sel_not );
修改为
and ( al , in_a , sel_not );
and ( b1 , in_b , sel );
2.重新编译MUX2_1
ncvlog –unit techlib.MUX2_1:module
在哪个工作库和view中,还存在MUX2_1编译错误?
[8]。
完成设计编译、扩展与连接和仿真:
1.编译剩下的modules
ncvlog clockgen.vg
ncvlog counter.v –work projectlib –view rtl
ncvlog counter_test.v –work lab2cntlib –view module
2.扩展与连接顶层设计
ncelab counter_test –mess –libverbose
(如果你已经做过了lab3,又重新做这一步,你必须加-viewname rtl)
3.仿真
ncsim counter_test
Lab3。
扩展与连接的高级技术
实验目的:理解hdl.var中LIB_MAP和VIEW_MAP,使用扩展与连接的绑定命令选项。
一、Lab3-1:ALU
[1]。
进入NCVlog_5_0/ lab3-alu目录。
[2]。
创建cds.lib文件,并编辑如下内容:
Define lab3alulib ./lab3-alu.lib
Define projectlib ../project.lib
Define techlib ../technology.lib
说明:设多个库是不必要的,只是便于大项目的管理。
[3]。
创建lab3-alu.lib目录
[4]。
将cell库编译到technology library中:
1、将cell_lib.vr编译存入technology 库rtl view:
ncvlog cell_lib.vr –work techlib –view rtl
2、将cell_lib.vg编译存入technology 库gate view:
ncvlog cell_lib.vg –work techlib –view gate
[5]。
将其它通用部件编译后存入project library中:
ncvlog register.vg –work projectlib –view gate
ncvlog clockgen.v –work projectlib –view module
ncvlog clockgen.vb –work projectlib –view behav [6]。
将ALU编译存入本地设计库中指定的view:
ncvlog alu.vr –work lab3alulib –view rtl
ncvlog alu.vg –work lab3alulib –view gate [7]。
将测试平台编译后存入本地设计库中的module view:
ncvlog alu_test.v –work lab3alulib –view module
[8]。
使用默认的扩展与连接处理alu模块的测试台:
ncelab alu_test –mess –libverbose 失败!
[9]。
使用hdl.var LIB_MAP 和VIEW_MAP变量:
1. 取消hdl.var文件中的注释(删去每行前面的“#”号即可),得到如下文本:
Define LIB_MAP (cell_lib.vr =>techlib, clockgen.v=>projectlib, +=>lab3alulib ) Define VIEW_MAP (.vb => behav, .vg=>gate, .vr=>rtl, +=> module )
Define NCELABPOTS –messages –libverbose
2.再次扩展与连接ALU测试平台:
ncelab alu_test
在哪个库和view中ncelab找到了clockgen module?
在哪个库中找到的ALU module和INV module?
[10]。
使用-libname和-viewname命令行选项操作
ncelab –libname lab3alulib –viewname gate –libname projectlib –viewname behave –libname techlib –viewname rtl alu_test
(此两行是一条命令!)
[11]。
使用`uselib 指示编译:
ncvlog alu.vg –define USE_RTL (可以查看alu.vg)
ncelab alu_test
[12]。
使用指定的绑定:
ncelab alu_test –binding techlib.INV:rtl
[13]。
指定快照名
ncelab alu_test –binding alu:rtl –snapshot alu_test:rtl
[14]。
仿真:
ncsim alu_test:rtl
ncsim alu_test:module
二、Lab3-2: Scale-Mux (参数化设计)
[1]。
进入NCVlog_5_0/ lab3-smx目录。
[2]。
ncvlog scale_mux.v
ncvlog scale_mux_test.v –view two_same
ncelab scale_mux_test
查看sclae_mux库内容:ncls lab3smxlib.scale_mux
查看scale_mux.v文件:cat scale_mux.v
[3]。
对测试台进行仿真:
ncvlog scale_mux_test.v –view two_diff –define size_of_mux1=6
(:忽略警告,你查看一下scale_mux_test.v就明白了)
ncelab scale_mux_test:two_diff
ncsim scale_mux_test:two_same
ncsim scale_mux_test:two_diff
仿真two_same和two_diff快照,NC-verilog允许在运行时改变参量。
三、Lab3-3:存储器设计(如何查错)
[1]。
进入NCVlog_5_0/ lab3-mem目录。
[2]。
ncvlog mem.v mem_test.v -mess
[3]。
用nchelp命令展开错误信息。
nchelp ncvlog WANOTL
如果你较熟悉Verilog,可根据错误提示,检查mem_test.v中的错误。
将data说明成reg如何?
[4]。
比较mem_test.v和mem_test_fixed.v(正确)
diff mem_test.v mem_test_fixed.v
ncvlog mem_test.v –mess –noline (noline不报告错误)
[5]。
编译改正后的测试平台:
ncvlog mem_test_fixed.v (模块名为mem_test)
ncelab mem_test (对模块扩展与连接)
ncsim mem_test (对模块仿真,不是对.v文件仿真)
Lab4。
仿真的高级技术
控制器的设计
[1]。
进入NCVlog_5_0/ lab4-ctl目录。
[2]。
编译ncvlog clockgen.v control.v control_test.v
ncelab control_test
[3]。
使用不同控制模式的命令行操作:
1.使用-run操作:
ncsim –run control_test
此方式下,仿真结束后自动退出。
2.使用-tcl操作:
ncsim –tcl control_test (交互方式)
之后输入:
ncsim>run (继续)
ncsim>exit(退出交互方式)
Lab5。
用Tcl进行调试
完整的CPU设计
[1]。
进入NCVlog_5_0/ lab5- cpu目录。
[2]。
编译、扩展与连接和仿真
ncvlog driver.v cpu.v cpu_test.v
ncelab cpu_test –access rwc
ncsim cpu_test
默认状况下,cpu_test运行基本的诊断程序。
继续运行仿真,注意要reset。
ncsim>run
ncsim>reset
[3]。
穿过设计层次操作:
1.显示当前调试层次范围中的模块名和实例名(instance):
ncsim>scope -show
2.设置当前的调试范围:
ncsim>scope –set cpu1 (设置cpu_test.cpu1为调试顶层模块)。
再次查看scopes:
ncsim>scope -show
3.在指定的范围(scope)来描述对象:
ncsim>scope –describe mem1 –sort name
描述cpu_test.cpu1.mem1 范围的对象(objects),这种描述用名字的字母顺序分类。
4.用特定的scope列出源代码表:
ncsim>scope –list 18 20 mem1
[4]。
设置探针:
利用probe命令保存cpu_test.cpu1 范围(scope)所有信号。
ncsim>probe –create –name probe_1 cpu_test.cpu1 -shm
[5]。
设置断点:
1.运用stop命令
a.用keyfile设置断点。
ncsim>input lab5-cpu.key
查看lab5-cpu.key中的内容。
包含了什么命令?
b.ncsim>run
现在的仿真时间是多少?
ncsim>run 60 ns
什么时间仿真停止了?为什么?查看lab5-cpu.key理解答案。
c.列出断点列表:
ncsim>stop -show
d.继续仿真
ncsim>run
e.取消断点stop_3继续仿真,输入:
ncsim>stop –disable stop_3
ncsim>run
f.仿真到596ns
ncsim>run 596 ns -absolute
跳转指令JMP使得程序计数器中装上从指令寄存器发到数据总线上的地址。
指令寄存器数据在最后一栏中显示。
如果你有比较充裕的时间,就open cpu_test.v文件。
g.设置另外的一个断点继续仿真。
输入:
ncsim>stop –create –name stop_5 –time 80 ns -relative
ncsim>run
h.继续仿真到下一断点。
ncsim>run
ncsim>stop -show
2.完成诊断测试。
ncsim>stop –disable stop_5
ncsim>run
ncsim>exit
Lab6。
用图形用户接口进行调试
[1]。
进入NCVlog_5_0/lab6-gui目录。
[2]。
ncelab lab5cpulib.cpu_test –access rwc –snapshot lab6guilib.cpu_test
在这里用到了lab5中的描述,实际上还用到了Lab2 – lab4 的数据文件。
[3]。
调用图形接口仿真cpu-test。
ncsim cpu_test –gui –run &
-gui操作打开了主仿真控制窗口。
-run操作使得仿真继续运行直到中断或者完成。
[4]。
稍等。
出现Design Browser 1 - SimVsion图形窗口和Console –SimVision图形窗口。
观察这两个窗口的功能。
[5]。
在左边Simulator窗口中点击模块名,可以看到scope中的部件instance。
单击左边窗口中的instances,可以在右边窗口看到Signal/Variable的Value值。
[6]。
点击工具栏中的Waveform图标,或者通过菜单栏中的Windows-New-Waveform,
生成一个新的waveform窗口。
[7]。
在Design Browser窗口中选择cpu_test.cpu1这个scope下的所有信号。
可以通过菜单栏中的Select-Signals来选取。
也可以在右边的Signal/Value中直接选取。
[8]。
把选取的信号添加到waveform窗口中。
可以通过点击Waveform图标,或者在
waveform窗口中点击“添加选择”图标,或者通过drag and drop方式把信号直接拖到
waveform窗口中。
[9]。
在Console窗口中运行仿真程序。
ncsim>run 300 ns
你应该得到一个与下图相似的波形图。