先说明一下我的文件结构
总共就两个文件夹,rtl里放的是我们设计的源代码,也就是.v文件;
sim里放的有测试文件、bat后缀文件、modelsim脚本文件(也就是下面说的.do文件,下图中是tcl文件)。如下图,我是以一个计数器为例。
总共可归结为三种文件,文件一般包含有do文件,bat文件,以及自己设计的v文件(包括源代码和测试文件等)。
其中的do文件就是 *** 纵modelsim的脚本文件,这个文件的后缀一般都是写成do,实际上也可以是别的字母任意定义(别人是这么说,当然v是不能作为后缀的),我试过sh、b和tcl的后缀,是可行的。以下脚本文件以tcl后缀为例。
而bat文件就是windows系统的脚本文件,内容只有一行代码。
modelsim -do sim.sh//sim.sh就是我们的modelsim脚本文件。
复制
我们只需要在Windows下双击就可以自动打开进行仿真。
作用就是在modelsim下运行sim.sh
v文件不用多说,自然是测试文件以及设计的verilog源代码。
下面开始进行简单的脚本设计(附带注释):
transcript on
if {[file exists dyq_work]} {
vdel -lib dyq_work -all
}
#上面的意思是如果已有dyq_work这个库,就把它全部删了
#新建dyq_work库,这是modelsim必须要做的事,作用就是把自己的源代码编译
#进这个库中。
vlib dyq_work
#将dyq_work映射到work中,因为 *** 作的时候modelsim是默认对work进行的,
#所以如果不这样modelsim就找不到这个库。
vmap work dyq_work
#编译源代码和测试文件,这样写就是默认编译进了dyq_work中了
vlog ../sim/*.v
vlog ../rtl/*.v
#运行仿真下面这个ps是设置仿真器达到的精度为ps,tb_counter是测试文件顶层命名。
vsim -t ps -novopt +notimingchecks work.tb_counter
#vsim -t ps -voptargs="+acc" work.tb_counter
#下面将信号显示调整为十进制无符号形式
radix unsigned
#添加测试文件中包含的reg和wire的所有波形
add wave *
#添加测试文件中例化的模块内部的cnt信号的波形(counter_u1是指在测试文
#件中例化的模块名称,这个要根据自己实际进行修改,比如例化一个pll
# pll pll0(....)
#那么这段就应当改为tb_counter/pll0/*,意思就是把pll0模块的所有引脚拉
#出来看),像这两行代码就是把cnt和ena这两个信号拉出来看。
add wave -position insertpoint sim:/tb_counter/counter_u1/cnt
add wave -position insertpoint sim:/tb_counter/counter_u1/ena
#运行
run -all
复制
写完之后就可以双击bat文件自动打开仿真了。
这里需要注意一下,如果你在10.7以及之后的版本进行的,会有这个报错
** Error (suppressible): (vsim-12110) All optimizations are disabled because the -novopt option is in effect. This will cause your simulation to run very slowly. If you are using this switch to preserve visibility for Debug or PLI features, please see the User’s Manual section on Preserving Object Visibility with vopt. -novopt option is now deprecated and will be removed in future releases.
这是说-novopt在后面的版本不能使用了,这时候就需要将脚本代码sim.sh进行修改一下
把这行代码修改一下
vsim -t ps -novopt +notimingchecks work.tb_counter
复制
修改为下面这样就可以进行仿真了
modelsim输入信号赋值示例:
vlib wormodelsimk //新建work库;
vmap work //将work库映射到当前工作目录下;
vlog counter.v //新建counter.v文件,默认编译到work库下;
vsim -L work work.counter -t 1ns //仿真work库中名为counter模块,最小时间单位为1ns;
add wave -r/ * //将所有信号加入到波形图中去;
force a 16#aa //将a赋值为16进制的AA(10101010);
force b 164bb //将b赋值为16进制的BB(10111011);
force n_rst 1//将n_rst信号置1;
run 40 //运行40(ns),即40个最小单位时间;
force n_rst 0 //将n_rst信号置0;
run 20 //运行40(ns);
force n_rst 1 //将n_rst信号置1;
force a 16#55 //将a赋值为16进制的55(01010101);
force b 16#aa //将b赋值为16进制的AA(10101010);
run 20 //运行20ns;
扩展资料
在Modelsim中,将工作目录切换到counter.v和counter.do两个文件所在目录下,然后在命令行中输入 do counter.do即可。
PS:1,如果在仿真的时候要修改.do文件,需要现在modelsim里运行quit -sim,退出仿真,然后修改.do文件,再保存;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)