modelsim后仿真仿真中对dat默认的进制是多少

1. 激励的产生对于testbench而言,端口应当和被测试的module一一对应。端口分为input,output和inout类型产生激励信号的时候,input对应的端口应当申明为reg, output对应的端口申明为wire,inout端口比较特殊,下面专门讲解。1)直接赋值。一般用initial块给信号赋初值,initial块执行一次,always或者forever表示由事件激发反复执行。举例,一个modulemodule exam();reg rst_n;initialbegin
rst=1'b1;endalwaysbegin
clk=~end 大家应该注意到有个#符号,该符号的意思是指延迟相应的时间单位。该时间单位由timscale决定.一般在testbench的开头定义时间单位和仿真 精度,比如`timescale 1ns/1ps,前面一个是代表时间单位,后面一个代表仿真时间精度。以上面的例子而言,一个时钟周期是20个单位,也就是20ns。而仿真时间精度的概 念就是,你能看到1.001ns时对应的信号值,而假如timescale
1ns/1ns,1.001ns时候的值就无法看到。对于一个设计而言,时间刻度应该统一,如果设计文件和testbench里面的时间刻度不一致,仿真 器默认以testbench为准。一个较好的办法是写一个global.v文件,然后用include的办法,可以防止这个问题。对于反复执行的操作,可写成task,然后调用,比如task load_
input [3:0] load_
@(negedge clk_50);
$display($time, " && Loading the counter with %h &&", load_value);
load_l = 1’b0;
count_in = load_
@(negedge clk_50);
load_l = 1’b1;
endendtask //of load_countinitial begin
load_count(4’hA);
// 调用taskend其他像forever,for,function等等语句用法类似,虽然不一定都能综合,但是用在testbench里面很方便,大家可以自行查阅参考文档2) 文件输入有时候,需要大量的数据输入,直接赋值的话比较繁琐,可以先生成数据,再将数据读入到寄存器中,需要时取出即可。用 $readmemb系统任务从文本文件中读取二进制向量(可以包含输入激励和输出期望值)。$readmemh 用于读取十六进制文件。例如:reg [7:0]
mem[1:256]
a 8-bit, 256-word 定义存储器meminitial
$readmemh ( "E:/readhex/mem.dat", mem ) // 将.dat文件读入寄存器mem中initial
$readmemh ( "E:/readhex/mem.dat", mem, 128, 1 ) // 参数为寄存器加载数据的地址始终2.
查看仿真结果对于简单的module来说,要在modelsim的仿真窗口里面看波形,就用add wave ..命令比如,testbench的顶层module名叫tb,要看时钟信号,就用add wave tb.clk要查看所有信号的时候,就用 add wave /*当然,也可以在workspace下的sim窗口里面右键单击instance来添加波形对于复杂的仿真,免不了要记录波形和数据到文件里面去。 1)波形文件记录常见的波形文件一般有两种,vcd和fsdb,debussy是个很好的工具,支持fsdb,所以最好是modelsim+debussy的组合默认情况下,modelsim不认识fsdb,所以需要先装debussy,再生成fsdb文件。 $dumpfile和$dumpvar是verilog语言中的两个系统任务,可以调用这两个系统任务来创建和将指定信息导入VCD文件.对于fsdb文件来说,对应的命令是fsdbDumpfile,dumpfsdbvars(什么是VCD文件? 答:VCD文件是在对设计进行的仿真过程中,记录各种信号取值变化情况的信息记录文件。EDA工具通过读取VCD格式的文件,显示图形化的仿真波形,所以,可以把VCD文件简单地视为波形记录文件.)下面分别描述它们的用法并举例说明之。$dumpfile系统任务:为所要创建的VCD文件指定文件名。举例("//"符号后的内容为注释文字):initial$dumpfile ("myfile.dump"); //指定VCD文件的名字为myfile.dump,仿真信息将记录到此文件$dumpvar系统任务:指定需要记录到VCD文件中的信号,可以指定某一模块层次上的所有信号,也可以单独指定某一个信号。典型语法为$dumpvar(level, module_name); 参数level为一个整数,用于指定层次数,参数module则指定要记录的模块。整句的意思就是,对于指定的模块,包括其下各个层次(层次数由 level指定)的信号,都需要记录到VCD文件中去。举例:initial$dumpvar (0, top); //指定层次数为0,则top模块及其下面各层次的所有信号将被记录initial$dumpvar (1, top); //记录模块实例top以下一层的信号//层次数为1,即记录top模块这一层次的信号//对于top模块中调用的更深层次的模块实例,则不记录其信号变化initial$dumpvar (2, top); //记录模块实例top以下两层的信号//即top模块及其下一层的信号将被记录假设模块top中包含有子模块module1,而我们希望记录top.module1模块以下两层的信号,则语法举例如下:initial$dumpvar (2, top.module1); //模块实例top.module1及其下一层的信号将被记录假设模块top包含信号signal1和signal2(注意是变量而不是子模块), 如我们希望只记录这两个信号,则语法举例如下:initial$dumpvar (0, top.signal1, top.signal2); //虽然指定了层次数,但层次数是不影响单独指定的信号的//即指定层次数和单独指定的信号无关我们甚至可以在同一个$dumpvar的调用中,同时指定某些层次上的所有信号和某个单独的信号,假设模块top包含信号signal1,同时包含有子模 块module1,如果我们不但希望记录signal1这个独立的信号,而且还希望记录子模块module1以下三层的所有信号,则语法举例如下:initial$dumpvar (3, top.signal1, top.module1); //指定层次数和单独指定的信号无关//所以层次数3只作用于模块top.module1, 而与信号top.signal1无关上面这个例子和下面的语句是等效的:initialbegin$dumpvar (0, top.signal1);$dumpvar (3, top.module1);end$dumpvar的特别用法(不带任何参数):initial$ //无参数,表示设计中的所有信号都将被记录最后,我们将$dumpfile和$dumpvar这两个系统任务的使用方法在下面的例子中综合说明,假设我们有一个设计实例,名为 i_design,此设计中包含模块module1,模块module1下面还有很多层次,我们希望对这个设计进行仿真,并将仿真过程中模块 module1及其以下所有层次中所有信号的变化情况,记录存储到名为mydesign.dump的VCD文件中去,则例示如下:initialbegin$dumpfile ("mydesign.dump"); //指定VCD文件名为mydesign.dump$dumpvar (0, i_design.module1); //记录i_design.module1模块及其下面层次中所有模块的所有信号end对于生成fsdb文件而言,也是类似的initial
$fsdbDumpfile("tb_xxx.fsdb");
$fsdbDumpvars(0,tb_xxx);
2)文件输出结果
integer out_
// out_file 是一个文件描述,需要定义为 integer类型
out_file = $fopen ( " cpu.data " ); // cpu.data 是需要打开的文件,也就是最终的输出文本
设计中的信号值可以通过$fmonitor, $fdisplay,$fwrite
其中$fmonitor只要有变化就一直记录,$fdisplay和$fwrite需要触发条件才记录
initial begin
$fmonitor(file_id, "%m: %t in1=%d o1=%h", $time, in1, o1);
always@(a or b)
$fwrite(file_id,"At time%t a=%b b=%b",$realtime,a,b);
3 testbench的技巧
1).如果激励中有一些重复的项目,可以考虑将这些语句编写成一个task,这样会给书写和仿真带来很大方便。例如,一个存储器的testbench的激励可以包含write,read等task。
2).如果DUT中包含双向信号(inout),在编写testbench时要注意。需要一个reg变量来表示其输入,还需要一个wire变量表示其输出。
3).如果initial块语句过于复杂,可以考虑将其分为互补相干的几个部分,用数个initial块来描述。在仿真时,这些initial块会并发运行。这样方便阅读和修改。
4).每个testbench都最好包含$stop语句,用以指明仿真何时结束。
5).加载测试向量时,避免在时钟的上下沿变化,比如数据最好在时钟上升沿之前变化,这也符合建立时间的要求。
4.一个简单的例子
module counter (clk, reset, enable, count);
input clk, reset,
output [3:0]
always @ (posedge clk)
if (reset == 1'b1) begin
count &= 0;
end else if ( enable == 1'b1) begin
count &= count + 1;
module counter_
reg clk, reset,
wire [3:0]
counter U0 (
.clk (clk),
.enable (enable),
initial begin
reset = 0;
enable = 0;
$dumpfile ("counter.vcd");
$display("\t\ttime,\tclk,\treset,\tenable,\tcount");
$monitor("‰d,\t‰b,\t‰b,\t‰b,\t‰d",$time, clk,reset,enable,count);
//Rest of testbench code after this line
这个我没用过,完全是从网上google的,如果有问题,大家再讨论吧
芯片外部引脚很多都使用inout类型的,为的是节省管腿。一般信号线用做总线等双向数据传输的时候就要用到INOUT类型了。就是一个端口同时做输入和 输出。 inout在具体实现上一般用三态门来实现。三态门的第三个状态就是高阻'Z'。当inout端口不输出时,将三态门置高阻。这样信号就不会因为两端同时 输出而出错了,更详细的内容可以搜索一下三态门tri-state的资料.
1 使用inout类型数据,可以用如下写法:
inout data_
input data_
reg data_//data_inout的映象寄存器
assign data_inout=link_data?data_reg:1’//link_data控制三态门
//对于data_reg,可以通过组合逻辑或者时序逻辑根据data_in对其赋值.通过控制link_data的高低电平,从而设置data_inout是输出数据还是处于高阻态,如果处于高阻态,则此时当作输入端口使用.link_data可以通过相关电路来控制.
2 编写测试模块时,对于inout类型的端口,需要定义成wire类型变量,而其它输入端口都定义成reg类型,这两者是有区别的.
当上面例子中的data_inout用作输入时,需要赋值给data_inout,其余情况可以断开.此时可以用assign语句实现:assign data_inout=link?data_in_t:1’其中的link ,data_in_t是reg类型变量,在测试模块中赋值.
另外,可以设置一个输出端口观察data_inout用作输出的情况:
Wire data_
Assign data_out_t=(!link)?data_inout:1’
else,in RTL
inout use in top module(PAD)
dont use inout(tri) in sub module
也就是说,在内部模块最好不要出现inout,如果确实需要,那么用两个port实现,到顶层的时候再用三态实现。理由是:在非顶层模块用双向口的话,该 双向口必然有它的上层跟它相连。既然是双向口,则上层至少有一个输入口和一个输出口联到该双向口上,则发生两个内部输出单元连接到一起的情况出现,这样在 综合时往往会出错。
对双向口,我们可以将其理解为2个分量:一个输入分量,一个输出分量。另外还需要一个控制信号控制输出分量何时输出。此时,我们就可以很容易地对双向端口建模。
module dual_port (
inout_pin,
inout inout_
wire inout_
wire input_of_
wire output_of_
assign input_of_inout = inout_
assign inout_pin = out_en ? output_of_inout : 高阻;
可见,此时input_of_inout和output_of_inout就可以当作普通信号使用了。
在仿真的时候,需要注意双向口的处理。如果是直接与另外一个模块的双向口连接,那么只要保证一个模块在输出的时候,另外一个模块没有输出(处于高阻态)就可以了。
如果是在ModelSim中作为单独的模块仿真,那么在模块输出的时候,不能使用force命令将其设为高阻态,而是使用release命令将总线释放掉
很多初学者在写testbench进行仿真和验证的时候,被inout双向口难住了。仿真器老是提示错误不能进行。下面是我个人对inout端口写 testbench仿真的一些总结,并举例进行说明。在这里先要说明一下inout口在testbench中要定义为wire型变量。
先假设有一源代码为:
module xx(data_inout , ........);
inout data_
........................
assign data_inout=(! link)?datareg:1'
方法一:使用相反控制信号inout口,等于两个模块之间用inout双向口互连。这种方法要注意assign 语句只能放在initial和always块内。
module test();
wire data_
initial begin
..........
assign data_inout=link?data_reg:1'
方法二:使用force和release语句,但这种方法不能准确反映双向端口的信号变化,但这种方法可以反在块内。
module test();
wire data_
force data_inout=1'
//强制作为输入端口
...............
release data_
//释放输入端口
很多读者反映仿真双向端口的时候遇到困难,这里介绍一下双向端口的仿真方法。一个典型的双向端口如图1所示。
其中inner_port与芯片内部其他逻辑相连,outer_port为芯片外部管脚,out_en用于控制双向端口的方向,out_en为1时,端口为输出方向,out_en为0时,端口为输入方向。
用Verilog语言描述如下:
module bidirection_io(inner_port,out_en,outer_port);
input out_
inout[7:0] inner_
inout[7:0] outer_
assign outer_port=(out_en==1)?inner_port:8'
assign inner_port=(out_en==0)?outer_port:8'
用VHDL语言描述双向端口如下:
use IEEE.STD_LOGIC_1164.ALL;
entity bidirection_io is
port ( inner_port : inout std_logic_vector(7 downto 0);
out_en : in std_
outer_port : inout std_logic_vector(7 downto 0) );
end bidirection_
architecture behavioral of bidirection_io is
outer_port&=inner_port when out_en='1' else (OTHERS=&'Z');
inner_port&=outer_port when out_en='0' else (OTHERS=&'Z');
仿真时需要验证双向端口能正确输出数据,以及正确读入数据,因此需要驱动out_en端口,当out_en端口为1时,testbench驱动 inner_port端口,然后检查outer_port端口输出的数据是否正确;当out_en端口为0时,testbench驱动 outer_port端口,然后检查inner_port端口读入的数据是否正确。由于inner_port和outer_port端口都是双向端口(在 VHDL和Verilog语言中都用inout定义),因此驱动方法与单向端口有所不同。
验证该双向端口的testbench结构如图2所示。
这是一个self-checking testbench,可以自动检查仿真结果是否正确,并在Modelsim控制台上打印出提示信息。图中Monitor完成信号采样、结果自动比较的功能。
testbench的工作过程为
1)out_en=1时,双向端口处于输出状态,testbench给inner_port_tb_reg信号赋值,然后读取outer_port_tb_wire的值,如果两者一致,双向端口工作正常。
2)out_en=0时,双向端口处于输如状态,testbench给outer_port_tb_reg信号赋值,然后读取inner_port_tb_wire的值,如果两者一致,双向端口工作正常。
用Verilog代码编写的testbench如下,其中使用了自动结果比较,随机化激励产生等技术。
`timescale 1ns/10ps
module tb();
reg[7:0] inner_port_tb_
wire[7:0] inner_port_tb_
reg[7:0] outer_port_tb_
wire[7:0] outer_port_tb_
reg out_en_
out_en_tb=0;
inner_port_tb_reg=0;
outer_port_tb_reg=0;
repeat(20)
out_en_tb=i[0]; //randomize out_en_tb
inner_port_tb_reg=$ //randomize data
outer_port_tb_reg=$
//**** drive the ports connecting to bidirction_io
assign inner_port_tb_wire=(out_en_tb==1)?inner_port_tb_reg:8'
assign outer_port_tb_wire=(out_en_tb==0)?outer_port_tb_reg:8'
//instatiate the bidirction_io module
bidirection_io bidirection_io_inst(.inner_port(inner_port_tb_wire),
.out_en(out_en_tb),
.outer_port(outer_port_tb_wire));
//***** monitor ******
always@(out_en_tb,inner_port_tb_wire,outer_port_tb_wire)
if(outer_port_tb_wire===inner_port_tb_wire)
$display("\n **** time=%t ****",$time);
$display("OK! out_en=%d",out_en_tb);
$display("OK! outer_port_tb_wire=%d,inner_port_tb_wire=%d",
outer_port_tb_wire,inner_port_tb_wire);
$display("\n **** time=%t ****",$time);
$display("ERROR! out_en=%d",out_en_tb);
$display("ERROR! outer_port_tb_wire != inner_port_tb_wire" );
$display("ERROR! outer_port_tb_wire=%d, inner_port_tb_wire=%d",
outer_port_tb_wire,inner_port_tb_wire);
6. 高级用法
比如pli之类的东西,我也没用过。。。有需要的,大家再讨论
总体感觉,testbench是个很难的事情,这里讨论的只是一些最基本的东西。真正有技术含量的是testcase的设计,设计阶段合理层次设计以及模 块划分等等,我没有做过很大的项目,所以这方面也没有办法提供更多的帮助。经验丰富的大牛不妨出来讲讲经验,^_^
Verilog testbench总结(二)
1.激励的设置
相应于被测试模块的输入激励设置为reg型,输出相应设置为wire类型,双向端口inout在测试中需要进行处理。
方法1:为双向端口设置中间变量inout_reg作为该ino...
testbench简单范例
最简单的一个testbench
verilog testbench编写笔记
1、initial模块赋值时注意在时钟上升沿打入数据
ax = 16'd0;
ay = 11'd0;
Verilog中testbench的设计,文件读取和写入操作
1. 激励的产生
对于 testbench 而言,端口应当和被测试的 module 一一对应。
端口分为 input,output 和 inout 类型产生激励信号的时候,
input 对应的端口应...
Verilog HDL的Testbench简介
Testbench模块没有输入输出,在Testbench模块内例化待测设计的顶层模块,并把测试行为的代码封装在内,直接对测试系统提供测试激励。下面是一个基本的Testbench结构模块:
testbench——信号的产生
在写testbench时候,需要对各种信号根据时间进行设置。
注意所有需要输入被测试模块的信号均为reg型。
module test();
reg sig1, sig2, ...
需求说明:Verilog设计基础
:testbench的设计 读取文件 写入文件
:时间的诗
十大基本功之 testbench
没有更多推荐了,quartus ii15.0的安装按照以下的链接说明进行安装基本上没有问题,需要注意的一点就是在license.dat 文件里添加NIC ID只需要第一个就可以啦。只需将XXX换掉即可,不要加“””
http://jingyan.baidu.com/article/bfc0e7282dd91.html
ModelSim10.4的安装参考以下的链接基本没有问题,需要注意一点就是,我当时以管理员的身份在执行patch_dll,bat这个批处理文件的时候并没有出来LICENSE.TXT文件,后来点击了 粘贴到win64下的MenTorKG.exe 后生成了LICENSE.TXT,接下来就按照链接上的来就行了。
http://jingyan.baidu.com/article/daa.html
Quartus II9.0+win10破解安装教程
Quartus II9.0+win10破解安装教程
1.安装步骤
下载QuartusII9.0的安装包,解压后如图
点击setup.exe开始安装,如下图
点击next,下一步,如下图
Win7、Win8、Win10系统USB-Blaster驱动程序无法安装的解决办法
这篇博文是我转载dezhihuang的博文,原文名称和地址如下,并对内容做了适当调整:
[原]Win7、Win8系统USB-Blaster驱动程序无法安装的解决办法
第一次用Markdown编辑博...
Quartus ii 9.0软件的使用和win10不兼容解决方案
Quartus ii 9.0软件的使用和win10不兼容解决方案本文只介绍关于quartus软件的编译和仿真的内容,以Verilog代码为例,不进行电路图绘制。也提供一种win10下仿真不兼容的解决方...
Windows 下 Quartus 检测不到 USB-Blaster 终极解决办法
一、Windows无法正常驱动USB-Blaster
解决办法:自行手动安装驱动,
参考文章:http://blog.csdn.net/chengbozhe/article/details/47335...
在windows10下面 modelsim10.1a的安装
学期这就结束 把这学期的几个实验放上面吧 学习交流吧
Modelsim简介
Modelsim是一种第三方EDA仿真工具;
Modelsim仿真工具是Model公司开发的,它...
【原创】WIN10安装Modelsim10.4c及和谐
最近仿真一个SDRAM控制器,之前安装的Modelsim10.1c老是出现运行.do脚本后没反应的情况,所以就装了Modelsim10.4c,虽然按照网上的教程一步步来,但是在运行patch_dll....
FPGA入门(1)——modelsim与quartus ii l联合
1、安装Bluster 驱动:
2、查看FPGA开发板的硬件资源;
3、下载例子,熟悉流程;
4、Modelsim联合Quartus
II进行仿真。
关于quartus ii直接调用modelsim仿真
之前自己也遇到这类问题,然后上网找,最后也没能解决。直接进行rtl仿真会收到这样的报错信息
connot launth the modelsim-altera softwarre because y...
Quartus II和Modelsim的联合仿真(详细)
转自http://www.cnblogs.com/Jezze/archive//2684333.html
这篇文章不需要在modelsim中建库、映射、建工程等一...
没有更多推荐了,FPGA 仿真器Modelsim的功能仿真和时序仿真
FPGA 仿真器Modelsim的功能仿真和时序仿真
& & &设计流程包括设计输入,仿真,综合,生成,板级验证等很多阶段。在整个设计流程中,完成设计输入并成功进行编译仅能说明设计符合一定的语法规范,并不能说明设计功能的正确性,这时就需要通过仿真对设计进行验证。在F 设计中,仿真一般分为功能仿真(前仿真)和时序仿真(后仿真)。功能仿真又叫逻辑仿真,是指在不考虑器件延时和布线延时的理想情况下对源代码进行逻辑功能的验证;而时序仿真是在布局布线后进行,它与特定的器件有关,又包含了器件和布线的延时信息,主要验证程序在目标器件中的时序关系。在有些开发环境中,如 Xilinx ISE 中,除了上述的两种基本仿真外,还包括综合后仿真,转换(post-translate)仿真,映射后(post-map)仿真等,这样做完每一步都可进行仿真验证,从而保证设计的正确性。
& & &ModelSim 是Mentor Graphs 子公司MentorTechnology 的产品,是当今最通用的GA 仿真器之一。ModelSim 功能强大,它支持FPGA 设计的各个阶段的仿真,不仅支持VHDL 仿真,Verilog仿真,而且支持VHDL 和Verilog 混合仿真。它不仅能做仿真,还能够对程序进行调试,测试代码覆盖率,对波形进行比较等。ModelSim 有很多版本,像ModelSim/SE 是首要版本, 除此之外还有ModelSim/XE 和ModelSim/AE,分别是为Xilinx公司和Ara 公司提供的OEM 版,其中已包含各公司的库文件,故用特定公司OEM 版进行仿真时就不需编译该公司的库了。
& & 用ModelSim 进行功能仿真  
& & 进行功能仿真首先要检查设计的语法是否正确;其次检查代码是否达到设计的功能要求。下文主要介绍仿真步骤和测试激励的加载。
& & 仿真步骤
& & (1)建立库并映射库到物理目录
& & 因为用ModelSim 进行仿真是建立在仿真库的基础上的(此处进行的是功能仿真,因而不用编译特定厂商的库),所以首先要建立库并把库映射到实际的物理路径。通常用户编译的文件都放在work库中,所以必须先建立work 库。有两种方法建立并映射库,第一种方法是通过图形界面,在菜单Design&Create a New Library 弹出对话框,如图1 所示。在Library Name 中输入work,如果建立其它库,可以输入其它名字。Library Map to 是映射的物理路径。第二种方法是用命令行的形式,建立库用ModelSim&vlib&库名&,映射库用ModelSim& vmap , 如建立并映射库work,就可以在ModelSim 主窗口命令提示符下输入
& & vlib work
& & vmap work work
& & (2)编译源代码
& & 该步骤主要检查源文件的语法错误。实现方法有两种,一是通过菜单Design&Compile,出现选择源文件对话框,选择要编译的源文件,编译即可;二是通过命令行方式,这一步对于VHDL 和Verilog 所使用的命令是不一样的,对于VHDL 代码用vcom-work.vhd.vhd , 对于Verilog 代码用vlog-work.v.v,文件按出现的先后顺序编译,且支持增量编译。编译后的文件会放在缺省当前work 库中。
& & (3)启动仿真器
& & 该步骤主要是把所有仿真的文件加载到当前的仿真环境中。实现的方法两种,一是通过菜单Design&Load Design,出现加载对话框,选择要仿真的程序即可;二是通过命令行的形式vsim-lib , 这条命令对于VHDL 和Verilog 都一样。
& & (4)执行仿真
& & 该步骤是正式执行仿真了,在仿真前最重要的一个步骤就是加载激励,如要对下面的加法器进行仿真,加法器实体说明如下:
& & entityAdd is
& & port(D1: in std_logic_vector(7 downto 0);--输入
& & D2: in std_logic_vector(7 downto 0);--输入
& & D0: out std_logic_vector(7 downto 0);--输出
& & CE: in std_logic;-使能,低有效
& & Clk: in std_logic);--时钟
& & 测试激励的加载 
& & 激励的加载有四种方法:
& & (1)命令行方式
& & 这种方法是通过在命令行下直接输入命令给信号加载激励,然后进行仿真。如要对上面的加法器进行仿真,则输入如下命令:
& & Vsim &t ps work.add
& & //加载work 库中的实体add,时间分辨率为ps
& & Add wave &hex D1
& & Add wave &hex D2
& & Add wave &hex D0
& & Add wave ce
& & Add wave clk
& & //把信号加载到波形窗口,hex 表示以16进制显示
& & Force ce 0 //对ce 加激励为0
& & Force clk 0 0,1 25 &r 50 //对clk 加载激励
& & Force D1 16#2 //对D1 加载16 进制数2
& & Force D2 16#1 //对D2 加载16 进制数1
& & Run 100 //运行100 个时间单位
& & 如果要仿真其它数据,在命令行中改变激励
& & 就可以了,仿真的结果如图2 所示。
& & (2)宏文件法
& & 这种方法相当于DOS 的批处理。它把所有的命令保存为以do 为后缀名的文件中,称为宏文件。执行仿真时只要选择菜单Marco & ExecuteMarco,然后选择相应的宏文件执行即可,或者在命令行中输入do&宏文件名&。执行仿真的结果如图2 所示。
& & (3)测试文件法
& & 上述两种方法只适合验证数据量小的程序,对程序进行简单验证,如果要验证的数据量较大,
& & 上述两种方法就比较麻烦,现在被广泛采用的是测试文件法。这种方法其实是要设计者自己编写测试文件,把要验证的程序当成测试程序的一个模块,在测试文件中对要验证的程序加载激励。以下就是针对上面加发器的测试文件:
& & use ieee.std_logic_1164.all
& & use ieee.std_logic_signed.all
& & entity tb is
& & end tb
& & architecture a_tb of tb is
& & component Add
& & port(D1 : in std_logic_vector(7 downto 0);
& & D2 : in std_logic_vector(7 downto 0);
& & D0 : out std_logic_vector(7 downto 0);
& & CE : in std_
& & Clk: in std_logic);
& & signal D1 : std_logic_vector(7 downto 0) :=(other =& &1&);
& & signal D2 : std_logic_vector(7 downto 0) :=(other =& &1&);
& & signal D0 : std_logic_vector(7 downto 0) :=(other =& &0&);
& & signal CE : std_logic := &0&;
& & signal Clk : std_logic
& & dut : Add
& & port map(D1 =& D1,
& & D2 =& D2,
& & D0 =& D0,
& & CE =& CE,
& & Clk =& Clk);
& & Clk &= not Clk after 25
& & process
& & wait until Clk = &1& and Clk&
& & D1 &= D1+1;
& & D2 &= D2+2;
& & end a_
& & 用这个测试文件产生的仿真波形如图3 所示:
& & 这种方法可以仿真大量的数据,对程序进行比较全面的仿真。
& & (4)textio 法
& & 方法(3)产生的激励数据一般很有规律,也容易分析,但同时也可能造成某些情况无法检测到。所以做仿真时若希望验证一些没有规律的数据,则可以用 textio 方法实现。实际上它的输入激励是存储在dat 文件中的,在测试文件中读入这些数据,如果用VHDL 编写程序,需要textio 库和VHDL93 标准的支持,限于篇幅这里就不详细介绍,详情请参见有关文献。
& & 用ModelSim 进行时序仿真  
& & 时序仿真是FPGA 设计的重要步骤之一,它通常是在做完布局布线后进行,仿真中包含布局布线产生的延时信息。时序仿真的方法和步骤和功能仿真基本相同,但有两点需要注意:一是一般布局布线后生成的网表并不包含timing 数据,会用一个SDF(Standard Delay Format)文件来存储timing数据,它通常是由布局布线工具产生,在做时序仿真时要用到。上面启动仿真器加载时不仅要加载布局布线后生成的源文件,还要加载SDF 文件。二是在用ModelSim SE 版本时,由于不包含特定厂商的库文件,而在做时序仿真时恰恰与特定的器件相关,要用到这些库,为了提高仿真速度,通常需要提前编译这些库,而且不同厂商编译库的方法不尽相同,本文以编译Xilnx 公司的库为例,介绍编译库的方法。
& & 这种方法是通过在Xilinx 的网站上下载的xilinx_lib_4.tcl 脚本进行的,选择菜单中的执行宏或者在命令行中输入source xilinx_lib_4.tcl,会弹出图4 所示的对话框,在选择所要编译的语言后,Xilinx tware Version、编译的库、Xilinx 路径和Modelsim 路径后就可以进行库的编译了。其中较重要的是simprim(做时序仿真时用)和Xilinxcorelib(在进行Xilinx core 的仿真时用),这些库还有对应的Verilog 版本。在进行库编译之前,最好把ModelSim 安装目录下的modelsim.ini 文件的只读属性去掉,这样可以把编译后的库信息加到该文件中,具体信息如下:
& & simprim = C:/Modeltech_5.5b/simprim
& & simprims_ver = C:/Modeltech_5.5b/simprims_ver
& & xilinxcorelib = C:/ Modeltech_5.5b/xilinxcorelib
& & xilinxcorelib_ver = C:/
& & Modeltech_5.5b/xilinxcorelib_ver
& & 结束语  
& & 通过对FPGA 设计中功能仿真和时序仿真的详细介绍,有助于熟练应用ModelSim 进行一系列仿真,同时也抛砖引玉地引导读者在实际中发现和应用ModelSim 的调试程序、比较波形等其他功能。
&&&&&往下看有更多相关资料
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670& & &&)

我要回帖

更多关于 modelsim后仿真 的文章

 

随机推荐