You are on page 1of 60

用Mentor Graphics公司的

ModelSim做分析设计

报告人:余舟

电子科技大学—Mentor Graphics公司 EDA/SOC设


计及培训中心
培训简介

内容:熟悉ModelSim5.6的仿真环境,
学习 ModelSim的使用
面向对象:EDA设计大赛参赛人员
培训单位:电子科技大学—MentorGraphics公司
EDA/SOC设计及培训中心
培训议程
EDA设计概述
ModelSim产品简介
用ModelSim进行功能仿真
用ModelSim进行时序仿真
具体使用及讨论时间
EDA设计概述
设计规范
修改设计
设计输入

RTL仿真

设计综合

布局和布线

门级仿真

时序分析

系统上验证

系统产品
ModelSim产品简介(1)

由Mentor Graphics公司 的子公司Model


Tech公司开发
工业上最通用的仿真器之一
支持Verilog 和 VHDL仿真
– OEM版本允许Verilog仿真 或者 VHDL 仿真
ModelSim产品简介(2)

ModelSim/SE
– 首要的版本,能混合仿真Verilog 和 VHDL
ModelSim/XE
– OEM版,包含Xilinx公司的库文件
ModelSim/AE
– OEM版,包含Altera公司的库文件
ModelSim产品简介(3)
ModelSim 用户界面
main主窗口: source源窗口

structure结构窗口

Wave&list
process处理窗口 波形和列表窗口
:

Signal&variable信号
和变量窗口
dataflow数据流窗口
ModelSim产品简介(4)

Main 窗口
• ModelSim>
--这是设计加载前的提示符
--能浏览帮助, 编辑库, 编辑源代码而不用调用一个设

• VSIM>
--设计加载后显示的提示符
--告诉我们仿真器的行为
动作(命令、信息、声明)
ModelSim产品简介(5)

Main 窗口:库
• Design Menu -> Browse Libraries
– 加入新库或编辑已有的库
– 浏览和编辑库目录
ModelSim产品简介(6)
Main 窗口:启动窗口
• Design Menu -> Load New Design
– 用于选择要加载的设计
• 选择:
– 时间分辨率
• 支持 1, 10,100等多种时间尺度
– 包含顶级设计单元的库
– 顶级设计单元
• Entity/Architecture
• 构造
• 模块
ModelSim产品简介(7)

Main 窗口:选项
• Options Menu ->Simulation Options
ModelSim产品简介(8)
Structure 窗口
• 设计的结构多层浏览
– VHDL () - Package, component
instantiation, generate and block
statements
– Verilog () – module实例,
named fork, named begin, task,
和 function
– Instantiation label, entity/module,
architecture
– 成为当前层 for Source 和 Signals 窗口,
updates Process 和Variables 窗口
ModelSim产品简介(9)

Source 窗口
ModelSim产品简介(10)
Source 窗口
• 描述
– 显示所选的HDL项的信息
• 检查
– 显示所选HDL项当前仿真值

1) 高亮信号,
变量, 常数,
线网, 或寄存器
2) 右击鼠标
(或 Object Menu ->
Examine/Description)
ModelSim产品简介(11)
Process 窗口
• 显示外部和内部的处理
• View -> Active
– 显示当前仿真众所有在执行前预定的
processes
• View -> In Region
– 显示在Structure 窗口中选定的所有
processes 的名字
ModelSim产品简介(12)
Process 窗口
• 显示外部和内部的处理
• View -> Active
– 显示当前仿真众所有在执行前预定的processes
• View -> In Region
– 显示在Structure 窗口中选定的所有
processes 的名字
• 指示器
– <Ready>
• 被预定执行的Process
– <Wait>
• 处理正等待 VHDL 信号或Verilog 线网改变 或等
待超时
– <Done>
• Process has executed a VHDL wait statement
without a time-out or sensitivity list
ModelSim产品简介(13)
Signals 窗口
• 紧跟Structure窗口
– 显示Structure窗口的当前层HDL项的名称和

• 层次 - (+)可展开的, (-)已展开的
• VHDL 信号,Verilog 线网, 寄存器变量和已命名
的时间
• 可拖放到Wave和List窗口
ModelSim产品简介(14)
Dataflow窗口
• VHDL信号或Verilog线网的图形描绘
– 信号或线网在窗口中央
– 驱动信号or线网的Processes在左边
– 读信号或者被线网驱动的Processes 在右边
ModelSim产品简介(15)
Wave窗口

Adjustable spacing
between signals

