780 likes | 1.17k Views
ModelSim —— 仿真验证工具. Liu Dahai Catherineliu@acconsys.com. 典型的设计流程. 内容提要. ModelSim 简介 用户界面 用 ModelSim 进行仿真 基本仿真步骤 添加激励 使用宏文件 保存和恢复仿真状态 Modelsim.ini 文件 Startup.do 文件 先进功能. ModelSim 仿真器. 业界使用最广泛的 HDL 语言仿真器之一 能够进行 VHDL 仿真和 Verilog 仿真,以及这两种语言的混合仿真 OEM 版不支持两种语言的混合仿真.
E N D
ModelSim ——仿真验证工具 Liu Dahai Catherineliu@acconsys.com
内容提要 • ModelSim简介 • 用户界面 • 用ModelSim进行仿真 • 基本仿真步骤 • 添加激励 • 使用宏文件 • 保存和恢复仿真状态 • Modelsim.ini文件 • Startup.do文件 • 先进功能
ModelSim 仿真器 • 业界使用最广泛的HDL语言仿真器之一 • 能够进行VHDL仿真和Verilog仿真,以及这两种语言的混合仿真 • OEM版不支持两种语言的混合仿真
Complete Standard Support • Verilog • IEEE 1364-1995, 1364-2001, System Verilog • PLI 1.0 & 2.0 • VCD, Extended VCD • VHDL • IEEE 1076-1987, 1076-1993 • 1164-1993 • 1076.2-1996 • VITAL • 2.2b • IEEE 1076.4-1995, 1076.4-2000 • SDF • 1.0 to 3.0
PE versus SE ModelSim PE ModelSim SE ModelSim SE Kernel ModelSim PE Kernel Performance Analyzer C Debugger* *Beta in 5.6 Enhanced Dataflow Window Enhanced Dataflow Window Code Coverage Code Coverage Optional Waveform Compare Waveform Compare GUI Viewer GUI Viewer
源代码窗口 (source) 主窗口 (main) 结构窗口 (structure) 波形和列表窗口 (wave & list) 进程窗口 (process) 信号和变量窗口 (signals & variables) 数据流窗口 (dataflow) ModelSim的用户界面 Vsim>View *
用户界面的特点 • 有九种窗口:main, structure, source, signals, process, variables, dataflow, wave, list • 选择菜单view • 每个窗口都可以有多个副本 • 支持拖放操作 • 在一个窗口中选中HDL条目,运用鼠标器左键,可以把这些条目从一个窗口拖放到另一个窗口 • HDL条目可从下列窗口中拖出:Dataflow, List, Signals, Source, Structure, Variables,Wave • 它们可以被拖进List或Wave窗口中 • 例如:可以在Structure窗口中选中指定信号,然后将其拖进Wave窗口中进行观察
主窗口 • 设计加载以前,提示符为ModelSim> • 无需加载设计,可以查看帮助,编辑库,编辑源代码 • 设计加载以后,提示符为VSIM> • 记录仿真器动作 • 命令 • 消息 • 断言声明
主窗口:库 • 添加新库 • 选择菜单File > New > Library • 查看和编辑已存在的库
主窗口:启动窗口 • 用于选择要加载的设计 • 可以选择: • 时间精度 • 对于每个时间单位都支持1,10和100乘积因子 • 含有顶层设计单元的库 • 顶层设计单元 • Entity/Architecture • Configuration • Module • 选择菜单Simulate > Simulate… Cmd) vsim <library_name> <top_level_design_unit>
主窗口:选项窗口 • 选择菜单 Simulate > Simulation Options …
结构(structure)窗口 • 设计结构的层次化视图 • VHDL(方)- Package,component实例,generate和block声明 • Verilog(圆)- module实例,命名的fork,命名的begin,task和function • 实例标号, entity/module, architecture • 作为source和signals窗口的当前区域,更新process和variables窗口 Cmd) viewstructure
源代码(source)窗口 • 显示的代码对应于structure窗口 • 提供Options菜单,可控制源代码的显示方式 • 代码分色显示 • 提供完善的编辑功能 • 支持拖放操作 • 可设置断点 • 可单步运行代码 • 提供Discribe/Examine功能(见下页) Cmd) viewsource
1) 高亮选中signal, variable, constant, wire, 或reg 2)用鼠标器右键点击 或者 选择菜单Object -> Examine/Description 源代码(source)窗口 • Describe • 显示所选HDL条目的信息 • Examine • 显示所选HDL条目的当前仿真值
进程(process)窗口 • 显示明显的和隐含的进程 • 选择菜单View -> • Active • 显示当前仿真周期要执行的所有进程 • 选择菜单View -> • In Region • 显示在structure窗口中选定范围内的所有进程 Cmd) viewprocess
进程(process)窗口 • 指示符 • <Ready> • 进程准备执行 • <Wait> • 进程正在等待VHDL信号或Verilog网线发生改变,或者一段指定时间 • <Done> • 进程执行了VHDL无时限等待语句,或者没有敏感量列表
信号(signals)窗口 • 内容可随structure窗口选定内容改变 • 显示structure窗口当前范围内HDL条目的名称和值 • 排序 -升序排列,降序排列或按声明顺序排列 • 层次化 - (+)可扩展, (-)已扩展 • VHDL信号 • Verilog网线,寄存器变量和命名事件 • 支持拖放操作 • Wave和List窗口 • 强制赋值(Force) • 添加激励 • 过滤器 • 选择要查看的信号类型(输入,输出,内部信号等等) Cmd) viewsignals
变量(variables)窗口 • 列出HDL条目的名称 • VHDL - constants, generics和variables • Verilog - register variables • 当前进程的路径显示在左下角 • 树型结构 - (+)可扩展, (-)已扩展 • 排序-升序排列,降序排列或按声明顺序排列 • 可查看或改变所选HDL条目的值 Cmd) viewvariables
数据流(dataflow)窗口 • 对VHDL信号或Verilog网线进行图示化的跟踪 • 驱动信号或网线的进程位于左边 • 读取信号的进程或被网线触发进程在右边 • 进程 • 被读取的信号或触发该进程的网线在左边 • 被进程驱动的信号或网线在右边 • 内嵌波形窗口 Cmd) viewdataflow
Enhanced Dataflow Window Find Cause of Unknown with ChaseX Processes Linked to Source Window Selecting Process Updates Source & Signals Window Values Linked to Active Cursor Embedded Waveform Window
波形(wave)窗口 • 查看仿真结果的波形 • VHDL - 信号和进程变量 • Verilog -网线,寄存器变量,命名事件 • 支持拖放功能 • 支持多窗口,便于更好地对信号进行逻辑分组 • 可改变信号和向量的基数,提高可读性 • 波形可打印 Cmd) viewwave
列表(list)窗口 • 以表格形式显示仿真结果 • VHDL - 信号和进程变量 • Verilog -网线和寄存器变量 • 支持拖放功能 • 编辑功能-查找和搜索 • 创建用户定义的总线 • 选择菜单 Edit -> Combine • 可设置触发和选通属性 • 可选择保存列表格式-表格,事件或TSSI格式 • 标记功能-添加,删除或跳转 Cmd) viewlist
演 示 在 FPGA Advantage中 调用ModelSim进行仿真
ModelSim的运行方法 • 交互式命令行(Cmd) • 命令行控制台是唯一的接口,没有图形界面 • 图形界面(UI) • 可以接受菜单输入和命令行输入 • 本教程主要讨论这种方式 • 批处理模式 • 在DOS或UNIX提示符下运行批处理文件 • 不在本教程讨论范围内
基本仿真步骤 • 1 建库(物理库) • 2 将逻辑库映射到物理库 • 3 编译源代码 -所有HDL代码必须经过编译才能进行仿真 -Verilog和VHDL的编译命令不同 • 4 启动仿真器 • 5 运行仿真器
1 建库 UI)选择主窗口中的菜单: File -> New >Library Cmd)在主窗口命令提示符(Modemsim>)下键入: vlib <library name>
建库(图形界面) 选择a new library only并键入库名 该命令在当前路径下创建一个库子目录 -> vlib lpm_sim
ModelSim的库 • 库是含有已编译设计单元的目录 • VHDL和Verilog都会编译到库中 • 库有两种类型 • 工作库 (缺省为work) • 含有经过编译的当前设计单元 • 执行编译操作以前必须创建工作库 • 每次编译只需一个工作库 • 资源库 • 含有当前设计所引用的设计单元 • 每次编译可以有多个资源库 • VHDL库可以通过LIBRARY和USE语句进行引用
主单元 • 在同一个库中必须具有唯一的名称 • VHDL • Entities • Package Declarations • Configurations • Verilog • User Defined Primitives • Modules • 从单元 • 在同一个库中可以有相同的名称 • VHDL • Architectures • Package bodies • Verilog • 没有从单元 ModelSim的设计单元
VHDL预定义的库 • VHDL • std库含有standard包和textio包 • 对于新手来说,不要去修改这些包 • IEEEpure • 只含有IEEE批准的std_logic_1164包 • 已为仿真作了优化加速 • IEEE • 含有预编译的Synopsys和IEEE算术包 • 基于std_logic类型 • 已为仿真作了优化加速
映射逻辑库名 • 必须将逻辑库名映射到库的路径上 • 库的路径中所含文件必须已经过编译 • 支持相对路径,绝对路径和软路径名 • 所有不在工作目录中的库都需要这样做 • 使用vmap命令
2 映射逻辑库名 • 语法:vmap <logical_name> <directory_path> • Cmd)在主窗口命令提示符(Modemsim>)下键入: • vmapmy_work c:/my_design/my_lib • UI)选择结构窗口中的库: • 弹出菜单-> Edit 浏览库目录
映射已存在的库(UI) 选择a new library and a logical mapping to it 并键入库名 该命令在当前路径下创建一个库子目录,然后对它进行映射 ->vlib my_lib ->vmap my_lib my_lib
其他与库相关的命令 • 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>
3 编译源代码(VHDL) • UI)Compile -> Compile • Cmd)vcom -work <library_name> <file1>.vhd <file2>.vhd • 文件按列出的顺序编译 • 编译顺序/依赖关系(见下页) • 默认规则为‘87 VHDL • UI)使用Default Options按钮可设置为‘93 • Cmd)使用 –93 选项(必须为第一个参数) • 缺省编译到work库中 • 例:vcom -93 my_design.vhd
VHDL设计单元之间的依赖关系 • Entity要在Architecture之前编译 • Package Declaration要在Package Body之前编译 • 设计单元必须在被引用之前编译 • Packages要在Entity/Architectures使用它们之前编译 • Entities/Configurations要在Architectures引用它们之前编译 • 最后编译Configurations
3 编译源代码(Verilog) • UI)Compile -> Compile • Cmd)vlog -work <library_name> <file1>.v <file2>.v • 文件按列出的顺序编译 • 编译顺序无关紧要 • 支持渐进式编译 • 缺省编译到work库中 • 例:vlog my_design.v
Verilog渐进式编译 • 只编译发生改变的设计单元 • 自动编译或手动编译 • 手动编译更高效 • 自动编译在命令行使用 –incr 选项 • Module和UDP的实例化,以及层次化的引用将在仿真的时候解决 • 有些错误可能不能在编译的时候发现 • 被引用的Modules没有编译 • 错误的端口连接 • 错误的层次化的引用
编译 选中一个或多个文件,然后按 Compile 按钮
出错信息 出错信息出现在主窗口中 双击出错信息,源代码窗口中将高亮显示造成错误的代码 verror 675
4 启动仿真器 • UI)Simulate -> Simulate • Cmd)vsim -lib <library_name> <top_level_design> • VHDL • vsim top_entity top_architecture • 仿真Entity/Architecture对 • 也可以选择一个Configuration • Verilog • vsim top_level1 top_level2 • 仿真多个顶层Modules
启动仿真器(UI) 选择库 选择顶层module或entity/architecture 选择仿真精度
启动仿真器(UI) 指定SDF文件 键入需应用定时信息的设计层次(如果不是顶层设计的话)
vsim命令参数 • 参数 • -t<time_unit> • 指定仿真时间精度 • 单位可以是 {fs, ps, ns, ms, sec, min, hr} • 如果使用了 Verilog中的‘timescale编译指令,仿真将使用所有设计文件中最小的时间精度 • 该参数是可选的 (默认值是ns) • -sdfmin | -sdftyp | -sdfmax <instance>=<sdf_filename> • 标注SDF文件 • 该参数是可选的 • 实例名也是可选的;如果没有指定,SDF将用于顶层设计
5 运行仿真器 • UI)Run • Cmd)run <time_step> <time_units> • 可按指定时间步长运行仿真器
运行仿真器 选择时间步长,然后运行仿真器 Restart -重新装载任何已改变的设计元素,并重置仿真时间为0 Cmd) restart
run命令参数 • 可选参数 • -<timesteps><time_unit> • 指定运行的时间步长 • 单位可以是{fs, ps, ns, ms, sec} • -step • 执行到下一个HDL表达式 • -continue • 在–step或断点之后继续执行余下的仿真 • -all • 运行仿真器,直到不再有事件发生
run命令例子 • run1000 • 从当前位置开始,仿真器运行1000个时间单位 • run 2500 ns • 从当前位置开始,仿真器运行2500ns • run @3000 • 仿真器运行到3000个时间单位的时刻停止