版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ModelSim概览系统产品设计规范数字集成电路自动设计流程设计输入RTL仿真设计综合门级仿真布局和布线时序分析系统上验证修改设计设计流程3设计输入设计的行为或结构描述RTL仿真(ModelSim)功能仿真验证逻辑模型(没有使用时间延迟)可能要求编辑设计综合把设计翻译成原始的目标工艺最优化合适的面积要求和性能要求布局和布线 映射设计到目标工艺里指定位置 指定的布线资源应被使用设计流程4门级仿真 (ModelSim)时序仿真验证设计一旦编程或配置将能在目标工艺里工作可能要求编辑设计时序分析验证合乎性能规范可能要求编辑设计版图设计仿真版图设计在板编程和测试器件ModelSim简介ModelSim由
2、Model技术公司开发工业上最通用的仿真器之一支持Verilog , VHDL以及它们的混合仿真可以将整个仿真程序分步执行,使设计者可以直接看到他的程序下一步要执行的语句,在程序执行的任何步骤任何时刻都可以查看任意变量的当前值ModelSim产品1:ModelSim/VHDL或ModelSimVerilog -OEM2:ModelSim/LNL -许可VHDL或Verilog,但不同时许可3:ModelSim/PLUS -设计者能立刻混合仿真VHDL和Verilog4:ModelSim/SE -首要的版本 -PLUS的所有功能连同附加功能 ModelSim OEM功能1:提供完全的标准 -87
3、 VHDL -93 VHDL -IEEE 1364-95 Verilog -SDF 1.0 - 3.0 -VITAL 2.2b -VITAL 952:易用的界面 -通用的平台课程安排第一课时: 1:建立项目 2:建立库 3:编译源代码 4:执行前仿真 建立项目1:打开MODELSIM2: 选择File/New/Project, 出现右图所示的界面。3: Project Name 项目名称4:Project Location 项目存放路径5:Default Library Name 缺省库名(一般情况为work,系统会在项目存放路径自建work子目录)建立库1:需编译的引入文件 -激励文件 -源
4、文件 -源文件调用的子模块2:库的两种类型 (1)本次新建需编译的库(缺省为WORK) -包含当前被编译的设计单元 -编译前必须先建立WORK库 -每个项目只允许一个WORK库 (2)引用已有的库 -包含能被当前编译引用的设计单元 -在编译期间允许多个建立库的具体操作选择FileNew Library,出现下面的对话框 选择a new library and a logical mapping to it和输入库名 库的编译:选择CompileCompile,出现如下对话框:库文件存放的库名 库文件存放的路径映射逻辑新库:选择FileNew Library,出现下面的对话框。选择a map t
5、o an exciting library映射现有的库:选择FileNew Library,出现下面的对话框 选择箭头所示的选项 浏览库的路径使用这条命令映射到已经编译的库删除库命令:选中库名以后,右击出现快捷菜单,选择其中的Delete选项。编译源代码1:ModelSim中源代码的编译包括两部分:第一部分是对电路进行描述,可以是门级描述,也可以是行为级的描述;第二部分是测试文件的编写。2:以D触发器为例,对源代码的编译过程进行说明。(转下页)(1):按前面介绍的方法,先建一个D触发器的工程,D触发器的工程建完以后,出现如下界面: 选择Create New File在弹出的对话框中输入描述D触
6、发器电路的文件名:dff该对话框一定要选择Verilog再重复一次上面的步骤,选择Create New File,弹出相同的对话框:此对话框依然选择Verilog文件名为dff_test,表示测试文件。(一般测试文件的文件名都在原文件名后加test)(2):双击Project列表中的文件dff,打开文件编译的界面。在该界面中,可以输入D触发器的门级描述源代码,也可输入D触发器的行为级描述源代码。(如下图): 行为级描述门级描述-门级描述: 门级描述必须根据D触发器的原理图来进行描述。(原理图如下所示)(3):对描述D触发器的两种代码进行分析: -行为级描述的源代码:module sy_d_ff
7、(q,d,ck,clr); input d,ck,clr; output q; reg q; always (posedge ck or negedge clr)q=(!clr)?0:d;endmoduleq为输出信号,d为输入信号,ck为时钟信号,clr为清零信号。检测时钟上升沿和清零信号下降沿若clr=0,则q=0;若clr=1,则q=d寄存器门级描述的源代码如下所示:module dff_clr(q,data,clock,clear); input data,clock,clear; output q; nand nd1(a,data,nclk,clear); nand nd2(b,nd
8、ata,nclk); nand nd4(d,c,b,clear); nand nd5(e,c,nclock); nand nd6(f,d,nclock); nand nd8(qb,q,f,clear); nand nd3(c,a,d); nand nd7(q,e,qb); not iv1(ndata,data); not iv2(nclock,nclk); not iv3(nclk,clock);endmodule输入端data,clock,clear;输出端q。对照触发器的原理图,对图中所有的逻辑门进行了描述。语句的基本格式为:门的类型门的名称(输出端,输出端,输入端,输入端)。注意,必须是
9、输出端在前,输入端在后。但是,输出端之间可以交换位置,输入端之间也可以交换位置。()测试文件的描述:timescale 10ns/1nsmodule dff_clr_test(); reg data,clock,clear; wire q; dff_clr dff_clr_test(q,data,clock,clear); initial begin data=0; clock=0; clear=0; # 5 clear=1; end always #7 clock=clock; always #20 data=data;endmodule定义时间精度为1ns,时间单位为ns。输入信号输出信号
10、开始时,三个输入量都为0。5个时间单位后,clear变1。每过7个时间单位,clock翻转。每过20个时间单位,data翻转。(5):文件的编译: 在左边Project界面的空白处右击弹出快捷菜单,选择CompileCompile All。(如下图)通过编译以后,会在下面显示出编译成功的提示信息。(如下图所示)也可以选择快捷键来进行编译。编译所有文件编译选中的文件执行前仿真 在两个文件都通过编译以后就可以直接进行前仿真了。所谓前仿真,就是功能仿真,主要目的是验证电路的功能是否符合设计的要求,其特点是不考虑电路门延迟与线延迟,主要是验证电路与理想情况是否一致。前仿真的步骤: (1):单击快捷键
11、(2):弹出右图对话框去掉Enable前的钩双击WORK,展开对话框。(3):将WORK展开后选择测试文件dff_clr_test。(如下图): 选择测试文件 选择完测试文件后点击OK(4):打开Objects(端口)窗口: 选择ViewObjects(如右图所示)打开的Objects窗口,D触发器的四个端口全在列表中。在debug windows中选择objects(5):加入波形: 选择ViewWave,出现对话框wave-default。(如下图) 在Objects列表中选中任何一个端口后右击,出现快捷菜单后按右下图方式选择,将所有端口全部移入波形文件中。加入端口后的波形文件点击RUN的
12、快捷键D触发器的波形100ns表示每按一次RUN,就向前推进100ns,读者可根据具体情况进行调节。 到此,D触发器的前仿真就结束了。实验一 简单组合逻辑设计描述一个可综合的数据比较器。功能是比较数据a7:0和数据b7:0的结果,如果两个数据相同,则给出结果为1,否则则结果为0.*如果可以,请写出行为级和门级两种不同的描述方式。第二课时: 1:FORCE命令的介绍 2:DO文件的介绍 3:界面介绍 4:设计调试 5:其他相关内容仿真 . ?!设计组织虚线表示编译时检测输入文件是否存在及可读并允许生成输出文件。 test bench组织简单的test bench向要验证的设计提供向量,人工验证输
13、出。复杂的test bench是自检测的,其结果自动验证。 stimulus要验证的设计简单的test bench复杂的test bench激励验证结果要验证的设计包含文件包含文件用于读入代码的重复部分或公共数据。 module clk_gen (clk);output clk; reg clk;include common.txtinitial begin while ($ time sim_end) begin clk = initial_clock; #(period/2) clk = !initial_clock; #(period/2); end $finish;endendmodu
14、le在上面的例子中,公共参数在一个独立的文件中定义。此文件在不同的仿真中可被不同的测试文件调用。 / common. txt/ clock and simulator constantsparameter initial_clock = 1;parameter period = 15;parameter max_cyc = 100;parameter sim_end = period * max_cyc施加激励产生激励并加到设计有很多 种方法。一些常用的方法有:从一个initial块中施加线激励从一个循环或always块施加激励从一个向量或整数数组施加激励记录一个仿真过程,然后在另一个仿真中回
15、放施加激励线性激励线性激励有以下特性:只有变量的值改变时才列出易于定义复杂的时序关系对一个复杂的测试,测试基准(test bench)可能非常大module inline_ tb; reg 7: 0 data_ bus, addr; wire 7: 0 results; DUT u1 (results, data_ bus, addr); initial fork data_bus = 8h00; addr = 8h3f; #10 data_ bus = 8h45; #15 addr = 8hf0; #40 data_ bus = 8h0f; #60 $finish; joinendmodul
16、e循环激励从循环产生激励有以下特性:在每一次循环,修改同一组激励变量时序关系规则代码紧凑 module loop_tb; reg clk; reg 7:0 stimulus; wire 7:0 results; integer i; DUT u1 (results, stimulus); always begin / clock generation clk = 1; #5 clk = 0; #5 end initial begin for (i = 0; i 1; i = i - 1) / 循环 #50 stimulus = stim_arrayi ; #30 $finish; endend
17、module矢量采样在仿真过程中可以对激励和响应矢量进行采样,作为其它仿真的激励和期望结果。module capture_tb; parameter period = 20 reg 7:0 in_vec, out_vec; integer RESULTS, STIMULUS; DUT u1 (out_ vec, in_ vec); initial begin STIMULUS = $fopen(stimulus. txt) ; RESULTS = $fopen(results. txt) ; fork if (STIMULUS != 0 ) forever #( period/2) $fstr
18、obeb (STIMULUS, %b, in_vec); if (RESULTS != 0 ) #( period/2) forever #( period/2) $fstrobeb (RESULTS, %b, out_vec); join endendmodule矢量回放保存在文件中的矢量反过来可以作为激励module read_file_tb; parameter num_vecs = 256; reg 7:0 data_bus; reg 7:0 stim num_vecs-1:0; integer i; DUT u1 (results, data_bus) initial begin /
19、 Vectors are loaded $readmemb (vec. txt, stim); for (i =0; i num_vecs ; i = i + 1) #50 data_bus = stimi; endendmodule/ 激励文件vec.txt001110000011100100111010001111000011000000101000000110000111100010111000.使用矢量文件输入/输出的优点:激励修改简单设计反复验证时直接使用工具比较矢量文件。错误及警告报告使用文本或文件输出类的系统任务报告错误及警告always ( posedge par_err) $
20、display ( error-bus parity errors detected);always ( posedge cor_err) $display(warning-correctable error detected);一个更为复杂的test bench可以:不但能报告错误,而能进行一些动作,如取消一个激励块并跳转到下一个激励。在内部保持错误跟踪,并在每次测试结束时产生一个错误报告。强制激励在过程块中,可以用两种持续赋值语句驱动一个值或表达式到一个信号。过程持续赋值通常不可综合,所以它们通常用于测试基准描述。对每一种持续赋值,都有对应的命令停止信号赋值。不允许在赋值语句内部出现时序控
21、制。对一个寄存器使用assign和deassign,将覆盖所有其他在该信号上的赋值。这个寄存器可以是RTL设计中的一个节点或测试基准中在多个地方赋值的信号等。 initial begin #10 assign top.dut.fsm1.state_reg = init_state ; #20 deassign top.dut.fsm1.state_reg ; end在register和net上(例如一个门级扫描寄存器的输出)使用force和release,将覆盖该信号上的所有其他驱动。 initial begin #10 force top. dut. counter. scan_ reg.
22、q = 0 ; #20 release top. dut. counter. scan_ reg. q ; end强制激励可以强制(force)并释放一个信号的指定位、部分位或连接,但位的指定不能是一个变量(例如out_veci)不能对register的一位或部分位使用assign和deassign对同一个信号,force覆盖assign。后面的assign或force语句覆盖以前相同类型的语句。如果对一个信号先assign然后force,它将保持force值。在对其进行release后,信号为assign值。如果在一个信号上force多个值,然后release该信号,则不出现任何force值
23、。 在上面两个例子中,在 net或register上所赋的常数值,覆盖所有在时刻10和时刻20之间可能发生在该信号上的其他任何赋值或驱动。如果所赋值是一个表达式,则该表达式将被持续计算。建立时钟例1:虽然有时候在设计中给出时钟,但通常时钟是测试基准中建立。下面介绍如何产生不同的时钟波形。同时给出用门级和行为级描述方法下面是一个简单对称时钟的例子: reg ck;always begin #( period/2) ck = 0; #( period/2) ck = 1;endreg go; wire ck;nand #( period/2) u1 (ck, ck, go);initial beg
24、in go = 0; #( period/2) go = 1;end注意:在一些仿真器中,时钟与设计使用相同的抽象级描述时,仿真性能会好一些。 产生的波形(假定period为20)建立时钟例2:有启动延时的对称时钟的例子:reg ck;initial begin ck = 0; #( period) forever #( period/2) ck = !ck;endreg go; wire ck;nand #( period/2) u1 (ck, ck, go);initialbegin go = 0; #(period) go = 1;end注意:在行为描述中,在时间0将CK初始化为0;而在
25、结构描述中,直到period/2才影响CK值。当go信号在时间0初始化时,CK值到period/2才变化。可以使用特殊命令force和release立即影响CK值。产生的波形(假定period为20)建立时钟例3:有不规则启动延时的不对称时钟的例子:注意:在行为描述中,CK值立刻被影响;而在结构描述中,在传播延时后才输出正确波形。产生的波形(假定period为20)reg ck;initial begin #(period + 1) ck = 1; #(period/2 1) forever begin #(period/4) ck = 0; #(3*period/4) ck = 1; end
26、endreg go; wire ck;nand #(3*period/4, period/4) u1(ck, ck, go);initial begin #(period/4 + 1) go = 0; #(5*period/4 1) go = 1;end使用task在test bench中使用task可以压缩重复操作,提高代码效率。module bus_ctrl_tb; reg 7: 0 data; reg data_valid, data_rd; cpu u1 (data_valid, data,data_rd); initial begin cpu_driver (8b0000_0000)
27、; cpu_driver (8b1010_1010); cpu_driver (8b0101_0101); end task cpu_driver; input 7:0 data_in; begin #30 data_valid = 1; wait (data_rd = 1); #20 data = data_ in; wait (data_rd = 0); #20 data = 8hzz; #30 data_valid = 0; end endtaskendmodule 使用task产生的波形复习问题:什么操作可以容易的在forkjoin块做到,而不容易在beginend块做到?通常怎样产生
28、规则激励和不规则激励?从一个文件中读取激励时使用什么数据类型?在行为级时钟模型中能做哪些在门级时钟模型中很难或不能作到的事? 解答:forkjoin块中不但能够赋值,还可以并行执行循环、条件语句、任务或函数调用。循环或always块能有效地产生规则激励,不规则激励适合用在initial块产生。用寄存器组(存储器)并用$readmem系统任务从一个文件以读取向量。行为级代码可以很容易地产生一个启动时间不规则的时钟波形,并且可以在时刻零初始化时钟。 Force命令的介绍1:Force的使用对象: 简单的模块仿真。2:Force命令的输入方式: 直接从命令控制台输。 DO文件(宏文件)。3:forc
29、e命令的常规语法: force , 例:force fp 1 4000ps , 0 8000ps/信号fp在4000ps处置,8000ps处置0。4:force命令的参数: item_name 强迫对象 必须的 可以使用通配符 5:其他参数: value被强制的项的值必须适合项的数据类型必需的 time指定值的时间单位相对于当前的仿真时间用 character指定绝对时间时间单位能被指定缺省值是仿真分辨率可选的6:force命令举例:force clr 0在当前仿真时间强制 clr 到 0force bus1 01XZ 100 ns在当前仿真时间后100ns强制 bus1到 01XZforce
30、 bus2 16#4F 200仿真启动后强制 bus2到 4F直到200时间单位 ,分辨率在仿真启动时选择force clk 0 0, 1 20 -repeat 50 -cancel 1000在当前仿真后0时间单位强制clk到0和在20时间单位强制到1. 每50时间单位重复直到1000. 因此, 下一个 1 将在70时间单位发生force clk2 1 10 ns, 0 20 ns -r 100 ns和上一个例子相似。-r前面的时间单位表达式必须放在大括号里DO文件自动完成仿真步骤的宏文件库设置编译仿真强制仿真激励能在所有的ModelSim 模式里被调用能调用其他的DO文件DO文件举例:cd
31、c:mydirvlib workvcom counter.vhdvsim counterview *do stimulus.domy_sim.doadd wave /clkadd wave /clradd wave /loadadd wave -hex /dataadd wave /qforce /clk 0 0, 1 50 -repeat 100force /clr 0 0, 1 100run 500force /load 1 0, 0 100force /data 16#A5 0force /clk 0 0, 1 50 -repeat 100run 1000stimulus.do界面介绍m
32、ain主窗口:structure结构窗口process处理窗口:Signal&variable信号和变量窗口dataflow数据流窗口source源窗口Wave&list波形和列表窗口1:ModelSim共有9个窗口: main, structure, source, signals, process, variables, dataflow, wave, 和list 窗口。2:支持任何窗口的多个副本。3:拖放在一个窗口选择HDL项后, 用鼠标左键,这些项能被从一个窗口拖和放到另一个窗口.HDL项可从 Dataflow, List, Signals, Source, Structure, Va
33、riables, 和 Wave窗口拖出.可把它们放到 List 或者 Wave 窗口Main窗口(1):ModelSim 这是设计加载前的提示符能浏览帮助, 编辑库, 编辑源代码而不用调用一个设计VSIM 设计加载后显示的提示符 告诉我们仿真器的行为动作 命令 信息 声明Main窗口(2)Main窗口()Structure窗口:VHDL (o) - Package, component instantiation, generate and block statementsVerilog () module实例, named fork, named begin, task, 和 functio
34、nInstantiation label, entity/module, architecture成为当前层 for Source 和 Signals 窗口, updates Process 和Variables 窗口Source窗口:从Structure窗口选择Options 菜单 (源代码的控制浏览)Color-coded注释, 关键字, 字符串, 数字, 执行行, 标识符, 系统任务, 文本完全的编辑能力保存 编译和重启拖放描述/检查VHDL 信号, 变量和常数Source窗口:描述显示所选的HDL项的信息检查显示所选HDL项当前仿真值Process窗口:显示外部和内部的处理View -
35、 ActiveShows all processes scheduled for execution during the current simulation cycleView - In RegionShows names of all processes in the region selected in the Structure windowProcess窗口:指示器Process is scheduled to be executed处理正等待 VHDL 信号或Verilog 线网改变 或等待超时Process has executed a VHDL wait statement
36、without a time-out or sensitivity listSignals窗口:紧跟Structure窗口显示Structure窗口的当前层HDL项的名称和值排序 升序,降序或声明顺序层次 - (+)可展开的, (-)已展开的VHDL 信号Verilog 线网, 寄存器变量和已命名的时间“拖放”Wave和List窗口Force用于激励Filter为浏览选择信号类型 (输入, 输出, 内部, 等)Dataflow窗口:VHDL信号或Verilog线网的图形描绘信号或线网在窗口中央Processes that drive signal or net on the leftProcesses that read the signal or are triggered by the net on the rightDataflow窗口:ProcessesSignals read by or nets that trigger the process on the leftSignals or nets driven b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年嵩明县医疗事业单位人员招聘考试参考题库及答案解析
- 2026年蓝山县医疗事业单位人员招聘笔试参考题库及答案解析
- 2026年左云县带编教师招聘考试备考题库及答案解析
- 2026年垣曲县医疗事业单位人员招聘考试备考试题及答案解析
- 2026年康马县医疗事业单位人员招聘考试备考题库及答案解析
- 2026年木里藏族自治县带编教师招聘笔试备考题库及答案解析
- 2026年元江哈尼族彝族傣族自治县医疗事业单位人员招聘笔试备考题库及答案解析
- 2026年蒲江县带编教师招聘笔试备考题库及答案解析
- 2026年宁南县医疗事业单位人员招聘笔试备考试题及答案解析
- 2026年湘潭县医疗事业单位人员招聘笔试备考题库及答案解析
- 建筑中级职称《给水排水工程》历年考试真题题库(含答案)
- 工程量清单及招标控制价编制工作方案
- 2024年全国初中数学联赛试题及答案(修正版)
- 美容基础(美容美体专业)全套教学课件
- 跨境电商税务合规解决方案
- 电子元件焊接技术课件
- 《先进制造技术》课件(全套)
- 电子警察系统施工方案
- 西方园林史智慧树知到答案章节测试2023年内蒙古农业大学
- 生活垃圾焚烧发电厂项目施工组织设计
- TEERT 018-2021 金属抛光打磨用湿式除尘一体机
评论
0/150
提交评论