1、武汉大学电工电子实验教学示范中心集成电路设计实验实验报告电子信息 学院 电子信息工程 专业 2014 年 5 月 22 日实验名称 8 位累加器 VCS CLI 仿真验证( 实验三) 指导教师 孙涛姓名 江燕婷 年级 2011 级 学号 2011301200025 成绩一、预习部分1 实验目的(预期成果)2 实验基本原理(概要)3 主要仪器设备(实验条件,含必要的元器件、工具)一、实验目的掌握集成电路计算机设计工具验证仿真工具 VCS(Verilog Compiled Simulator)的基本操作命令行命令,从集成电路 Verilog 设计到 VCS 验证的基本流程;掌握利用命令行来实现对
2、Verilog 设计的调试与分析。二、实验基本原理1.VCS 是编译型 Verilog 模拟器,它完全支持 OVI 标准的 cVerilog HDL 语言、PLI 和 SDF。VCS 首先会读入 Verilg 的源文件,检查语法及语言结构错误,即Compiler;然后结合测试模块,进行时序的仿真,即 Simulator;最后根据时序图进行调试,修改源程序,即 Debugger。2.本次实验中需要用到的一些基本命令有:ls- 显示文件名cd- 转换目录cd/-退出两层more- 以分页方式查看文件内容pwd- 显示当前路径 vcs source_file complie_time_options
3、 编译 verilog 文件成为一个可执行的二进制文件,source_file 指所有用 Verilog 编写的待测文件。simv run_time_options 运行可执行文件 vcs source_files R 单命令行方式,-R 表示编译后立即执行。3.VCS 调试的基本方式a.Verilog SystemTask calls 主要是将一些函数加到测试模块中,从而实现相应的操作。b. CLI 调试,实际上是用命令行的方式来进行调试。c. VirSim 进行仿真、验证与调试。4.8 位累加器逻辑框图2图 1 5.实验设备与软件平台UNIX 服务器,unix 工作站及 Synopsys
4、VCS。二、实验操作部分1 实验数据、表格及数据处理(综合结果概要、仿真波形图、时序分析结果、signalTAPII 结果等)2 实验操作过程(可用图表示)3 结论三、实验操作过程1.VCS 的编译此步骤实验内容参照实验讲义进行,略过。2. 利用 Verilog SystemTask Calls 进行调试。(1)在控制台下键入:cd /lab2/parta 进入 lab2 的 parta 部分, shell vcs f adder.f R,进行 8 位的加法运算,但会出现如下的显示:图 2这说明在源代码中存在错误,接下来要做的就是把错误找出来。(2)shellvi addertb.v 进入 v
5、i 编辑器对 addertb.v 文件修改。首先对 add8 的模块进行检测,如图所示在相应部分添加画圈部分代码。图 3其中 add8(u1)是指 8 位加法器的低四位相加模块。加入后保存文件,shell vcs f adder.f R 重新编译文件,会有如下的显示:图 4(3)因此在 add8(u1)中存在错误。为了进一步的检测,如图所示在相应部分继续添加画圈部分代码。3图 5为了设置断点将$finish 改为$stop ,这样每当发现一个错误的时候,结果都会由$display 函数显示出来,同时仿真过程会停在出错的地方。shell vcs f adder.f R重新编译文件,VCS 在遇到
6、$stop 后会停止仿真,同时进入 CLI 的调试阶段。图 6(4)可以看到在低位的相加上结果有误。为了确定最终的错误位置还要继续下一组数据的相加,在 CL 下多次输入 ”.”,最后可确定问题出在 fa 模块上。图 7(5)Cl quit,退出 CLI 模式。Shellvi fa.v 进入 vi 编辑器对 fa.v 文件修改,问题出在数据相加时没有将 cin 位加上。图 8(6)修改后重新编译,然后运行程序。shell simv +monitoroff,此时可以看到无错误提示,即运算正确。4图 9(7)利用+monitoroff 可以在运行程序时跳过所有的 $monitor 命令,从而加快运行
7、速度。图 103.利用 VCS CLI 进行调试(1) cd /partb 进入 lab2 的 partb。再一次运行程序,看是否运行正确。 shell vcs f adder.f R,得到如下结果:图 11为了可以解决出现的问题,这时需要在 addertb.v 中设置断点,把$finish 改为$stop,如下:图 12(2)接着编译并启动 CLI 界面。shell vcs f adder.f +cli+3 R s l sim.log,-s 可以启动 CLI 并且将仿真时间停在 0 时刻,-l 可以将所写过的命令记录下来。cli_0 ?可以显示所在的位置,即位于模块的哪一层。cli_1 sc
8、ope,cli_2.程序开始运行,有如下的显示。cli_3 show variables,会显示所有的变量。 cli_4 print a_test a_test b_test cin_test cout_test sum_test 可显示所有的变量值。5图 13(3) 可见 sum_test 的结果是不正确的, cli_5scope u1 可以进入 u1(add8)模块。cli_6 show variables。cli_7 alias praves print a b sum sum_0 sum_1 cin c4 。为了方便可以利用 alias 命令新设立一个命令 praves,用来显示变量值
9、, cli_8 prvaves。图 14(4) 可见问题出在高四位,为了确定错误需要检查源文件,另外开一个 UNIX 的控制台。在 add8.v 中可以看到,在对结果的高四位以及输出进位的赋值均出现了错误。回到 CLI 环境下,进行如下的操作:cli_9 print zero_add_cin one_add_cin,可得:zero_add_cin: 0 one_add_cin:1。对上述变量强制赋值,如下:cli_10 force zero_add_cin = 1cli_11 force one_add_cin =06图 15(5) 运用设定好的命令 praves 来显示变量值, cli_12
10、 pravas zero_add_cin one_add_cin,输出显示命令错误。cli_13 tbreak #10,cli_14 .,cli_15 praves, 输出显示命令错误。cli_16 print a_test a_test b_test cin_test cout_test sum_test,如下所示:图 16结果正确,现在 add8 模块中设置断点,以变量 c4 的上升沿位为标志。cli_17 always posedge u1.c4,cli_18 . 可以发现从 60 时刻到 26400 时刻均没有出现错误。cli_19 print a_test a_test b_test
11、 cin_test cout_test sum_test,显示变量值:a_test:01 b_test:08 cin_test:0 cout_test:0 sum_test:08结果正确,但由于仿真运行到断点出就停止了,那么断点后出现的错误就无法检测到,所以需要去除断点的限制。cli_20 tbreak #1,cli_21 .,cli_22 show break 会显示如图所示断点。(6) cli_24 delete 2,cli_25 . 则运行后成功编译如下图。图 17(7)可以将上述命令写在一个约束文件(script file)中,然后直接运行。这里已有一个test.s 的文件,下面来看如
12、何运行。(8)cli_26 $reset,cli_30 source test.s,7图 18(9)cli_31 prtb,cli_32 . 可以看到运行无误,此时结束仿真,退出 CLI,检查 log 文件,可以看到所有的操作都被记录在文件中。cli_33 $finish。图 19图 20(10) shell more sim.log 可以看到所有命令均被记录,由此也可以完成约束文件的建立。三、实验效果分析(与预期结果的比较,实验中发现的问题。包括仪器设备等使用效果)8四、实验思考题1 集成电路从设计到验证的基本流程?答:集成电路设计的基本流程是:(1)功能设计阶段,(2)设计描述和行为级验证
13、,(3)逻辑综合,(4) 门级验证,(5) 布局和布线。验证过程:(1)用 VCS 编译 Verilog 源程序,(2)执行 simv 进行仿真验证,(3) 在错误点停下,(4)确定错误并改正(4)编译仿真确认修改是否正确(5)解释结果。2 VCS 对 verilog 模型进行仿真包括哪两个步骤?答:VCS 对 verilog 模型进行仿真包括两个步骤:(1)编译 verilog 文件成为一个可执行的二进制文件,命令为: vcs source_file complie_time_options;(2)运行可执行文件,simv run_time_options3 VCS 验证各选项参数的含义?答
14、:(1) -y lib_dir 在 lib_dir 的路径下的所有文件中寻找未被编译的相关模块,(2)+libext+lib_ext 在 lib_dir 的路径下使用文件的扩展名 lib_ext 来寻找文件,(3) -s 在 0 时刻停止仿真,(4) $stop 采用断点的方式停止仿真,$finish 终止仿真过程,$display 将数据或消息等显示在控制台上,(5)? 显示所在的位置,即位于模块的哪一层,(6) print 显示所有的变量值,(7)scope 进入指定模块。4 在 lab1 中,能不能在 adder.f 文件中加入-R?答:不能。-R 的作用是显示文件及所有子目录,而 ad
15、der.f 为自定义格式,没有其他文件或子目录可以显示。5 在 lab1 中,是否可以用-v 代替-y ?如果可以该怎样进行?答:在 lab1 中,可以用-v 代替-y ,将命令行shell vcs addertb.v add8.v y /lib +libext+.v R改为:shell vcs addertb.v add8.v v vcs因为 partb 文件夹下仅有两个文件:addertb.v,add8.v ,其余的模块放在库文件的根目录下。-v lib_file 在文件 lib_file 中寻找未被编译的相关模块。-y lib_dir 在 lib_dir 的路径下的所有文件中寻找未被编译的相关模块。四、源代码(仅记录自己设计的,或者针对实验资料修改的部分)module fa(a, b, cin, sum, cout);input a, b, cin;output sum, cout;assign cout, sum = a + b+cin;endmodule教师评9语