Modelsim的仿真教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ModelSim的仿真
1.仿真的分类
仿真过程是正确实现设计的关键环节,用来验证设计者的设计思想是否正确,及在设计实现过程中各种分布参数引入后,其设计的功能是否依然正确无误。
仿真主要分为功能仿真和时序仿真。
功能仿真是在设计输入后进行;时序仿真是在逻辑综合后或布局布线后进行。
1). 功能仿真( 前仿真)
功能仿真是指在一个设计中,在设计实现前对所创建的逻辑进行的验证其功能是否正确的过程。
布局布线以前的仿真都称作功能仿真,它包括综合前仿真(Pre-Synthesis Simulation )和综合后仿真(Post-Synthesis Simulation )。
综合前仿真主要针对基于原理框图的设计; 综合后仿真既适合原理图设计, 也适合基于HDL 语言的设计。
2). 时序仿真(后仿真)
时序仿真使用布局布线后器件给出的模块和连线的延时信息,在最坏的情况下对电路的行为作出实际地估价。
时序仿真使用的仿真器和功能仿真使用的仿真器是相同的,所需的流程和激励也是相同的;惟一的差别是为时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时,并且在仿真结果波形图中,时序仿真后的信号加载了时延,而功能仿真没有。
后仿真也称为时序仿真或者布局布线后仿真,是指电路已经映射到特定的工艺环境以后,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,是否存在时序违规。
其输入文件为从布局布线结果中抽象出来的门级网表、Testbench 和扩展名为SDO 或SDF 的标准时延文件。
SDO 或SDF 的标准时延文件不仅包含门延迟,还包括实际布线延迟,能较好地反映芯片的实际工作情况。
一般来说后仿真是必选的,检查设计时序与实际的FPGA运行情况是否一致,确保设计的可靠性和稳定性。
2.仿真的作用
1).设计出能工作的电路:因此功能仿真不是一个孤立的过程,其和综合、时序分析等形成一个反馈工作过程,只有这个过程收敛,各个环节才有意义。
而孤立的功能仿真通过是没有意义的,如果在时序分析过程中发现时序不满足需要更改代码,则功能仿真必须从新进行。
因此正确的工作流程是:
2).代码排错:功能仿真是代码排错的最重要的手段之一。
4).仿真检验代码质量的一个重要手段。
测试激励的代码覆盖率至少要达到95%以上,才能基本认为代码在逻辑上是通过质量控制的,才能进入综合步骤;5).在大的设计中,如果想通过一个激励就验证完一个设计或者模块是不现实的。
一方面是从逻辑功能上很难做到;另外一方面是因为如果在一个激励中包括了各种情况,整个仿真过程的速度会随着计算机内存的消耗而成线性下降,效率低下,而利用仿真能很好地解决这些问题。
6).通常的做法是每一个激励只验证电路功能的某个方面。
整个电路的功能验证由数个激励共同完成。
在这种验证方法中代码覆盖率更显重要,因为可以通过代码覆盖率来控制激励对功能的覆盖程度。
7).modelsim的Code coverage不但能记录各个激励对代码的“行覆盖”和“分支覆盖”,而且能够将各个激励的覆盖记录进行合并,做到对覆盖率的全面监测。
3.仿真的过程
1).综合前的功能仿真
下面以一个线性反馈移位寄存器为例用ModelSim进行功能仿真,由于用编写do文件的方法进行仿真能极大提高仿真设计的效率,我们采用编写do文件的方式来仿真。
<1>编写TestBench文件。
<2>编写do文件。
<3>打开ModelSim,打开命令File-New-Project,在窗口中输入工程名LFSR_MS,并制定do 文件所在文件夹路径。
<4>命令控制栏中直接输入“run sim.do”按回车进行仿真,并查看波形。
2).综合后功能仿真
<1>为工程添加库文件。
去除modelsim安装目录下modelsim.ini的只读属性(使得这个.ini 的配置文件可以被修改)
<2>打开Modelsim,更改目录File->Change directory到根目录下。
<3>新建一个库取名为alteralibrary。
我使用的是Modelsim的6.2b版本,步骤是:File-> New->Library,打开之后在Library Name中写上alteralibrary,点击ok就可以了。
<4>在Quartus安装目录先找到四个库文件,我的目录是F:\Program Files\ Quartus\quartus \eda\sim_lib,并复制到D:\FPGA_Example\LFSR\ModelSim目录下待用。
<5>在Modelsim的环境下对alteralibrary库文件进行编译。
步骤是Compile -->Compile,打开对话框,Library中选择你刚才建的库名alteralibrary,在查找范围内添加第三部我们从Quartus中复制过来的库文件,我这里是D:\FPGA_ Example\LFSR\ModelSim,如果你是用vhdl编写代码的则选择\vhdl,verilog编写代码的话就选\verilog(我选择的是\verilog),再点击Compile,编译完成后点击done。
这样我们的库文件就编译完成了,其编译后的文件就存放在我们建立的库文件alteralibrary中。
<6>打开Modelsim.ini文件,在[Library]下可以看到alteralibrary = alteralibrary,那就修改下路径就成alteralibrary存放的路径,我把路径修改为D:/FPGA_Example/LFSR/ModelSim/Postsim /alteralibrary。
<7>再把Modelsim.ini的只读属性选上就可以开工了,重启Modelsim就能在Library栏看到你添加的库啦。
<8>在Quartus中打开Assignment-> Setting -> Simulation,在Tool name中选择Modelsim,在Output Directory中指定生成的网表文件的路径,在more setting中将Generate Netlist for Functional Simulation Only中选择ON,点击仿真就能在你指定的文件夹中输出仿真所需要的网表文件。
<9>在Modelsim中新建工程,并添加网表文件和TestBench文件,并编译。
<10>仿真。
首先执行Simulate->Start Simulation 在窗口中的Libraries中选择add添加alteralibrary库文件,在work中选择仿真的TestBench文件,点击OK.
<11>添加波形并仿真。
点击View-> Wave,然后将Object中的端口添加到波形查看窗口中,在状态命令栏中输入run 20000,就能查看波形了。
3).布线后的时序仿真
对于布线后的时序仿真我们需要布线后的网表,延时文件*.sdo,testbench文件,仿真原型文件。
其仿真过程和综合后的仿真过程大体一致,只是添加的文件有所不同,这里不再重复。
附录:
线性移位寄存器verilog程序:
module LFSR
(
//input ports
SYSCLK,
RST_B,
//output port
DA TA_OUT
);
//================================= //input and output declaration
//=================================
input SYSCLK;
input RST_B;
output [7:0] DA TA_OUT;
//================================= //wire and reg declaration
//=================================
wire RST_B;
reg [7:0] DA TA_OUT;
wire [7:0] DA TA_OUT_N;
wire DO_GEN;
//=================================
//logic
//=================================
always@(posedge SYSCLK or negedge RST_B)
begin
if(!RST_B)
DA TA_OUT <= 8'b00000001;
else
DA TA_OUT <= DA TA_OUT_N;
end
assign DO_GEN= DA TA_OUT[7]^DA TA_OUT[3]^DA TA_OUT[2]^DA TA_OUT[1]; assign DA TA_OUT_N = {DA TA_OUT[6:0],DO_GEN};
endmodule
testbench程序:
module LFSR_TB;
reg SYSCLK;
reg RST_B;
wire [7:0] DA TA_OUT;
LFSR I_LFSR_TB
(
.SYSCLK (SYSCLK),
.RST_B (RST_B ),
.DA TA_OUT(DA TA_OUT)
);
always #20 SYSCLK = ~SYSCLK;
initial
begin
RST_B = 0;
#50 RST_B = 1;
end
endmodule
do文件程序:
#新建一个工作库
vlib work
#将建立的一个工程与工作库之间映射vmap work work
#编译两个文件
vlog ../Src/LFSR.v
vlog ../TestBench/LFSR_TB.v
#仿真,不进行优化
vsim -novopt work.LFSR_TB
#添加波形
add wave LFSR_TB/SYSCLK
add wave LFSR_TB/RST_B
add wave LFSR_TB/DA TA_OUT
add wave I_LFSR_TB/DO_GEN
#运行20000ns
run 20000。