modelsim常见错误亲自踩坑篇
Modelsim常见错误:
当modelsim单独测试(并不和任何软件一起联调)带有初始化的ROM或RAM时,初始化文件可以是.hex或.mif(两者均支持,并不需要改变modelsim的任何配置)。但是需注意是:(1)初始化文件必须得放在modelsim工程的根目录下,否则会报Error: Failed to open VHDL file “.mif” in rb mode。(2)虽然xilinx的初始文件是.coe文件,但是在modelsim中必须转换为mif文件或hex文件。(3)在建立ROM和RAM时,建立这两个IP的目录和初始化这两个IP的mif、hex、coe文件目录必须一致,否则会报Error: Failed to open VHDL file “.mif” in rb mode。或者修改IP中该文件的初始化位置也是可以的。
VHDL 中SLA(左移)针对的是bit_vector,不能使用std_logic_vector,否则modelsim会报No feasible entries for infix operator “SLA”。对于除法“/”似乎也不能使用否则modelsim会报No feasible entries for infix operator “/“。等号两边的类型得一致否则modelsim会报No feasible entries for infix operator “=”.
当仿真PLL等IP核时,会出现没有BUFG、PLL_ADV等时,需要在run.do中添加“simprims_ver”这个库文件(在spartan6中的原语要使用unisims_ver库文件),并且还要添加glbl文件(该文件在D:\SoftWareInstall\Vivado1604\Vivado\2016.4\data\verilog\src目录下)。
vsim -L D:/SoftWareInstall/ModelSim1002/vivado_164/simprims_ver -voptargs=\"+acc\" -novopt tb glbl
当仿真出现多个文件中最小精度(`timescale)不同时,要将run.do文件中vsim语句中-t后面的时间精度改为所有文件的最小精度。
当设计文件中含有头文件时,用modelsim仿真时需要将该文件放在modelsim工程的目录下。按照自己的习惯,是要仿真sim文件下。
当仿真中含有rom核时,需要将mif文件放在modelsim工程的目录下。当想要修改rom内容时只需修改mif文件即可,不需要再次生成rom核。
“Error :Bad file format for null “这个错误是由于modelsim工程前后运行所使用的版本不一致造成的。解决方法:将上一个版本产生的中间文件删除掉,之后在使用新的版本进行运行就没有这个问题了。
Vivado编译仿真库时,需要选择modelsim的位置,生成出来的vivado仿真库对应于该modelsim的版本,使用其他版本的modelsim可以会报错(“xxxx is not defined”),即使添加了相应的仿真库也会报错。还有就是目前vivado201803版本使用modelsim10.2c不能正确仿真,使用modelsim10.6以后的版本才可以。
运行自动化脚本.bat文件(一般只有vsim –do run.do)时,会出现“不是内部命令”。这是因为在系统变量中的path中缺少modelsim的路径。解决办法是:在path中添加modelsim的路径“D:\SoftwareInstall\Modelsim1007\win64”。之后再次双击.bat文件就可以正常运行了。
在modelsim中将状态机安装字符显示:需要在do文件中添加一下代码
virtual type {{0x0001 IDLE} {0x0002 IDLE1} {0x0004 IDLE2} {0x0008 WR_ctrl_reg_cmd} {0x0010 WR_data_cmd} {0x0020 WR_data_cmd_IDLE} {0x0040 WR_cmd_reg_cmd} {0x0080 RD_reg_cmd} {0x0100 RD_data_cmd} {0x0200 RD_data_cmd_IDLE} {0x0400 WR_ctrl_reg_cmd_IDLE} {0x0800 WR_cmd_reg_cmd_IDLE} {0x1000 Wait_finish_low} {0x2000 Finish}} fsm_type1
virtual function {(fsm_type1)/tb/top_inst/ctrl_inst_2/Ctrl_state} Ctrl_state_2
add wave tb/top_inst/ctrl_inst_2/Ctrl_state_2
其中virtual type中的状态编码和自己代码中的对应起来。Virtual function中Ctrl_state_2是自己定义的名字,这个和add wave中的Ctrl_state_2要一致起来。其中/tb/top_inst/ctrl_inst_2/Ctrl_state是代码例化的顺序。关键的一点是,这几行代码要放在vsim命令的后面。否则modelsim会报错
“# ** Error: parsing expression “” # Null argument refScope”。
未完待续。。。