仿真时要注意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也是很重要的,也许你的错误就出现在这里。

posted @ 2010-11-10 11:05  楼心月  阅读(7105)  评论(2编辑  收藏  举报