modelsim仿真小结
modelsim的基本仿真流程大致分以下几个步骤:建库、编译工程、前后仿真、调试等。modelsim仿真既可以在modelsim界面操作,也可以用do文件实现, 这里结合学习的教程、网上看到的资料,和实际遇到的一些问题,分别做一整理小结。
1. 建库
建库包括altera库和xilinx库,同时都包括verilog和vhdl。这里只建了verilog库,vhdl和verilog步骤相同。
对于altera库主要包括lpm元件库、mega_function库atera_mf、altera原语库altera_primitive和各器件系列模型库。前三种是调用altera模块的必备库,第四种是进行综合后功能仿真和布线后时序仿真需要的库,和器件系列有关,只选对应系列即可。
altera库创建和编译步骤如下:
a) 在modelsim安装目录下新建文件夹,命名altera_lib,以存放编译后的库文件,可
以在altera_lib下新建verilog和vhdl两个子文件夹,分别存放verilog和vhdl库。 b) 打开modelsim,新建library,file ->new->library ..
c) 如下图,创建lpm库,路径e:\\modeltech_10.1a\\altera_lib\\verilog\\lpm
到此,lpm库建立完毕。
e) 同理,建立altera_mf库添加 altera_mf.v ,建立primitive库添加altera_primitive.v
建立各系列的模型库,命名可用系列名加_ver“xxx_ver”,也可随意吧,添加各系列的xxx_atoms.v。
这里,也可以把以上库放在一个文件夹,这样做简单,一次就搞定,分开也就是条理清楚,没人去看,所以没必要。
f) 修改modelsim.ini文件,为的是让modelsim能自动map到已经编译的这些库上。
这里所有库都放在e:\\modeltech_10.1a\\altera_lib下,库名是altera_lib,这里只添加一句: altera_lib = e:\\modeltech_10.1a\\altera_lib
g) 保存退出,改回modelsim.ini只读属性,防止乱改。至此altera库建立完毕。
xlinx库创建和编译步骤如下:
next,选择语言:
next,选择需要编译的器件:
2. 编译工程
编译工程主要包括:code、testbench、建立工程、建立工程库、映射、编译等。code主要有code思想和风格,在verilog部分涉及。testbench,下边给出一个公用模板,基于这个方便修改,可以根据自己的习惯建一个temp_tb.v。
modelsim界面编译工程:
a) 新建工程:打开modelsim,file -> new -> project .. ,指定工程名、路径、工程库。
b) add existing file
c) add testbench file „.
e) 编译语法查错,直到编译通过。至此编译完毕。
3. 功能和时序仿真
仿真是在编译的基础上,进行的功能调试,包括综合前功能仿真、综合后功能仿真和布 篇二:modelsim教程(个人总结)
一、modelsim简介
modelsim仿真工具是model公司开发的。它支持verilog、vhdl以及他们的混合仿真,它可以将整个程序分步执行,使设计者直接看到他的程序下一步要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在dataflow窗口查看某一单元或模块的输入输出的连续变化等,比quartus自带的仿真器功能强大的多,是目前业界最通用的仿真器之一。 modelsim分几种不同的版本:se、pe和oem,其中集成在 actel、atmel、altera、xilinx以及lattice等fpga厂商设计工具中的均是其oem版本。比如为altera提供的oem版本是modelsim-altera,为xilinx提供的版本为modelsim xe. se版本为最高级版本,在功能和性能方面比oem版本强很多,比如仿真速度方面,还支持pc、unix、liunx混合平台。
为什么要学modelsim?
1.modelsim是专业的hdl语言仿真器,比 quartus自带的仿真器功能强大的多.
2. quartus simulator不支持testbench ,只支持波形文件.vwf
vwf文件全称是矢量波形文件(vector waveform file),是quartus ii中仿真输入、计算、输出数据的载体。
一般设计者建立波形文件时,需要自行建立复位、时钟信号以及控制和输入数据、输出数据信号等。其中工作量最大的就是输入数据的波形录入。比如要仿真仅1kb的串行输入数据量,则手工输入信号的波形要画8000个周期,不仅费时费力而且容易出错 怎样入门?
对于初学者,modelsim自带的教程是一个很好的选择,在help->se pdf documentation->tutorial里面.它从简单到复杂、从低级到高级详细地讲述了modelsim的各项功能的使用,简单易懂。
modelsim的安装
同许多其他软件一样,modelsim se同样需要合法的license,通常我们用kengen产生license.dat。
⑴ 解压安装工具包开始安装,安装时选择full product安装。当出现install hardware security key driver时选择否。当出现add modelsim to path选择是。出现modelsim license wizard时选择close。
⑵ 在c盘根目录新建一个文件夹flexlm,用keygen产生一个license.dat,然后复制到该文件夹下。
⑶ 修改系统的环境变量。右键点击桌面我的电脑图标,属性->高级->环境变量->(系统变量)新建。按下图所示内容填写,变量值内如果已经有别的路径了,请用“;”将其与要填的路径分开。lm_license_file = c:\\flexlm\\license.dat
使用modelsim进行仿真
modelsim运行方式有4种:
用户图形界面模式 交互式命令行模式 不显示modelsim的可视化界面 ,仅通过命令控制台输入的命令完成所有工作
1、tcl和宏模式 编写可执行扩展名为do或者tcl语法文件
2、批处理模式 其所有操作都在后台进行,用户看不到modelsim的界面,也不需要交互式输入命令。当工程很大,文件比较多时,用批处理比较方便。直接运行批处理文件,在后台调用modelsim,执行modelsim的脚本文件* .do,完成操作
注:/retype/zoom/ad28e6280066f5335a8121f2?pn=3&x=0&y=1268&raww=585&rawh=408&o=png_6_0_0_166_741_567_396_893.25_1263.375&type=pic&aimh=334.7692307692308&md5sum=383f41cc7a00588c8313dedf7c6964a7&sign=d5e819eb8e&zoom=&png=552-22457&jpg=0-0\" target=\"_blank\">点此查看
3.为工程添加文件
工程建立后,选择add exsiting file后,根据相应提示将文件加到该project中 这里是count4.v和其测试向量count_tp.v,源代码如下:
5.装载文件
(1)双击libray 中work中的count_tp装载
(2)点击simulate – start simulation
按右图设置,点击ok
6.开始仿真
点击workspace下的sim,点击count_tp,选择add ? add to wave
然后点run –all,开始仿真
篇三:modelsim 仿真方法总结
modelsim 仿真方法总结
modeling 仿真工具是model公司开发的。它支持verilog、vhdl以及他们的混合仿真。modelsim各版本的使用方法大体一致,modelsim仿真主要分为前仿真和后仿真。下面来具体介绍modelsim的仿真方法,涉及quartus-modelsim联合(使用)仿真的差异会特别提示。
前仿真与后仿真说明
1.1 前仿真
前仿真也称为功能仿真、行为仿真。旨在验证电路的功能是否符合设计要求,其特点是不考虑延迟(包括门延迟与线延迟),主要验证电路与理想情况是否一致。前仿真需要用到rtl级代码(由源代码经过综合后产生)与testbench。
1.2)后仿真
后仿真也称为时序仿真或者布局布线仿真。是指在电路已经映射到特定的工艺环境以后,综合考虑门延迟与线延迟的影响,验证电路在一定的时序条件下是否存在时序违规以及能否满足设计构想的过程。需要用到的文件是——从布局布线结果中抽象出来的门级网表、testbench和后缀名为sdo或者sdf的标准时延文件。
注:扩展名为sdo和sdf的标准时延文件包含门延迟与实际布线延迟,能较好的反应芯片的实际工作情况。
二)modelsim仿真主要有以下几个步骤:
(1)建立库并映射
库到物理目录;
(2)编译源代码(包括testbench);
(3)执行仿真; 解释: ①库:modelsim中有两类仿真库。一种是工作库,默认名为work;另一种是资源库。work库中存放当前工程下所有已经编译过的文件,所以编译前一定要建立一个work库。资源库存放work库中已经编译文件所要调用的资源,这样的资源可能有很多,它们被存放在不同的资源库内。(例如要想对综合在cyclone芯片中的设计做后仿真,就需要有一个名为cyclone_ver的资源库。) 映射库用于将已经预编译好的文件所在目录映射为一个modelsim可识别的库。(此即是为仿真库建立一个逻辑映像的行为过程,后面会提到,在modelsim中新建库时,create a new library and a logical mapping to it或a map to an existing libraryd的提示)
上述三个步骤是大的框架,前仿真和后仿真均是按照这个框架进行的,建立modelsim工程对前后仿真来说都不是必须的。下面分别介绍每一步的操作。
2.1)建立库
在执行一个仿真前先建立一个单独的文件夹,将操作对象文件放在该文件夹下面。然后启动modelsim软件将modelsim当前路径改动到此文件下。修改方法是file>change directory。
注意:上面说的是独立运行modelsim仿真的情况。当采用quartus联合modelsim仿真时,在quartus里面设置第三方eda仿真工具后,编译成功会自动在quartus工程
目录下面创建一个simulation\\modelsim的文件夹,此文件夹等同于独立运行moddelsim仿真时最先建立的文件夹。另quartus联合modelsim仿真,modelsim默认路径即为其自动创建文件夹simulation\\modelsim下,不必人为更改。
启动modelsim后,建立仿真库。点击file>new>library,出现对话框,选择a new library and a logical mapping to it(已默认),在library name 中输入要创建库的名称。
总结步骤为:启动modelsim-->点击file-->chang directory(如需更改路径的话);再file-->new-->(project)-->library,进行相关设置。即可。
2.2)编写源代码及testbench;
在编写目标测试文件(testbench)之前,我们先写完目标文件(既可在quartus中编写,也可以在modelsim中编写),把它编译进工作库。(当然此步也可以等到和测试文件写完以后一起编译)。源代码的编写就不用介绍了,下面介绍编写testbench的两种方法。
b) 在 quartus内编写并编译 testbench ,之后将testbench 和目标文件放在同一个文件夹下,按照前面的方法把 testbench 文件和目标文件都编译到工作库中之后。
另如果在工作库中没有该文件(在testbench文件没有端口的情况下),则在simulate——>start simulate卡片中去掉优化选项enable optimization之后再重新编译,即可在工作库中找到该文件。
三)执行仿真(分别说明前仿真和后仿真)
3.1)前仿真 前仿真相对来说简单些,在执行到上面一步,把需要的文件编译到作库后,我们只需点simulation>start simulation或快捷按钮。会出现startsimulation对话框,点击design标签选择work库(工作库)中的测试文件然后点ok既可以。在主界面中会多出来一个objects窗口,里面显示 testbench 里定义的所信号引脚,在workspace里也会多出来一个sim标签。右键点测试文件,选择add->add to wave,然后将出现wave窗口,现在就可以仿真了。
3.2)后仿真 后仿真与前仿真步骤大体相同,只不过中间需要添加仿真库(和所选器件资源库,例如在原理图文件中用到ip core,我们这里就要把相关的_mf.v库加进来。)网表和延
时文件的步骤。
后仿真的前提是quartus已经对要仿真的目标文件进行编译,注意引脚的分派。并生成modelsim仿真所需要的.vo文件(网表文件)和.sdo文件(时延文件)。具体操作过程又有两种方法,一种是通过quartus调用modelsim,quartus在编译之后自动把仿真需要的.vo文件以及需要的仿真库加到modelsim中,操作简单;一种是手动将需要的文件和库加入modelsim进行仿真,这种方法可以增加主观能动性,充分发挥modelsim的强大仿真功能。
a) 通过quartus调用modelsim;
再点start simulate对话框的sdf标签。在出现的对话框的sdf file框内加入.sdo时延文件路径。在apply to region框内有一个“/”, 在“/”的前面输入测试台文件名,在它的后面输入测试台程序中调用被测试程序时给被测试程序起的名称。(一般为dut)
b) 手动仿真;
两种方法的区别在于,modelsim仿真所需要的.vo文件以及.sdo文件,和资源库的建立方法不同,手动仿真需要自己添加这些文件到工作库下。建议使用手动添加的方式,有利于我们对软件使用的更好理解。
以上方法可供参考,modelsim软件自带的教程也是一个不错的学习路径,在help>se pdf documentation>tutorial里面有详细的功能讲解,使用时可以看看。 篇四:verilog modelsim 文件操作
verilog modelsim 文件操作($fopen,$fwrite,$fscanf,$fclose)
使用while循环,如不是最后一行,则一直读取,类似c语言的while(!foef(fp_r)) {}。
转:
系统函数$fopen用于打开一个文件,并还回一个整数指针.然后,$fdisplay就可以使用这个文件指针在文件中写入信息,写完后,则可以使用$fclose系统关闭这个文件
例如: integer write_out_file;//定义一个文件指针
integer write_out_file=$fopen(write_out_file.txt);
$fdisplay(write_out_file,@%h\\n%h,addr,data);
$fclose(write_out_file);
以上语法是将addr,data分别显示在"@%h\\n%h"中的2个%h的位置,并写入write_out_file文件指针所指向的write_out_file.txt中.
从文件中读取数据,可以用 $readmemb $readmemh 从文件中读入数据,该文件格式是一定的. reg[7:0] data[47:0];
$readmemh(file_name.txt,data );
就是将file_name.txt中的数据读入到data数组中,然后就可以使用这些数据了.
还有一种方式可以把指定的数据放入指定的存储器地址单元内,就是在存放数据的文本文件内,给相应的数据规定其内存地址,形式如下:
@address_in_hexadecimal data
@2f 20
两个系统任务可以在仿真的任何时刻被执行使用,其使用格式共有以下六种:
1) $readmemb(<数据文件名>,<存贮器名>);
2) $readmemb(<数据文件名>,<存贮器名>,<起始地址>);
3)
$readmemb(<数据文件名>,<存贮器名>,<起始地址>,<结束地址>);
4) $readmemh(<数据文件名>,<存贮器名>);
5) $readmemh(<数据文件名>,<存贮器名>,<起始地址>);
6)
$readmemh(<数据文件名>,<存贮器名>,<起始地址>,<结束地址>);
在这两个系统任务中,被读取的数据文件的内容只能包含:空白位置(空格,换行,制表格(tab)和form-feeds),注释行(//形式的和形式的都允许),二进制或十六进制的数字。数字中不能包含位宽说明和格式说明,对于$readmemb系统任务,每个数字必须是二进制数字,对于$readmemh系统任务,每个数字必须是十六进制数字。数字中不定值x或x,高阻值z或z,和下划线(_)的使用方法及代表的意义与一般verilog hdl程序中的用法及意义是一样的。另外数字必须用空白位置或注释行来分隔开。
在下面的讨论中,地址一词指对存贮器(memory)建模的数组的寻址指针。当数据文件被读取时,每一个被读取的数字都被存放到地址连续的存贮器单元中去。存贮器单元的存放地址范围由系统任务声明语句中的起始地址和结束地址来说明,每个数据的存放地址在数据文件中进行说明。当地址出现在数据文件中,其格式为字符“@”后跟上十六进制数。如:
@hh...h
对于这个十六进制的地址数中,允许大写和小写的数字。在字符“@”和数字之间不允许存在空白位置。可以在数据文件里出现多个地址。当系统任务遇到一个地址说明时,系统任务将该地址后的数据存放到存贮器中相应的地址单元中去。
对于上面六种系统任务格式,需补充说明以下五点:
1) 如果系统任务声明语句中和数据文件里都没有进行地址说明,则缺省的存放起始地址为该存贮器定义语句中的起始地址。数据文件里的数据被连续存放到该存贮器中,直到该存贮器单元存满为止或数据文件里的数据存完。
2) 如果系统任务中说明了存放的起始地址,没有说明存放的结束地址,则数据从起始地址开始存放,存放到该存贮器定义语句中的结束地址为止。
3) 如果在系统任务声明语句中,起始地址和结束地址都进行了说明,则数据文件里的数据按该起始地址开始存放到存贮器单元中,直到该结束地址,而不考虑该存贮器的定义语句中的起始地址和结束地址。
4) 如果地址信息在系统任务和数据文件里都进行了说明,那么数据文件里的地址必须在系统任务中地址参数声明的范围之内。否则将提示错误信息,并且装载数据到存贮器中的操作被中断。 5) 如果数据文件里的数据个数和系统任务中起始地址及结束地址暗示的数据个数不同的话,也要提示错误信息。
下面举例说明: 先定义一个有256个地址的字节存贮器 mem:
reg[7:0] mem[1:256];
下面给出的系统任务以各自不同的方式装载数据到存贮器mem中。
initial $readmemh(mem.data,mem);
initial $readmemh(mem.data,mem,16);
initial $readmemh(mem.data,mem,128,1);
第一条语句在仿真时刻为0时,将装载数据到以地址是1的存贮器单元为起始存放单元的存贮器中去。第二条语句将装载数据到以单元地址是16的存贮器单元为起始存放单元的存贮器中去,一直到地址是256的单元为止。第三条语句将从地址是128的单元开始装载数据,一直到地址为1的单元。在第三种情况中,当装载完毕,系统要检查在数据文件里是否有128个数据,如果没有,系统将提示错误信息。
"引用 参考"
1.打开文件
integer file_id; file_id = fopen(file_path/file_name);
2.写入文件
//$fmonitor只要有变化就一直记录
$fmonitor(file_id, %format_char, parameter);
eg:$fmonitor(file_id, %m: %t in1=%d o1=%h, $time, in1, o1);
//$fwrite需要触发条件才记录
$fwrite(file_id, %format_char, parameter);
//$fdisplay需要触发条件才记录
$fdisplay(file_id, %format_char, parameter);
$fstrobe(); 3.读取文件
integer file_id; file_id = $fread(file_path/file_name, r);
4.关闭文件
$fclose(fjile_id);
5.由文件设定存储器初值
$readmemh(file_name, memory_name); //初始化数据为十六进制
$readmemb(file_name, memory_name); //初始化数据为二进制
转:
提供了丰富的系统函数,这为testbench的编写提供了方便。尤其是ieee1364-2005,其系统级建模的能力更强。
以前我一般常用到的系统函数只有几个:$readmemb,$readmemh,$display,$fmonitor,$fwrite,$fopen,$fclose等。通常需要对文件作预处理,才能用于testbench读取。今天又尝试了几个其他的文件输入输出函数,不需要对文件进行预处理,直接使用需要的文件,只对需要的部分进行读取。
$fseek,文件定位,可以从任意点对文件进行操作;
$fscanf,对文件一行进行读写。
下面是一些常见的应用:
1、读写文件 `timescale 1 ns/1 ns
module fileio_tb;
integer fp_r, fp_w, cnt;
reg [7:0] reg1, reg2, reg3;
initial begin fp_r = $fopen(data_in.txt, r);
fp_w = $fopen(data_out.txt, w);
while(!$feof(fp_r)) begin
cnt = $fscanf(fp_r, %d %d %d, reg1, reg2, reg3);
$display(%d %d %d, reg1, reg2, reg3);
$fwrite(fp_w, %d %d %d\\n, reg3, reg2, reg1);
end
$fclose(fp_r);
$fclose(fp_w); end
endmodule 2、
integer char;
reg eof;
initial begin file $fopenr(myfile.txt);
eof = 0;
while (eof == 0) begin
char $fgetc(file);
eof (file);
$display char);
end end
3 `define seek_set 0
`define seek_cur 1
`define seek_end 2
integer offset, position, r;
r = $fseek(file, 0, `seek_set);
r = $fseek(file, 0, `seek_cur);
r = $fseek(file, 0, `seek_end);
r = $fseek(file, position, `seek_set);
4file, = = = $feof (%s, 、文件处理定位 file, 、
integer r, file, start, count;
reg [15:0] mem[0:10], r16;
r = $fread(file, mem[0], start, count);
r = $fread(file, r16);
5、
integer position;
position $ftell(file);
6 integer file, r, a, b;
reg string;
file $fopenw(output.log);
r $sformat(string, formatted %d %x, a, b);
r $sprintf(string, formatted %d %x, a, b);
r formatted %d %x, a, b);
7、
integer file, r; file $fopenw(output.log);
r $fflush(file);
8 // pattern file - read_pattern.pat
// hex
10: 001 1 1
20.0: 010 20 020 50.02: 111 5 fff 62.345: deadbeef
75.789: file, = 、
[80*8:1] = = = = $fprintf(file, = = 、
this is a time bin dec 100 4 xxx 2
zzzzzzzz
`timescale 1ns / 10 ps
`define eof 32hffff_ffff
`define null 0 `define max_line_length 1000
module read_pattern;
integer file, c, r;
reg [3:0] bin; reg hex;
real real_time; reg [8*`max_line_length:0] line;
initial
begin file_block
$timeformat(-9, 3, ns, 6);
$display(time bin decimal hex);
file $fopenr(read_pattern.pat);
if // if error opening file
disable file_block; // just quit
c = $fgetc(file);
while begin
if (c == /)
r = $fgets(line, `max_line_length, file);
else begin
// character back to the file then read the next time r [31:0] dec, : = (file == `null) (c != `eof) push the = $ungetc(c, file);
r = $fscanf(file, %f:\\n, real_time); 篇五:modelsim仿真ip核总结报告
说明:如果modelsim要能够仿真ise中的ip核,则首先需要将ip核的描述文件编译到指定的库中,下面就具体步骤进行说明。
1. 首先你可以打开modelsim,选择file->change diriectory查看你当前的路径,也可以修 改路径。
2. 在moselsim的wordspace窗口中右击选择new-library,选择create-a new library。输入
library name(如xilinx_lib),其他默认即可,如下图:
点击ok确认,那么在你的diriectory路径的目标文件夹下回出现文件夹xilinx_lib,里面有个文件_info.
至此ise中的ip核已加载到modelsim的库中,这里说明一下,并非所有编译的库文件我们都用到,但是都编译了放在那是没有关系的。
4. 接下来用ise生成一个ip核,把它的行为级(如fifo.v或.vhdl)描述文件(或者称ip核
5. 编写testbench(可以用ise生成,这样很快,当然自己写也可以),编译fifo.v和test.v, 之后选择编译后的test,在添加波形即可。
因篇幅问题不能全部显示,请点此查看更多更全内容