zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    Linux设备驱动程序学习(17)-USB 驱动程序(二)
    Linux设备驱动程序学习(11)中断处理
    Linux设备驱动程序学习(8)分配内存
    Linux设备驱动程序学习(12) Linux设备模型(底层原理简介)
    Linux设备驱动程序学习(9)与硬件通信
    Linux设备驱动程序学习(16)-USB 驱动程序(一)
    Linux设备驱动程序学习(7)内核的数据类型
    Linux设备驱动程序学习(4) 高级字符驱动程序操作[(1)ioctl and llseek]
    Linux设备驱动程序学习(14) Linux设备模型(各环节的整合)
    Linux设备驱动程序学习(6) 高级字符驱动程序操作[(3)设备文件的访问控制]
  • 原文地址:https://www.cnblogs.com/chenrui/p/2681099.html
Copyright © 2011-2022 走看看