VHDL Variable

Color-coding on a
signal-by-signal basis

Cursor Measurement
ModelSim产品简介(16)
list窗口
• 用表格显示仿真结果
– VHDL – 信号和过程变量
– Verilog – 线网和寄存器变量
• 从这个窗口或到这个窗口“拖放”
• 编辑功能 – 查找
• 建立用户定义的总线 - Edit>Combine
• 设置触发和选通
• 标记 - Add, Delete 或 Goto
ModelSim产品简介(17)
Variables窗口
• 列出 HDL 项的名称
– VHDL – 常数, generics 和变量
– Verilog – 寄存器变量
• 到当前过程的路径被显示在左下
• 树层次 - (+)可展开的, (-)已展开的
• 可改变 – 选择HDL项改变值
• 可浏览 – 在Wave 或
List 窗口 或 log 文件的项
– 选择变量或层中的变量
用ModelSim作功能仿真

功能仿真的含义
功能仿真的实现方法
基本的仿真步骤
用ModelSim作功能仿真(1)

功能仿真的含义:

验证设计模块的基本逻辑功能,属于最基本的验

不带有布局布线后产生的时序信息
用ModelSim作功能仿真(2)

ModelSim 的实现方法:
交互式的命令行 (Cmd)
– 利用控制台的命令行
用户界面 (UI)
– 能接受菜单输入和命令行输入
批处理模式
– 从DOS或UNIX命令行运行批处理文件
用ModelSim作功能仿真(3)

基本仿真步骤:
1  建立库
2  映射库到物理目录
3  编译源代码
- 所有的HDL代码必须被编译
- Verilog和VHDL是不同的
4  启动仿真器
5  执行仿真
用ModelSim作功能仿真(4)

1  建立库

UI) 从主菜单里面:
Design -> Create a New Library

Cmd) 从main, 记录窗口:


ModelSim> vlib <库名>
用ModelSim作功能仿真(5)
2  映射库到物理目录

UI) 从主菜单:
Design -> Browse Libraries
Design -> Create a New Library

Cmd) 从主体的记录窗口:
ModelSim> vmap <logical_name><directory_path>
用ModelSim作功能仿真(5)
其他库命令
• vdel
– 从指定的库中删除一个完整的库或者一个设计单元
– UI) Design -> Library Browser (删除库或者映射)
– UI) Design -> View Library Contents (删除设计
单元)
– Cmd) vdel -lib <library_name> <design_unit>

• vdir
– 显示指定库的内容
– UI) Design -> View Library Contents
– Cmd) vdir -lib <library_name>
用ModelSim作功能仿真(6)
3  编译源代码(VHDL)

 UI) Design -> Compile


Cmd) vcom -work <library_name> <file1>.vhd
<file2>.vhd
– 文件按出现的顺序被编译
– 文件中单元的编译次序见下一页
 缺省的是‘87 VHDL
– UI) 用Default Options 按钮设为‘93
– Cmd) 用 -93 选项(必须是第一个参数)
 缺省编译到work库
用ModelSim作功能仿真(7)

3  编译源代码(VHDL)

VHDL设计单元的编译顺序:
Entity 在 Architecture之前编译
Package Declaration 在 Package Body之前编

设计单元必须在引用前被编译
– Packages在 Entity/Architectures 使用其之前编译
– Entities/Configurations 在 Architectures 引用它之
前编译
配置文件最后编译
用ModelSim作功能仿真(8)
3  编译源代码(Verilog)

 UI) Design -> Compile


 Cmd) vlog -work <library_name> <file1>.v
<file2>.v
– 文件按出现的顺序被编译
– 文件的顺序或者编辑的顺序不重要
 支持增量式编译(只有被改动的设计单元被编译)
 缺省编译到work库
– 例如. vlog my_design.v
用ModelSim作功能仿真(9)
3  编译源代码

点亮一个或多个文
件并点击 Compile
用ModelSim作功能仿真(10)
3  编译源代码----错误信息

错误信息在 Main
窗口显示

在信息上双击,引起
错误的代码在
Source 窗口被点亮
用ModelSim作功能仿真(11)
4  启动仿真器

 UI) Design -> Load New Design


Cmd) vsim -lib <library_name>
<top_level_design>

 VHDL
– vsim top_entity top_architecture

 Verilog
– vsim top_level1 top_level2
• 仿真多个top级模块
用ModelSim作功能仿真(11)
4  启动仿真器

选择库

选择顶级module 或
entity/architecture

