Cadence IC设计实验 -...

13
Cadence IC 设计实验 实验五 NC-Verilog Simulator 实验 实验目的:NC_verilog 仿真器的使用,包括编译、运行和仿真。 预备工作: cp /eva01/cdsmgr/ ICDATA/NCVlog_3_4.tar . tar -vxf NCVlog_3_4.tar Lab1。运行一个简单的 Verilog 设计 [1]、设置设计环境 1cd NCVlog_3_4/lab1-mux ls (显示当前目录下的文件) 可以看到该目录包含了用来描述一个多路选择器和其测试平台的 verilog 模块,分别是 mux.v mux_test.v。以下是 mux_test.v 模块内功能模块的端口框图。 建议:如果有时间,你最好看一看各模块(module)的 Verilog 代码!(用下面的 emacs 命令) 2创建 cds.lib 文件, emacs cds.lib (若当前目录下无 cds.lib 则创建该文件,若有则打开该文件) (注: Linux 下较常用的文本编辑器是 vi,全部用命令实现文档编辑,建议大家查下 vi 编辑器的常用命令。emacs 是图形化编辑器,类似于 windows 下记事本。) 在其中写入: Define lab1muxlib ./lab1-mux.lib 存盘退出编辑器 3.创建(库)文件夹(即目录): 在命令行窗口输入以下命令 mkdir lab1-mux.lib 4.类似步骤 2,创建 hdl.var 文件,在其中写入:

Transcript of Cadence IC设计实验 -...

Page 1: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

Cadence IC 设计实验

实验五 NC-Verilog Simulator 实验

实验目的:NC_verilog 仿真器的使用,包括编译、运行和仿真。 预备工作: cp /eva01/cdsmgr/ ICDATA/NCVlog_3_4.tar . tar -vxf NCVlog_3_4.tar

Lab1。运行一个简单的 Verilog 设计

[1]、设置设计环境 1.cd NCVlog_3_4/lab1-mux ls (显示当前目录下的文件)

可以看到该目录包含了用来描述一个多路选择器和其测试平台的 verilog 模块,分别是

mux.v 和 mux_test.v。以下是 mux_test.v 模块内功能模块的端口框图。

建议:如果有时间,你 好看一看各模块(module)的 Verilog 代码!(用下面的 emacs

命令) 2.创建 cds.lib 文件,

emacs cds.lib (若当前目录下无 cds.lib 则创建该文件,若有则打开该文件) (注: Linux 下较常用的文本编辑器是 vi,全部用命令实现文档编辑,建议大家查下 vi编辑器的常用命令。emacs 是图形化编辑器,类似于 windows 下记事本。) 在其中写入:

Define lab1muxlib ./lab1-mux.lib 存盘退出编辑器

3.创建(库)文件夹(即目录): 在命令行窗口输入以下命令 mkdir lab1-mux.lib

4.类似步骤 2,创建 hdl.var 文件,在其中写入:

Page 2: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

Define WORK lab1muxlib 存盘退出

5.查看 verilog 源文件。mux.v 是 2 选 1 多路选择器 MUX2_1 的门级建模源文件,mux_test.v是 mux.v 的测试台,包含了输入激励信号和监控程序运行的任务语句。 [2]、编译源文件(ncvlog 命令):

鼠标回到你原先打开的 Terminal(或 Console)窗口,目录应为。。。 /你的学号

/NCVlog_3_4/lab1-mux。点击(激活窗口)。 1. ncvlog mux.v –messages ,这条指令是编译 mux.v。 2.打开 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 变量进行阐述。

Page 3: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

下图是 Lab2 实验用到的 register 和 counter 的端口框图。

[1].在 Terminal 窗口进入:你的学号/NCVlog_3_4/lab2-reg 目录; [2].参照 lab1 步骤,创建 cds.lib 文件,输入如下内容:

Define lab2reglib ./lab2-reg.lib Define projectlib ../project.lib 注意:两个点 Define techlib ../technology.lib 注意:两个点

存盘退出。

Page 4: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

[3].创建关联目录。

在:你的学号/NCVlog_3_4/lab2-reg 目录下,创建 lab2-reg.lib 目录(Folder), 在:你的学号/NCVlog_3_4 目录下,创建 project.lib 和 technology.lib 目录。

[4]、使用 hdl.var 中 WORK 变量: 1.进入你的学号/NCVlog_3_4/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)

Page 5: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

存盘退出 说明:将源文件路径映射到 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_3_4/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_3_4/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?

Page 6: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

[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_3_4/ 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

Page 7: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

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 模块的测试台:

Page 8: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

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 behav –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_3_4/ 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_3_4/ lab3-mem 目录。 [2]。ncvlog mem.v mem_test.v -mess [3]。用 nchelp 命令展开错误信息。

Page 9: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

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_3_4/ 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 (退出交互方式)

Page 10: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

Lab5。用 Tcl 进行调试

完整的 CPU 设计

[1]。进入 NCVlog_3_4/ 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

Page 11: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

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

Page 12: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname

Lab6。用图形用户接口进行调试 [1]。进入 NCVlog_3_4/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]。稍等。出现 NV Verilog 图形窗口,用鼠标移到上面的工具图标上,观察主窗口功能。 [5]。在弹出的 Design Browser 1 –SimVision 窗口左边的 Design Browser 小窗口双击展开

cpu_test 模块,选中 cpu1,如下图所示。

[6]。用窗口菜单命令 Select->Signals 来选择当前 scope(cpu_test.cpu1 scope)中的所有信号,

然后点击 。 [7]。运行仿真程序。

ncsim>run 300 ns

你应该得到一个同下图类似的波形图(点击 中的 ) 。

Page 13: Cadence IC设计实验 - staff.ustc.edu.cnstaff.ustc.edu.cn/~huxw/VLSI%CA%B5%D1%E9/lab5_NCverilog.pdf · 2.编译clockgen.vb: ncvlog clockgen.vb –work projectlib ... (如果你已经做过了lab3,又重新做这一步,你必须加-viewname