如何利用脚本进行QuestaSimvcs仿真脚本

->【亚军:Vivado入门与提高】
你好!我想直接用modesim直接仿真vivado的ip核但找不到类似Xilinxcorelib的这种ip核库,要想独立仿真有什么解决方法么?下面将这一过程重新展示一遍,在&艾米电子&blog中采用的是ModelSim-Altera 6.5e (Quartus II 10.0) Starter Edition,在参考作者原来的基础上,我采用的平台是QuartusII11.1 +Questasim 10.0c(同为Mentor公司出品,Modelsim的增强版)
所以文章的模式同原来的文章采用同一个描述方式:
1 设计流程
使用Questasim 仿真的基本流程为
2 开始仿真工程建立
2.1 首先打开Questasim
图2.1 Questasim界面
打开后的界面如下图所示
图2.2 Questasim界面
1-选择择File&New&Preject创建一个新工程。打开的Create Project对话框窗口,可以指定工程的名称、路径和缺省库名称。一般情况下,设定Default Library Name为work。指定的名称用于创建一个位于工程文件夹内的工作库子文件夹。该对话框如图2.2所示,此外还允许通过选择.ini文件来映射库设置,或者将其直接拷贝至工程中。
图2.4建立工程project : ssram
在这里我们选择新建一个文件夹,project name 叫ssram,不使用default的project locaion文件夹,而是用自己的一文件夹ssram,不使用default
library 采用自己新建的一个库ssram2,点击OK,关闭对话框。
图2.4 安排project所在的文件夹
2 关闭上一对话框后,会弹出新的一个Add items to the project 对话框:
图2.5 新添加文件对话框
在这一对话框里,我们看到在Add Items to the Project对话框中,包括以下选项:
Create New File&&使用源文件编辑器创建一个新的Verilog、VHDL、TCL或文本文件
Add Existing File&&添加一个已存在的文件
Create Simulation&&创建指定源文件和仿真选项的仿真配置
Create New Folder&&创建一个新的组织文件夹
1.单击Create New File,打开如下图所示的对话框:
图2.6 创建工程文件夹
2. 输入文件名称ssram_tst,在Add file as type(文件类型)中选择Verilog
3. 单击OK,关闭本对话框。新的工程文件将会在工程窗口显示。单击Close,以关闭Add Items to the Project。
单击选中project栏中ssram_tst文件,右键选择属性properities,可以看到文件所在位置正是我们新建的文件夹的位置。
图2.7 文件properities
4. 双击打开ssram_tst文件,(注意:若是Verilog文件已经关联了其他的文本编辑器,则双击后在关联的文本编辑器中打开)。
右侧,便是代码输入窗口。在这一窗口中输入的是testbench代码,用于module的测试。
在ssram_tst.v中输入下面的测试代码:
`timescale 1 ns/ 1 ps
module SRAM_vlg_tst();
// constants
// general purpose registers
reg [15:0] treg_SRAM_DATA;
reg clk50M;
reg rst_n;
wire [17:0]
SRAM_ADDR;
wire SRAM_CE_n;
wire [15:0]
SRAM_DATA;
wire SRAM_LB_n;
wire SRAM_OE_n;
wire SRAM_UB_n;
wire SRAM_WE_n;
wire led_R;
// assign statements (if any)
assign SRAM_DATA = treg_SRAM_DATA;
// port map - connection between master ports and signals/registers
//在例化的时候最好不用i1作为例化名,这样Modelsim可能不认识,起一个另外的名字最好
.SRAM_ADDR(SRAM_ADDR),
.SRAM_CE_n(SRAM_CE_n),
.SRAM_DATA(SRAM_DATA),
.SRAM_LB_n(SRAM_LB_n),
.SRAM_OE_n(SRAM_OE_n),
.SRAM_UB_n(SRAM_UB_n),
.SRAM_WE_n(SRAM_WE_n),
.clk50M(clk50M),
.led_R(led_R),
.rst_n(rst_n)
rst_n = 1'b1;
rst_n &= 1'b0;
#5000 rst_n &= 1'b1;
initial begin
clk50M =1'b0;
#10 clk50M &= ~clk50M;
录入完代码后,单击Save。出现下面的状态。
图2.9 输入testbench代码
在sava后,右侧的代码区关键词变成了红色//在例化的时候最好不用i1作为例化名,这样Modelsim可能不认识,起一个另外的名字最好。
其是本质和模块的调用是一致的,就是用tesrbench的代码去调用例化在testbench中的待测试Module。
声明好自己的testbench,reg和wire变量,然后再例化好待测试module,再编写测试代码,这样就可以了
5. 选择File&New&Source&Verilog,创建新的Verilog文件,如图2.10所示。
图2.10 建立新的source 文件,这便是要被测试的module代码。
6. 录入下面的代码,录入画面如图2.11 所示。
module SRAM(//host side take the chip as two side:one close to host,the other to the divice
//SRAM signals
SRAM_CE_n,
//Chip slect Input&&
SRAM_OE_n,
//Output Enable Input
SRAM_WE_n,
//Write Enable Input
SRAM_ADDR,
//address input
SRAM_DATA,
//data inout
SRAM_LB_n,
//Lower-byte Control (I/O0-I/O7)
SRAM_UB_n,
//Upper-byte Control (I/O8-I/O15)
//divice side
[15:0] SRAM_DATA;//data inout
output[17:0] SRAM_ADDR;//address
output SRAM_CE_n;//Chip Enable
output SRAM_WE_n;//Write Enable
output SRAM_OE_n;//Output Enable
output SRAM_LB_n;//Lower-byte Control (I/O0-I/O7)
output SRAM_UB_n;//Upper-byte Control (I/O8-I/O15)
output led_R;
//&&&O&&&AÐ&&C&&C&Ð&A&&A
wire write_req,read_
//------------------------------------------------------------
//&&&&&O&&&&N&O&E&delay 1.28s
//&N&O&E&¼&AE&E&&AE&
always @ (posedge clk50M or negedge rst_n)
if(!rst_n) delay &= 26'd0;
else delay &= delay+1;
//²&&&I¼&AE&E&&&&O&U&AE&U&O¼&I&1.28s
//--------------------------1.28s&I&&O&U&AE&U----------------------------
assign write_req = (delay == 26'd9999);//&I&E¾&¹&0.2ms&N&O&E&&&&¼&&Ð&&E&¾&Y
assign read_req = (delay == 26'd19999);//Ð&&E&¾&Y0.2ms&&&¼&&&&A³&&E&¾&Y&&¼&0.4ms&E&&&A³&
assign RAM_CE_n = 1'b0;
//Chip Enable
assign SRAM_OE_n = 1'b0;
//output enable
assign SRAM_LB_n = 1'b0;
//Lower-byte Control
assign SRAM_UB_n = 1'b0;
//Upper-byte Control
//---------------------------------------------------
//&&&O&3&&¼&A&&&AE&
reg [15:0] wr_
//Ð&&E&&E&¾&Y&&A&O&
reg [15:0] rd_
//&&A³&&E&¾&Y&&A&O&
reg [17:0] da_
//&&&&&AE&&&O&O&&&A&O&
reg led_r;
always @(posedge clk50M or negedge rst_n)
if (!rst_n) wr_data &= 16'd0;
else if (delay[9:0] == 10'd1023) wr_data &= wr_data+1'b1;
//&E&¾&Y&&O&&¼&O1
//&A&&O&U&AE&U0.6ms(29999&&&E&&O&O)¾&I&&&&&&&&20.48us&&1024&&&E&&O&O&&&&&O&&&&O¼&E&C26bit&¼&E&C1²&A&E&C&I&1.28s
//&O&U&&E¾&I&I&&&&O&U&A&1.28s³&E&A&E&O&&&&N&&&&&&A&&&26&I&&¼&&³&E&A&E1&E&&&²&A&&&E¼&I&A&&I&&AÐ&
always @(posedge clk50M or negedge rst_n)
if (!rst_n) da_adrs &= 1'b0;
else if(delay[9:0] == 10'd1023) da_adrs &= da_adrs+1'b1;
//&&O&O&&&O&&¼&O1
//&O&U&O&&A&&&E½&IÐ&&E&&&I&&A³&&&A&E&¾&Y&E&C&&&O&&O&A
always @(posedge clk50M or negedge rst_n)
if (!rst_n) led_r &= 1'b0;
else if (wr_data == da_adrs) led_r &= 1'b1;
else led_r &= 1'b0;
assign led_R =led_r;
/////////////////////////////////////////////////////////////////////
`define delay_160ns (cnt == 3'd7)
reg [2:0] state_now,state_
parameter IDLE = 3'b000,
WR0 = 3'b001,
WR1 = 3'b010,
RD0 = 3'b011,
RD1 = 3'b100;
//------------------------------------------------------------
//&&&I&&&&I&³&E&&AÐ&&&&I&&&&&
always @ (posedge clk50M or negedge rst_n)
if(!rst_n) cnt &= 3'd0;
else if(state_now == IDLE) cnt &= 3'd0;
else cnt &= cnt+1'b1;
always @(posedge clk50M or negedge rst_n)
if (!rst_n) state_now &= IDLE;
else state_now &= state_
always @(state_now or write_req or read_req or cnt)
case (state_now)
IDLE: if (write_req) state_next &= WR0;
//½&&E&Ð&&&&I&
else if (read_req) state_next &= RD0;
//½&&E&&&A&&&I&
else state_next &= IDLE;
WR0: if (`delay_160ns)
state_next &= WR1;
//&N&O&E&&&E&&160ns
else state_next &= WR0;
WR1: state_next &= IDLE;
//Ð&½&&E&,&&&&Oidle
if(`delay_160ns)
state_next &= RD1;
state_next &= RD0;
state_next &= IDLE;
//&&A½&&E&,&&&&Oidle
state_next &= IDLE;
//-------------------------------------------------------------------
SRAM_ADDR = da_//SRAM&&O&O&&I&&A&½&O
//-------------------------------------------------------------------
reg datbus_
//&E&¾&Y&&U&I&&&O&O&AEÐ&A&&A,&&A&E&¾&Y&E&C&O&½&O&&A¾&I&&E&O&O&A&E
always @(posedge clk50M or negedge rst_n)
if (!rst_n) rd_data &= 16'd0;
else if (state_now == RD1)
rd_data &= SRAM_DATA;
//&O&E&&A³&¼&A&&&AE&rd_data¼&C&A¼&&A³&&E&¾&Y&&U&I&SRAM_DATA&&A&E&¾&Y
always @(posedge clk50M or negedge rst_n)
if (!rst_n) datbus_ctrl &= 1'b0;
case (state_now)
IDLE: if (write_req) datbus_ctrl &= 1'b1;
else if (read_req) datbus_ctrl &= 1'b0;
else datbus_ctrl &= 1'b0;
//&O&&&½&inout&&E&&U&O&A&&&&&I&
datbus_ctrl &= 1'b1;
//&I&&E&¾&Y&&U&I&Ð&&E&¾&Y
default: datbus_ctrl &= 1'b0;
//&E&¹&&E&Cwrite&O&&O&A&E&¾&Y&&U&I&&&&&&I&&&E&&write
// write&OÐÐ&,½&&I&&E&¾&Y&&U&I&SRAM_DATAÐ&&E&wr¼&A&&&AE&wr_data&&A&O&
SRAM_DATA = (datbus_ctrl)? wr_data : 16'
SRAM_WE_n = ~(datbus_ctrl);
录入后,save。弹出一对话框,取名ssram,然后browse到我们原来所新建的文件夹里,如下图
图2.11 保存module 代码
8. 选择Project&Add to Project&Existing File,如图2.12所示。
图2.12 找到自己新添加的source 代码
9. 单击Browse,选择ssram.v,如图2.13 所示。
10. 单击打开,在Add file to the project窗口,单击OK
2.3 编译文件
在Project标签下的Status列的问号,表示文件尚未编译进工程,或者在最后编译前,源文件有所改动。欲编译文件,选择Compile&Compile ALL,或者右击Project标签,选择Compile&Compile All。
1. 倘若此处没有错误,编译成功的消息,就会在Transcript窗口如图2.15所示。
图2.15 transcript在下面!!!
# reading modelsim.ini
# reading D:\questasim_10.0c\win32/../modelsim.ini
# Loading project ssram
# Compile of ssram_tst.v was successful.
# Compile of ssram.v was successful.
# 2 compiles, 0 failed with no errors.
&编译成功!
3 仿真工程
3.1 开始仿真
1. 单击Library图标,选择ssram2,单击+以展开选项,然后选择SRAM_vlg_tst。单击右键,选择simulate编译(或者进行双击),如图3.1所示。
2. 单击Simulate,到达图3.2所示画面。
图3.2 仿真窗口
4. 在图3.2中,单击SRAM_vlg_tst,单击右键,然后选择Add&To Wave&All Items in region,然后单击左键。出现图3.3所示画面。
图3.3 Add to wave 出现波形图显示区
3.2 仿真设置
1.& 完成上述最后一步后,波形窗口出现。
2. 在Run Length列输入仿真时间长度为1000ms,如图3.5所示。
图 3.5 Run length 的设置
3. 单击Run按钮进行仿真,如图所示。
等待若干秒后,出现波形图如图3.6。
图3.6 &仿真波形图
5. 连续单击Zoom IN/Out图标,可查看仿真的完整波形。
通过放大/缩小波形,可以观察到ssram的地址值在保持变化,即ssram的时序效果。若将其移植到Quartus II中,适当配置后,经过综合、时序分析、引脚分配、配置及下载等,即可实现ssram读取比较正误的效果。
至此,仿真的所有进程完毕,感谢艾米电子!
&关于Modelsim独立仿真
&关于Debussy 5.3v9 + Modelsim SE 6.5联合仿真的
阅读(...) 评论()Modelsim仿真方法 前仿真和后仿真的区别_西西软件资讯
西西软件园多重安全检测下载网站、值得信赖的软件下载站!
→ Modelsim仿真方法 前仿真和后仿真的区别
10.1a 特别版
类型:行业软件大小:315.4M语言:英文 评分:6.8
仿真的目的是在软件环境下,验证电路的行为和设想中的是否一致。使用Modelsim仿真工具进行操作,Modelsim需要和Quartus II建好关联!建立 Quartus II 和 modelsim 的联系①&&完成上述工作之后需要在 Quartus II 中设置 modelsim 路径,Quartus II 菜单Tools ――&General――&EDA Tool Options,进行相关设置,如modelsim:C:\Modeltech_6.3g\win32&&如图2所示。modelsim功能仿真步骤&一、启动软件建立文件夹,在modelsim中选file下的change directory,在其中的choose folder对话框中设置目录路径。二、建立工程选file 的new下面的project,在project name中填写项目名字。项目名最好与顶层文件名一致。project location 是工作目录,可自己选择。default library name可直接采用默认的work,如此,workspace窗口中的library中就会出现work库。三、为工程添加文件选择add exsiting file后,根据相应提示将文件添加打牌projcet中,包括设计顶层文件.v以及测试向量文件.v/.vt。四、编译文件compile中的compile all。五、装载文件选择library中的work里面的测试向量文件,点击simulate下的start simulation。六、开始仿真在workspace下的sim中,选择测试向量,右击,选add中的add to wave,然后在simulate中选择run all。七、退出仿真simulate中的end simulation。注:1 亦可不添加bench,开始的步骤均同上,在装载文件时,选中设计文件,在sim中点add 里面的add to wave。直接对输入信号编辑测试波形(右击要编辑的信号,选中create wave),然后点击run里面的run all。2 在modelsim中直接写testbench。先在file中选中new里面的source,则在菜单栏里面会出现一个source栏目,在source底下勾选show language templates,则会出现该加载项,双击其中的create testbench,会出现一个create testbench wizard,在work中选中设计文件,再点击next,可以指定testbench名及要编译到的库等,默认即可,点击finish后自己添加内容就ok了。保存文件后缀为.v.完了之后同前步骤将testbench文件编译到工作库里面即可。Modelsim的仿真分为前仿真和后仿真,下面先具体介绍一下两者的区别。1 前仿真前仿真也称为功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟,主要是验证电路与理想情况是否一致。可综合FPGA代码是用RTL级代码语言描述的,其输入为RTL级代码与Testbench.2 后仿真后仿真也称为时序仿真或者布局布线后仿真,是指电路已经映射到特定的工艺环境以后,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,是否存在时序违规。其输入文件为从布局布线结果中抽象出来的门级网表、Testbench和扩展名为SDO或SDF的标准时延文件。SDO或SDF的标准时延文件不仅包含门延迟,还包括实际布线延迟,能较好地反映芯片的实际工作情况。一般来说后仿真是必选的,检查设计时序与实际的FPGA运行情况是否一致,确保设计的可靠性和稳定性。选定了器件分配引脚后在做后仿真。3 Modelsim仿真的基本步骤Modelsim的仿真主要有以下几个步骤:(1)建立库并映射库到物理目录;(2)编译原代码(包括 Testbench);(3)执行仿真。上述3个步骤是大的框架,前仿真和后仿真均是按照这个框架进行的,建立modelsim工程对前后仿真来说都不是必须的。3.1建立库在执行一个仿真前先建立一个单独的文件夹,后面的操作都在此文件下进行,以防止文件间的误操作。然后启动Modelsim将当前路径修改到该文件夹下,修改的方法是点File-&Change Directory选择刚刚新建的文件夹见下图。图3 新建文件夹做前仿真的时候,推荐按上述建立新的文件夹。做后仿真的时候,在 Quartus II 工程文件夹下会出现一个文件夹:工程文件夹\simulation\modelsim,前提是正确编译 Quartus II 工程;因此,不必再建立新的文件夹了。仿真库是存储已编译设计单元的目录,modelsim 中有两类仿真库,一种是工作库,默认的库名为work,另一种是资源库。Work库下包含当前工程下所有已经编译过的文件。所以编译前一定要建一个work库,而且只能建一个work库。资源库存放work库中已经编译文件所要调用的资源,这样的资源可能有很多,它们被放在不同的资源库内。例如想要对综合在cyclone芯片中的设计做后仿真,就需要有一个名为cyclone_ver的资源库。映射库用于将已经预编译好的文件所在的目录映射为一个modelsim可识别的库,库内的文件应该是已经编译过的,在Workspace窗口内展开该库应该能看见这些文件,如果是没有编译过的文件在库内是看不见的。建立仿真库的方法有两种。一种是在用户界面模式下,点File-&New-&Library出现下面的对话框,选择a new library and a logical mapping to it,在Library Name内输入要创建库的名称,然后OK,即可生成一个已经映射的新库。另一种方法是在Transcript窗口输入以下命令:vlib workvmap work work图4 建立仿真库如果要删除某库,只需选中该库名,点右键选择Delete即可。需要注意的是不要在modelsim外部的系统盘内手动创建库或者添加文件到库里;也不要modelsim用到的路径名或文件名中使用汉字,因为modelsim可能无法识别汉字而导致莫名其妙的错误。3.2编写与编译测试文件&&&&在编写Testbench之前,最好先将要仿真的目标文件编译到工作库中,点Compile-&Compile或 ,将出现下面的对话框,&图5 编译目标文件在Library中选择工作库,在查找范围内找到要仿真的目标文件(Library选择刚才建立的库,查找范围选择目标文件所在的文件夹),然后点Compile和Done;或在命令行输入vlog Counter.v。此时目标文件已经编译到工作库中,在Library中展开work工作库会发现该文件。&&&&&&当对要仿真的目标文件进行仿真时需要给文件中的各个输入变量提供激励源,并对输入波形进行的严格定义,这种对激励源定义的文件称为Testbench,即测试台文件。下面先讲一下Testbench的产生方法。&&&&方法一:我们可以在modelsim内直接编写Testbench,而且modelsim还提供了常用的各种模板。具体步骤如下:&&&&⑴ 执行File-&New-&Source-&verilog,或者直接点击工具栏上的新建图标,会出现一个verilog文档编辑页面,在此文档内设计者即可编辑测试台文件。需要说明的是在Quartus中许多不可综合的语句在此处都可以使用,而且testbench只是一个激励源产生文件,只要对输入波形进行定义以及显示一些必要信息即可,切记不要编的过于复杂,以免喧宾夺主。&&&&⑵ Modelsim提供了很多Testbench模板,我们直接拿过来用可以减少工作量。在verilog文档编辑页面的空白处右键点Show Language Templates然后会出现一个加载工程,接着你会发现在刚才的文档编辑窗口左边出现了一个Language Templates窗口,见下图。图6 应用模板生成 Testbench文件双击Creat Testbench会出现一个创建向导,见下图。&图7 创建向导选择Specify Design Unit工作库下,work工作库下的目标文件,点Next,出现下面对话框:&图8 设置Testbench向导可以指定Testbench的名称以及要编译到的库等,此处我们使用默认设置直接点Finish。这时在Testbench内会出现对目标文件的各个端口的定义还有调用函数接下来,设计者可以自己往Testbench内添加内容了(有注释的为添加的内容),然后保存为.v格式即可。按照前面的方法把Testbench文件也编译到工作库中。图9 生成及修改后的Testbench文件方法二:在 Quartus II 内编写并编译 Testbench ,之后将 Testbench 和目标文件放在同一个文件夹下,按照前面的方法把 Testbench 文件和目标文件都编译到工作库中之后。:如果在工作库中没有该文件(在Testbench文件没有端口的情况下),则在Simulate――&Start Simulate卡片中去掉优化选项,如下图所示。之后再重新编译,即可在工作库中找到该文件。&图10 去掉优化选项3.3执行仿真&&&&因为仿真分为前仿真和后仿真,下面分别说明如何操作。⑴ 前仿真&&&&前仿真,相对来说是比较简单的。在上一步我们已经把需要的文件编译到工作库内了,现在我们只需点simulate-&Start Simulation或快捷按钮 会出现start simulate对话框。点击Design标签选择Work库下的 Testbench 文件,然后点 OK 即可,也可以直接双击 Testbench文件Counter_tb.v,此时会出现下面的界面。图11 start simulate在主界面中会多出来一个Objects窗口,里面显示 Testbench 里定义的所有信号引脚,在Workspace里也会多出来一个Sim标签。右键点击Counter_tb.v,选择Add-&Add to Wave,如下图所示。然后将出现Wave窗口,现在就可以仿真了,见下图。图12 Wave窗口&&&&窗口里面已经出现了待仿真的各个信号,点 将开始执行仿真到100ns,继续点仿真波形也将继续延伸,见下图。&图13 仿真波形若点 ,则仿真一直执行,直到点 才停止仿真。也可以在命令行输入命令: run @1000则执行仿真到1000ns,后面的1000也可以是别的数值,设计者可以修改。在下一次运行该命令时将接着当前的波形继续往后仿真。 至此,前仿真步骤完成。⑵ 后仿真这里是采用的Cyclone ii做的一个counter的例子。后仿真与前仿真的步骤大体相同,只不过中间需要添加仿真库(和所选器件及所有IP Core相关)、网表和延时文件的步骤。后仿真的前提是quartus已经对要仿真的目标文件进行编译,并生成modelsim仿真所需要的.vo文件(网表文件)和.sdo文件(时延文件),具体操作过程又有两种方法,一种是通过Quartus调用Modelsim,Quartus在编译之后自动把仿真需要的.vo文件以及需要的仿真库加到modelsim中,操作简单;一种是手动将需要的文件和库加入modelsim进行仿真,这种方法可以增加主观能动性,充分发挥modelsim的强大仿真功能。① 通过Quartus调用Modelsim使用这种方法时首先要对Quartus进行设置。 先运行Quartus,打开要仿真的工程,点菜单栏的Assignments,点EDA Tool settings,选中左边Category中的Simulation.,在右边的Tool name中选ModelSim(Verilog),选中下面的Run Gate Level Simulation automatically after complication.见下图。图14 对Quartus进行设置Quartus中的工程准备好之后点击start complication按钮,此时modelsim会自动启动,而quartus处于等待状态(前提是系统环境变量中用户变量中PATH要设置好modelsim安装路径,如:D:\Modeltech_6.3\win32)。在打开的modelsim的Workspace窗口中你会发现多了工作库和资源库,而且work库中出现了需要仿真的文件。Modelsim自动将quartus生成的.vo文件编译到work库,并建立相应的资源库。如图所示。图15 Quartus II 编译之后自启动modelsim观察库,可以发现,多了verilog_libs库、gate_work库和work库,但是在&工程文件夹\simulation\modelsim&下,只有verilog_libs和gate_work文件夹,为什么库里面却多了一个work库呢?而且gate_work库和work库文件内容相同!gate_work 库是Quartus II 编译之后自动生成的,而work库是modelsim默认库。仔细观察二者路径,二者路径相同,均为gate_work文件夹,可知 modelsim 将 gate_work 库映射到 work 库。因此,在后续的工作中操作gate_work 库或者 work 库都能得到正确结果。编写测试台程序Counter_tb.v ,最好放在生成的.vo文件所在的目录,以方便在需要手动仿真时使用。点Compile在出现的对话框中选中Counter_tb.v文件,然后点Compile按钮,编译结束后点Done,这时在Work库中会出现测试台文件。如下图所示。图16 编译测试文件点击simulate-&Start Simulation或快捷按钮 会出现start simulate对话框。点击Design标签选择Work库下的Counter_tb.v文件,然后点击Libraries标签在Search Library中点击Add按钮,选择仿真所需要的资源库(如果不知道需要选择哪个库,可以先直接点Compile看出现的错误提示中说需要的库名,然后再重复上述步骤)见下图。&图17 选择仿真所需要的资源库再点start simulate对话框的SDF标签。在出现的对话框的SDF File框内加入.sdo时延文件路径。在Apply To Region框内有一个“/”, 在“/”的前面输入测试台文件名,即“Counter_tb”,在它的后面输入测试台程序中调用被测试程序时给被测试程序起的名称,本例中为“DUT”,见下图。然后点OK。后面观察波形与前仿真步骤相同。&图18 添加.sdo文件自动仿真和手动仿真的区别:这种方法比较简单,因为Quartus II调用Modelsim ,所以除了生成自动生成了modelsim仿真所需要的.vo文件(网表文件)和.sdo文件(时延文件)外,还生成了gate_work文件夹、verilog_libs文件夹;gate_work文件夹(可以叫工作库,也可以叫编译库)下存放了已编译的文件,verilog_libs文件夹下存放了仿真所需要的资源库,上例是cycloneii_ver库(文件夹)。而手动仿真则需要自己添加这些文件和库。具体如下。② 手动仿真手动仿真需要自己添加文件和编译库,但可以充分发挥modelsim强大的仿真功能。操作时也要先对quartus进行设置,设置与前面相同只是不要选中Run Gate Level Simulation automatically after complication。然后启动modelsim,将当前路径改到&工程文件夹\simulation\modelsim&下。如下图所示。图19 启动modelsim相比①中,这里少了一些库(实际是verilog_libs库、gate_work库和work库),因此下面要添加一个库。新建一个库,此处默认库名为work,此时,&工程文件夹\simulation\modelsim&文件夹下出现了一个work文件夹,work库下面没有目标文件和测试文件,即work文件夹下没有任何文件,建库的目的就是将编译的文件都放在该库里,即放在该文件夹下。编译之前,还需要添加仿真所需要的资源库cycloneii_atoms(用到EP2C8),将D:\altera\90\quartus\eda\sim_lib目录下的cycloneii_atoms文件复制到.vo所在的目录,即&工程文件夹\simulation\modelsim&下。如果按照①中的方法编写testbench并同样放在.vo所在的目录,这时点Compile下的Compile或点 将会出现下面的对话框,将所选文件进行编译。&图20 编译所需文件和资源库编译完成之后,work工作库下多了很多文件,同样work文件夹下也多了很多文件(夹),建库的目的可见一斑,其中有Counter_tb测试文件和counter目标文件。点击simulate-&Start Simulation或快捷按钮 会出现start simulate对话框。这里和①相比只有Libraries标签在Search Library时不一样,其余2项都一样。Libraries标签在Search Library的设置如下图。图21 选择仿真所需要的资源库后面的观察波形步骤跟前面一样。四、观察波形的一些方法和技巧。4.1 手动创建输入波形(待定)对于复杂的设计文件,最好是自己编写testbench文件,这样可以精确定义各信号以及各个信号之间的依赖关系等,提高仿真效率。对于一些简单的设计文件,也可以在波形窗口自己创建输入波形进行仿真。具体方法是鼠标右击work库里的目标仿真文件counter.v,然后点create wave,弹出wave default窗口。如下图所示。图22 Add to Wave在wave窗口中选中要创建波形的信号,如此例中的CLK,然后右键点击,选择Create/Modify/Wave项出现下面的窗口:图23 设置输入波形在Patterns中选择输入波形的类型,然后分别在右边的窗口中设定起始时间、终止时间以及单位,再点Next出现下面的窗口,我们把初始值的HiZ改为0,然后修改时钟周期和占空比,然后点Finish。图24 设置输入波形接着继续添加其他输入波形,出现下面的结果。前面出现的红点表示该波形是可编辑的。后面的操作与用testbench文本仿真的方法相同 。图25 仿真波形4.2 观察特定信号波形如果设计者只想查看指定信号的波形,可以先选中objects窗口中要观察的信号,然后点右键选择Add to Wave-&Selected signals,见下图,那么在Wave窗口中只添加选中的信号。&图26 查看特定信号波形4.3 保存和导入波形文件(待定)如果要保存波形窗口当前信号的分配,可以点File-&Save,在出现的对话框中设置保存路径及文件名,保存的格式为.do文件。如果是想导出自己创建的波形(在文章最后有详细的解释)可以选择File-&Export Waveform在出现的对话框中选择EVCD File并进行相关设置即可。如果导入设计的波形选择File-&Import ECVD即可。4.4 Dataflow窗口观察信号波形在主界面中点View-&Dataflow可以看到会出现dataflow窗口,在objects窗口中拖一个信号到该窗口中,你会发现在dataflow窗口中出现你刚才选中信号所在的模块,如果双击模块的某一引脚,会出现与该引脚相连的别的模块或者引线,见下图。图27 Dataflow窗口在dataflow窗口中点View-&Show Wave,会在dataflow窗口中出现一个wave窗口,双击上面窗口中的某一模块,则在下面的wave窗口中出现与该模块相连的所有信号,如果已经执行过仿真,在wave窗口中还会出现对应的波形,见下图。图28 Dataflow窗口观察仿真波形在波形窗口中拖动游标,上面模块的引脚信号的值也会随着游标当前位置的改变而改变。如果要在modelsim中修改原设计文件,在文档页面点击右键,取消Read Only,即可修改,修改后继续仿真。如果想结束仿真可以点Simulate-&End Simulation,或直接在命令行输入quit -sim,此时quartus也会显示结束所有编译过程。五、 一些说明关于在testbench里使用`timescale的问题`timescale 是编译器指令,用来定义时延精度和时延单位,命令格式为&&&`timescale time_unit/time_precision&&&&其中time_unit定义时延单位,即后面模块中出现的时延数值的单位,time_precision定义时延精度。例如&&&`timescale 1ns/100ps &表示时延单位为1ns,时延精度为100ps。&&&&如果后面有语句 #5.22 a=1;&&&&此时时延值5.22ns应该对应为5.2ns,因为精度为0.1ns。如果设计中多个模块带有自身的`timescale,编译时模拟器总是定义在所有模块的最小时延精度上,并且所有模块中的时延都自动地换算为到最小试验精度上。附录:Counter源代码:&`timescale 1ns/100ps&module Counter (&input&&&&&&&&CLK,&input&&&&&&&&RST_N,&output [3:0] CNT&);&reg [3:0]&assign CNT =&always@(posedge CLK, negedge RST_N) begin&if (!RST_N)&&&&&cnt &= #5 4'h0;&else&&&&&cnt &= #0 cnt + 1'b1;&end&endmodule&Counter_tb源代码:`timescale 1ns/100psmodule Counter_tb&&;&&wire&&[3:0]&&CNT&&&;&&reg&&&&RST_N&&&;&&reg&&&&CLK&&&;&&Counter&&&&DUT&&(&&&&&&&.CNT (CNT ) ,&&&&&&.RST_N (RST_N ) ,&&&&&&.CLK (CLK ) );///view/cd93f34ecf84b9d528ea7a95.html &&&&&initial begin&#0 CLK&&&= 1'b0;&&&&RST_N = 1'b0;&#5 RST_N = 1'b1;&end&// 50MHz&always #10 CLK = ~CLK;
11-0602-0902-0602-0502-0202-0202-0101-2701-2401-13
阅读本文后您有什么感想? 已有23人给出评价!
名称大小下载

我要回帖

更多关于 adams脚本仿真教程 的文章

 

随机推荐