FPGA flow

FPGA flow下的工具组合有很多。常见的一般是Modelsim + Synplify pro + ISE(Quartus)。

关于烧写前的仿真一般是分为两种,前仿真和后仿真。

摘录一段(from 真OO无双

由於FPGA可重複編程,所以不少開發人員就不寫testbench,直接使用Quartus II的programmer燒進開發板看結果,或者使用Quartus II自帶的Waveform Editor進行仿真,這種方式雖然可行,但僅適用於小project,若project越寫越大,Quartus II光做fitter就很耗時間,一整天下來都在作Quartus II編譯。
比較建議的方式,還是學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.sdf

Generate 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中提到的三种仿真,

RTL simulation Enable Pre-Synthesis
Post-synthesis netlist simulation Enable Post-Synthesis

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

Whether the +notimingcheck option of NC will affect the simulation result? 3Q
~~~~
Of course. If you use +notimingcheck option, when there are setup/hold/timing
happened in your FF, you will not got an "X" (notifier assertion in gate level verilog 
library) and warning messages.
My opinion is you should better use +no_notifier instead, which will report setup/hold 
time violation but will not change your FF's output into "X", which is good for running gate level design having multiple clock domains.
~~~~
for simulaitn on gate-level without SDF file, you should with +notimingcheck.
for post-apr simulaiton with SDF file, you should don't with +notimingcheck,
otherwise the simulation should be non-meaningful.
~~~~
If using notimingcheck, the timing violation would not cause DFF value to 'x', without notimingcheck, the timiing violation would cause DFF to be 'x'

小结:这一帖子也解释了我之前仿真时候的困惑,为什么gtkwave和modelism的仿真结果会不同,原来是因为modelsim会自动考虑timing check的问题,所以在vsim的时候,针对不同的仿真需要做不同的设置。反过来说STX也说明了时序上的问题。

[+notimingchecks] Disable timing checks 

[-sdf{min|typ|max} Apply SDF timing data e.g., <region>=<sdffile>] sdfmin /top=MySDF.txt

[-sdfnowarn] Disable SDF warnings 

原文地址:https://www.cnblogs.com/chenrui/p/2681099.html