仿真时要注意timescale
今天在FPGA中加入模块dcm,用Xilinx的CORE Generator产生模块dcm_loc,然后把相应的vhd文件加入工程中,打算用modelsim仿真一下。没想到在run时竟然会出现错误:
# ** Fatal: (SIGFPE) Floating point exception.
# Time: 0 ns Iteration: 0 Process: /tb_crk_oi2_1v/cr_oi2_knx1v_top_inst/dcm_loc_inst0/dcm_sp_inst/determine_phase_shift File: E:/Xilinx/12.3/ISE_DS/ISE/vhdl/src/unisims/primitive/DCM_SP.vhd
# Fatal error in Process determine_phase_shift at E:/Xilinx/12.3/ISE_DS/ISE/vhdl/src/unisims/primitive/DCM_SP.vhd line 1302
#
# HDL call sequence:
# Stopped at E:/Xilinx/12.3/ISE_DS/ISE/vhdl/src/unisims/primitive/DCM_SP.vhd 1302 Process determine_phase_shift
一时不知道怎么回事。请教公司的高手过来解决,结果他看了半天也不知道怎么回事。然后就把他自己电脑用modelsim6.2i仿真成功的一个模块发给我,但是到我自己的电脑上,modelsim6.5仍然报这个错误。以为是库的原因,把他的库拿过来仿了半天仍然错。。。
仔细检查modelsim给的提示,发现前面有个warning:
** Warning: (vsim-3479) Time unit 'ps' is less than the simulator resolution (1ns).
意思就是模块的时间精度为ps,而仿真器设置的1ns,有可能会有错误。
在verilog中时间精度比较好设置,在文件开头使用
`timescale time_unit /time_precision
就可以实现了。
比如
`timescale 1ns/100ps
意思就是时间延迟单位是1ns,时间精度为100ps。
而在vhdl中就没有相应的设置了。请教了下同事,告知可以在仿真器中设置相应的时间单位。vsim命令下:
将图上相应位置改为ps,则time_unit就被设置为ps。6.5中默认的单位应该是ns,6.2中默认可能是ps,所以在同事的机器上就会不出错,在我这里就会出错了。
命令行下加入-t ps,如:
vsim -t ps work.test
总结:
用modelsim仿真时,时间单位和时间精度还是需要注意的,很多错误可能由于时间单位设置不同而没有仿真到,更有可能仿真出来的结果是错误的,更极端的就像我今天的情况连仿真都无法继续进行。尤其是在verilog语言中,2个module可能是不同的人编写,他们设置的timescale就有可能不同,这种情况下很容易发生错误,而导致不必要的时间浪费,效率降低。而在vhdl中无法设置timescale,这就需要在仿真时写do文件或tcl文件时注意time_unit,为保证正确尽量将时间单位都进行设置。
另外,modelsim中给出的warning也是很重要的,也许你的错误就出现在这里。