选择仿真器的分辨率
用ModelSim作功能仿真(12)
4  启动仿真器

指定 SDF文件

使用定时值的等级的
类型 (如果不是顶级)
用ModelSim作功能仿真(13)
4  启动仿真器----vsim 命令的参数
• 参数
– -t <time_unit>
• 指定仿真的时间分辨率
• 单位可以是{fs, ps, ns, ms, sec, min, hr}
• 如果用了 Verilog的 ‘timescale指令, 将使用整个设计中的最
小的时间精度
• 可选项(缺省是 ns)

– -sdfmin | -sdftyp | -sdfmax


<instance>=<sdf_filename>
• 注释SDF文件
• 可选项
• 使用实例名也是可选项; 如果没有使用, SDF用于顶级
用ModelSim作功能仿真(14)

5  执行仿真

 UI) Run
CMD) run <time_step> <time_units>

 按timesteps指定的时间长度执行仿真
用ModelSim作功能仿真(15)

5  执行仿真(UI)

选择 timesteps数量就
可以执行仿真

Restart – 重装任何已改动
的设计元素并把仿真时间设
为零

COM) restart
用ModelSim作功能仿真(16)

5  执行仿真----run 命令参数
 可选的参数
- -<timesteps> <time_unit>
• 指定运行的timesteps数量
• 单位可用{fs, ps, ns, ms, sec}
- -step
• Steps to the next HDL statement
- -continue
• 继续上次在-step或断点后的仿真
- -all
• 运行仿真器直到没有其他的事件
用ModelSim作功能仿真(17)

5  执行仿真----run 命令举例

 run 1000
- 从当前位置运行仿真 1000 timesteps
 run 2500 ns
- 从当前位置运行仿真2500 ns
 run @3000
- 运行仿真到 timestep 3000
用ModelSim作功能仿真(18)

5  执行仿真----仿真器激励

 测试台
- Verilog 或 VHDL代码
- 非常复杂的仿真(交互式仿真、数据量大的仿真)

 force命令
- 简单的模块仿真
- 直接从命令控制台输入
- .DO 文件 (宏文件)
用ModelSim作功能仿真(19)

5  执行仿真----仿真器激励

 force命令
- 简单的模块仿真
- 直接从命令控制台输入
- .DO 文件 (宏文件)
 测试台(test bench)
- Verilog 或 VHDL代码
- 非常复杂的仿真(交互式仿真、数据量大的仿真)
用ModelSim作功能仿真(20)

5  执行仿真----仿真器激励
Force命令

 允许用户给VHDL的信号和Verilog的线网予以激励

 常规语法:
- force <item_name> <value> <time>, <value> <time>

 参数
用ModelSim作功能仿真(21)
5  执行仿真----仿真器激励
Value Description
Force命令参数
1111 character sequence
- item_name
--被激励的HDL项的名称,是必选的 2#1111 binary radix
--必须是一个标量 10#15 decimal radix
--可以是一个被编址的阵列, 阵列的一部分 16#F hexadecimal radix
--可以采用通配符(在只有一个匹配的时候)
- value
--被激励项的值,是必选的
--必须适合该项的数据类型
- time
--指定值的时间单位,可选的
--相对于当前的仿真时间,用 @ character指定绝对时间
--时间单位能被指定,缺省值是仿真分辨率
用ModelSim作功能仿真(22)
5  执行仿真----仿真器激励

Force命令参数

- -r[epeat] <period>
--在指定周期重复force命令,是可选的

- -cancel <period>
--在指定周期后取消强制force命令,是可选的
用ModelSim作功能仿真(23)
5  执行仿真----仿真器激励
Force命令举例:
 force clr 0
– 在当前仿真时间强制 clr 到 0
 force bus1 01XZ 100 ns
– 在当前仿真时间后100ns强制 bus1到 01XZ
 force 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前面的时间单位表达式必须放在大括号里
用ModelSim作功能仿真(24)
5  执行仿真----仿真器激励
.do文件
 自动完成仿真步骤的宏文件
– 库设置
– 编译
– 仿真
– 强制仿真激励
 能在所有的ModelSim 模式里被调用
– UI) Macro -> Execute
– COM) do <filename>.do
 能调用其他的DO文件
