FPGA flow下的工具组合有很多。常见的一般是Modelsim + Synplify pro + ISE(Quartus)。
关于烧写前的仿真一般是分为两种,前仿真和后仿真。
摘录一段(from 真OO无双)
比較建議的方式,還是學ASIC那招:『寫testbench先對每個module作前仿真,再對每個module作後仿真,最後再燒入FPGA測試。』
這種方式的優點是:
1.testbench比waveform editor可更靈活的描述電路規格。
2.testbench可使用Verilog的系統函數,如$display()、$fwrite()...等。
但要使用testbench作仿真,單獨Qaurtus II並無法做到,就得使用ModelSim了,這又牽涉到『前仿真』與『後仿真』。
所謂的『前仿真』,就是Quartus II的Functional Simulation,不考慮電路的門延遲與線延遲,重點在觀察電路在理想環境下的行為與設計構想是否一致[1]。由於沒經過fitter階段,所以模擬速度很快。前仿真結果正確,並不表示將來結果結果正確,但若前仿真結果不正確,則將來結果一定不正確。
所謂的『後仿真』,就是Quartus II的Timing Simulation,考慮了電路的門延遲與線延遲,由於經過fitter階段,所以模擬結果最為精準。但fitter在Quartus II編譯需耗費很多時間,所以建議『前仿真』正確後,再考慮『後仿真』。
使用Quartus II的waveform editor作前仿真與後仿真,我就不再多談,本文主要是談如何使用ModelSim-Altera作前仿與後仿。
ISE flow的步骤分为三步:
1. 首先是预编译xilinx fpga的三个库:Unisim, Simprim, Xilinxcorelib.
Unisim, 用于布局布线后的仿真
Simprim, 如果要做综合后的仿真,还要编译这个库
Xilinxcorelib, 如果设计中调用了CoreGen产生的核,则还需要编译这个库
编译库的命令:(将三个库编译到制定的路径)
vlog -work simprim_ver d:/Xilinx/verilog/src/simprims/*.v
vlog -work simprim_ver d:/Xilinx/verilog/src/unisims/*.v
vlog -work simprim_ver d:/Xilinx/verilog/src/XilinxCoreLib/*.v
修改 modelsim.ini
simprim_ver=G:/EDA/Xilinx/simprim_ver(库的路径,以下同)
unisim_ver=G:/EDA/Xilinx/unisim_ver
xilinxcorelib_ver=G:/EDA/Xilinx/xilinxcorelib_ve
2. 生成所需要的文件
这步比较简单,就是常规性地跑Synplify pro + Xilinx ISE的流程,其中需要强调的是生成的几个文件
Generate Post-Translate Simulation Model xx_translate.v
Generate Post-Map Simulation Model xxx_map.v,xxx_map.sdfGenerate Post-P&R Simulation Model xxx_timsim.v,xxx_timsim.sdf
这些文件都在project_dir/netgen下面的各个文件夹中,表示的也是implementation的三步,map, par, translate。
三个文件夹中各还有个叫xx.nlf的文件,全称netgen log file。
3. 导入到modelsim进行后仿
网上的资料(如《modelsim+xilinx库和前仿后仿》,《Xilinx和ModelSim仿真(前仿真 和后仿真)》)在讨论后仿的时候都是用PAR来解决问题。
具体的流程:
a. 将netgen文件夹拷到,mpf(modelsim project file)所在的文件夹下面,必须是整个一起,否则会出现下面的错误
# ** Error: (vsim-SDF-3445) Failed to parse SDF file "netgen/par/multiplier_timesim.sdf".
--initial $sdf_annotate("netgen/par/mips_16_core_top_timesim.sdf"); 这就是错误的来源,路径已经在ISE进行PR的时候就做了设定。
b. 在modelsim GUI下面的project tab区,右击加入simulation config,然后进行post-layout sim的配置
选定work中编译过的models(work.glbl work.test) (其中glbl是必选的,否则会有uniquify的问题),
libraries区中加入三个编译过的libraries,
SDF的设置可有可无。命令参见modelsim的cheatsheet。需要指出的是通过这里的sdf设置也可以看出,只能是一个一corner进行仿真,typical, min, max。
c. 然后就是execute这个config file
并在waveform viewer panel中加入待观察的信号(这里也就解决了前面sdf 设置region的问题),进行仿真
命令 add wave sim:/test/*
注:这里还可以补充的是编译顺序对work lib中同名model的影响,比方说你先编译xx_translate.v,后编译xx_timesim.v得到的TOP和glbl会来自xx_timesim.v,当然如果你打开project tab也可以在path column下面看到源文件的路径。
~~~~~
但就如“真无双”所说,很多人都不写tb,直接烧写来调试。所以这里的PAR也只能算是进了一步。严格地照ASIC流程来说,一步一步地从behavior到RTL到GATE(综合后)最后到P&R的GATE。每一步的仿真难度都是在不断的增加的。
就如Synplify pro UG中提到的三种仿真,
Post-P&R netlist simulation Enable Post P&R
大家一般都将post-synthesis netlist sim给省略掉了。当然,其中的步骤也还很多,包括用Encounter EC或者Formality来做formal verification。
还有在P&R之后生成PT netlist做STA 验证。
使用ISE自带的xPower来做power验证。
在这里用signoff可能不大恰当,因为signoff 包括power, timing, physical 毕竟还是属于AISC flow里面的。
=======
关于STX的小问题, ref
小结:这一帖子也解释了我之前仿真时候的困惑,为什么gtkwave和modelism的仿真结果会不同,原来是因为modelsim会自动考虑timing check的问题,所以在vsim的时候,针对不同的仿真需要做不同的设置。反过来说STX也说明了时序上的问题。
[+notimingchecks] Disable timing checks
[-sdfnowarn] Disable SDF warnings