用ModelSim作功能仿真(8) 3 编译源代码(Verilog) 支持增量式编译(只有被改动的设计单元被编译) 缺省编译到work库 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 窗口显示 3 编译源代码----错误信息 错误信息在 Main 窗口显示 在信息上双击,引起错误的代码在 Source 窗口被点亮
用ModelSim作功能仿真(11) 4 启动仿真器 UI) Design -> Load New Design 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 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 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 执行仿真----仿真器激励 测试台 force命令 - Verilog 或 VHDL代码 5 执行仿真----仿真器激励 测试台 - Verilog 或 VHDL代码 - 非常复杂的仿真(交互式仿真、数据量大的仿真) force命令 - 简单的模块仿真 - 直接从命令控制台输入 - .DO 文件 (宏文件)
用ModelSim作功能仿真(19) 5 执行仿真----仿真器激励 force命令 测试台(test bench) - 简单的模块仿真 5 执行仿真----仿真器激励 force命令 - 简单的模块仿真 - 直接从命令控制台输入 - .DO 文件 (宏文件) 测试台(test bench) - Verilog 或 VHDL代码 - 非常复杂的仿真(交互式仿真、数据量大的仿真)
用ModelSim作功能仿真(20) 5 执行仿真----仿真器激励 Force命令 5 执行仿真----仿真器激励 Force命令 允许用户给VHDL的信号和Verilog的线网予以激励 常规语法: - force <item_name> <value> <time>, <value> <time> 参数
用ModelSim作功能仿真(21) 5 执行仿真----仿真器激励 Force命令参数 - item_name 5 执行仿真----仿真器激励 Force命令参数 - item_name --被激励的HDL项的名称,是必选的 --必须是一个标量 --可以是一个被编址的阵列, 阵列的一部分 --可以采用通配符(在只有一个匹配的时候) - value --被激励项的值,是必选的 --必须适合该项的数据类型 - time --指定值的时间单位,可选的 --相对于当前的仿真时间,用 @ character指定绝对时间 --时间单位能被指定,缺省值是仿真分辨率
用ModelSim作功能仿真(22) 5 执行仿真----仿真器激励 Force命令参数 5 执行仿真----仿真器激励 Force命令参数 - -r[epeat] <period> --在指定周期重复force命令,是可选的 - -cancel <period> --在指定周期后取消强制force命令,是可选的
用ModelSim作功能仿真(23) 5 执行仿真----仿真器激励 Force命令举例: force clr 0 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文件 自动完成仿真步骤的宏文件 5 执行仿真----仿真器激励 .do文件 自动完成仿真步骤的宏文件 库设置 编译 仿真 强制仿真激励 能在所有的ModelSim 模式里被调用 UI) Macro -> Execute COM) do <filename>.do 能调用其他的DO文件
用ModelSim作功能仿真(25) 5 执行仿真----仿真器激励 .do文件举例 add wave /clk 5 执行仿真----仿真器激励 .do文件举例 stimulus.do add wave /clk add wave /clr add wave /load add wave -hex /data add wave /q force /clk 0 0, 1 50 -repeat 100 force /clr 0 0, 1 100 run 500 force /load 1 0, 0 100 force /data 16#A5 0 run 1000 cd c:\mydir vlib work vcom counter.vhd vsim counter view * add wave /* add list /* do run.do my_sim.do cd c:\mydir vlib work vcom counter.vhd vsim counter view * do stimulus.do
用ModelSim作功能仿真(26) 5 执行仿真----仿真器激励 测试台文件(test bench) 针对复杂的仿真 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) 时序仿真的容易遇到的问题: GSR信号产生的影响(可以通过改变输入信号时延来解决) 以Xilinx公司的为例: GSR信号产生的影响(可以通过改变输入信号时延来解决) D触发器的setup time不足(可以通过分析SDF文件来追究错误所在)
关于modelsim.ini文件 ModelSim使用 ASCII文件, 由用户控制 在ModelSim的安装目录一个缺省文件被提供 存有初始信息 库定位 启动文件的定位 ModelSim其他缺省设定 [Library]:逻辑上的LIBRARY与实际硬盘驱动目录的连接 [vcom]:COMPILE时的一些选项的默认值,0=OFF,1=ON [vsim]:仿真时参数的设定 modelsim.ini缺省为只读属性,故编译库文件时应该将只读属性去掉。
总结 前面讲述了ModelSim的基本使用方法。大家可通过例子来练习使用ModelSim 还有一些较深入的问题,例如: 用VITAL仿真模型支持VHDL 布局布线后仿真;用Tcl 去定制ModelSim图形用户界面;用Tcl 去自动生成测试矢量;用性能分析去减少仿真时间;用测试矢量分析HDL 代码覆盖率;Modelsim5.6以及5.7的新特性;源代码编写中的语言模板和助手;数据流窗口中的信号探察……等等,还有待于进一步的探讨。
谢谢大家!