用ModelSim作功能仿真(25)
5  执行仿真----仿真器激励
stimulus.do
.do文件举例
add wave /clk
add wave /clr
cd c:\mydir my_sim.do add wave /load
vlib work
vcom counter.vhd add wave -hex /data
cd c:\mydir
vsim counter vlib work add wave /q
view * vcom counter.vhd force /clk 0 0, 1 50 -repeat 100
add wave /* vsim counter force /clr 0 0, 1 100
add list /* view *
do run.do run 500
do stimulus.do
force /load 1 0, 0 100
force /data 16#A5 0
force /clk 0 0, 1 50 -repeat 100
run 1000
用ModelSim作功能仿真(26)
5  执行仿真----仿真器激励
测试台文件(test bench)

 针对复杂的仿真
 VHDL文件或者Verilog
 在测试台文件中将设计模块实例化
--将测试台文件置于TOP层,调用设计模块
--在测试台文件中加载时钟激励信号,以及给部分信号赋初值
 测试台文件的写法与设计模块写法有区别
-- 一些符合语法但又无法被综合的语句(根据具体的综合工具
而定),可以在测试台文件中使用
用ModelSim作功能仿真(27)

设置断点:
 支持两种类型的断点
1、在源代码窗口设置断点
Toggles – 再次点击删除断点
没有断点数量的限制
用 bp 命令:bp <file_name> <line#>
2、条件断点
when <condition> <action>
when {b=1 and c/=0}
与VHDL信号和Verilog 线网和寄存器一起使用
也可用 bp 命令:
bp <file_name> <line#> {if{$now/=100}then{cont}}
用ModelSim作时序仿真

时序仿真的含义
时序仿真的实现方法
其他问题
用ModelSim作时序仿真(1)

时序仿真的含义:
布局布线后进行的后仿真
包含有延时信息
仿真结果可能与功能仿真不相同
除功能仿真时需要的文件以外,还需要
网表文件(如time_sim.vhd或
time_sim.v)和包含延时信息的文件
(time_sim.sdf文件)
用ModelSim作时序仿真(2)
时序仿真的实现方法:
编译Xilinx公司的库文件:
 先将modelsim.ini文件的只读属性去掉
 将Xilinx公司元件库的脚本文件COPY到modelsim的
安装目录下
 在main窗口运行:
MODELSIM> source <path_to_script>/xilinx_lib.tcl
这里的路径一定要用/来表示,比如e:/tools/xilinx
 看到弹出对话框后,选择相应的选项,进行库的编译
用ModelSim作时序仿真(3)

时序仿真的实现方法:
 unisim库是用来对ISE中画的电
路图进行前仿真时用的。
simprim则是在作布线后的时序
仿真时用。
用ModelSim作时序仿真(4)
时序仿真的实现方法:
以Foundation为例:
 Foundation所产生的netlist不包含time delay的数
据,有一个time_sim.SDF文件来存储TIMING数据。
(有的厂商的布局布线所产生的NETLIST文件已经包
含有time delay的数据).
 Foundation所产生的NETLIST文件默认的文件名是
time_sim.vhd(或time_sim.v)
 time_sim.vhd或time_sim.v文件用到新的simprim
库,因此必须在仿真前先建立。
 做时序仿真,要编译time_sim.vhd或time_sim.v,以
及time_sim.SDF
 加载测试文件
用ModelSim作时序仿真(5)

时序仿真的容易遇到的问题:
以Xilinx公司的为例:
GSR信号产生的影响(可以通过改
变输入信号时延来解决)
D触发器的setup time不足(可以
通过分析SDF文件来追究错误所在)
关于modelsim.ini文件

 ModelSim使用 ASCII文件, 由用户控制


 在ModelSim的安装目录一个缺省文件被提供
 modelsim.ini被编译器和仿真器使用
存有初始信息
库定位
启动文件的定位
ModelSim其他缺省设定
[Library]:逻辑上的LIBRARY与实际硬盘驱动目录的连接
[vcom]:COMPILE时的一些选项的默认值,0=OFF,1=ON
[vsim]:仿真时参数的设定

 modelsim.ini缺省为只读属性,故编译库文件时应
该将只读属性去掉。
总结
• 前面讲述了ModelSim的基本使用方法。大家可通
过例子来练习使用ModelSim
• 还有一些较深入的问题,例如:
用VITAL仿真模型支持VHDL 布局布线后仿真;
用Tcl 去定制ModelSim图形用户界面;用Tcl 去
自动生成测试矢量;用性能分析去减少仿真时
间;用测试矢量分析HDL 代码覆盖率;
Modelsim5.6以及5.7的新特性;源代码编写中的
语言模板和助手;数据流窗口中的信号探察……
等等,还有待于进一步的探讨。
谢谢大家!

You might also like