原创 Modelsim时序仿真中遇到的三个问题

2009-8-13 09:29 9214 4 9 分类: FPGA/CPLD
    我很少做时序仿真(记忆中针对8051的IP core做过QuartusII下面的时序仿真,针对Samsung的一款Nand Flash仿真模型做过Modelsim下的时序仿真)。一是因为仿真速度慢;二是因为仿真的对象是布局布线后的门级网表,许多信号都消失不见了。由于其受限的可观察性,针对布局后网表的仿真并不适用于HDL设计的开发和调试阶段;针对HDL源代码的仿真才能提供最佳的可观察性。 riple
    时序仿真不好做,但也并不是一无是处,也有其适用的领域——门级时序仿真是最接近FPGA设计在真实器件中运行行为的仿真,是最“真”的仿真——比如在设计稳定后,不关心系统的内部实现细节,仅需要验证系统对外的功能和接口时序时;比如试图通过时序仿真确认系统的时序特性是否满足要求时。 riple
    最近,riple就遇到了这么一种情况:由于HDL设计中没有采用复位信号(这是个大问题),系统的初始化完全依靠FPGA器件上电后各个寄存器的缺省状态(这应该是可行的),虽然在QuartusII下进行基于波形激励的时序仿真没有问题(这是不推荐的方法,手工编辑波形很难进行大量的仿真测试),但是针对HDL源代码的功能仿真无法进行(满屏幕都是红的X,幸好后来找到了一个方法,这是后话)。无奈之下只好尝试对布局布线后的网表进行仿真,网表的功能仿真做对了,在尝试时序仿真时却遇到了几个问题。 riple

    问题一:正确的instance层次化名称指定。这一问题,在Modelsim的User's Manual\Standard Delay Format (SDF) Timing Annotation\Troubleshooting\Specifying the Wrong Instance下面有详细的讲解和例子。错误地指定SDF文件对应的例化模块的层次化名称,甚至是忘记指定例化模块,是用户最容易犯的错误。抄一个Modelsim给出的例子在此。 riple
    下面的Verilog代码给出了仿真顶层的testbench模块与被仿真对象myasic的包含关系 。注意,myasic的例化名称是dut,相应的层次化名称是/testbench/dut。与myasic模块对应的SDF文件是myasic_8_1200mv_85c_v_slow.sdo
     module testbench;
        myasic dut();
     endmodule
如果要对testbench运行Modelsim仿真,并加载myasic.sdf文件到myasic模块中,对应的命令是:
    vsim -sdfmax /testbench/dut=myasic_8_1200mv_85c_v_slow.sdo testbench
如果不指定SDF文件,对应的命令是:
    vsim testbench


    问题二:sdo文件的重复加载和存放位置。在QuartusII中可以指定生成布局布线后的网表及对应的SDF文件。生成的网表文件以.vo或.vho为类型,SDF文件以.sdo为类型。在完成对.vo或.vho文件的编译后,就可以按照上面的例子给出的命令格式启动时序仿真。这里,假设SDF文件保存在Modelsim的仿真工作目录下。 riple
    在加载过程中,会看到如下的打印信息:
    ...
    # Loading instances from myasic_8_1200mv_85c_v_slow.sdo
    # Loading instances from myasic_8_1200mv_85c_v_slow.sdo
    ...
    # Loading timing data from myasic_8_1200mv_85c_v_slow.sdo
    # Loading timing data from myasic_8_1200mv_85c_v_slow.sdo
    ...
    # ** Note: (vsim-3587) SDF Backannotation Successfully Completed.
    #    Time: 0 ps  Iteration: 0  Region: /testbench  File: testbench.v
    在上述过程中,SDF文件被加载了两次。第一次是按照vsim命令指定的参数进行的,第二次是按照.vo文件中的
    // synopsys translate_off
    initial $sdf_annotate("myasic_8_1200mv_85c_v_slow.sdo");
    // synopsys translate_on
语句进行的。 riple
    加载两次并不是我们的本意。采用vsim命令或者.vo文件中的$sdf_annotate都可以实现延迟参数的载入。不过,由于vsim命令方式支持更多的配置参数,建议注释掉.vo中的$sdf_annotate语句,按照vsim命令中更具体灵活的参数进行。 riple
    在上述的两种加载方式中,SDF文件的存放位置都是相对于Modelsim当前工作目录的相对路径。如果把myasic_8_1200mv_85c_v_slow.sdo文件存放在工作目录下的netlists目录中,上述的vsim命令和$sdf_annotate语句就需要修改为:
    vsim -sdfmax /testbench/dut=netlists/myasic_8_1200mv_85c_v_slow.sdo testbench

    // synopsys translate_off
    initial $sdf_annotate("netlists/myasic_8_1200mv_85c_v_slow.sdo");
    // synopsys translate_on
    如果没有注释掉.vo文件中的$sdf_annotate语句,就需要在vsim命令和.vo文件中同步更新SDF文件路径。如果遗忘了修改.vo文件,只修改了vsim命令参数,就会造成$sdf_annotate语句加载失败,产生错误,仿真无法进行下去:
    ...
    # ** Error: (vsim-SDF-3894) myasic_8_1200mv_85c_v_slow.sdo: Compiled SDF file was not found.
    ...
    # ** Error: (vsim-7) Failed to open SDF file "myasic_8_1200mv_85c_v_slow.sdo" in read mode.
    # No such file or directory. (errno = ENOENT)
    # ** Error: (vsim-SDF-3445) Failed to parse SDF file "myasic_8_1200mv_85c_v_slow.sdo".
    #    Time: 0 ps  Iteration: 0  Region: /testbench  File: testbench.v
    这也是我建议注释掉.vo文件中$sdf_annotate语句的原因。 riple

    问题三:采用编译后的SDF文件加快加载速度。Modelsim中提供一个编译SDF文件的命令:
    sdfcom netlists/myasic_8_1200mv_85c_v_slow.sdo netlists/myasic_8_1200mv_85c_v_slow.sdf
    该命令把原始的SDF文件netlists/myasic_8_1200mv_85c_v_slow.sdo编译成了netlists/myasic_8_1200mv_85c_v_slow.sdf,并采用了gzip进行压缩。原有的文件大小为15,100KB,编译和压缩后为2,482KB。 riple
    针对编译后SDF文件的vsim命令为:
    vsim -sdfmax /testbench/dut=netlists/myasic_8_1200mv_85c_v_slow.sdf testbench
    编译SDF文件不但减小了文件大小,还能显著加快SDF文件的加载速度。 riple

相关链接:Perform a timing simulation with the ModelSim software

PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户1576194 2012-9-7 15:33

就sdf的问题,困扰了我好几天,本人新手,看过后才算过关,

ash_riple_768180695 2009-8-26 13:18

我是用Modelsim的force命令赋的初值。感觉就和真实器件上电就有初始值一样的效果。

用户246130 2009-8-26 11:59

关于前面讲到满屏幕都是红的X的问题,如果所有的信号在定义的时候就赋了初值,应该就没有红X了。当然改代码还是比较麻烦。这是我的土办法。 另外,在确实不需要reset的地方,就不要用reset,我还是比较赞成的。

ash_riple_768180695 2009-7-26 09:11

原本是3个,我随便挑了一个。

coyoo 2009-7-24 16:48

为什么“与myasic模块对应的SDF文件是myasic_8_1200mv_85c_v_slow.sdo”,应该会生成3个sdo文件的?
相关推荐阅读
ash_riple_768180695 2015-12-18 11:06
学习示例程序:FPGA快速系统原型设计--敏捷实践
        学习与开发板配套的示例程序,是敏捷实践的起点。示例程序是厂商针对开发板上提供的硬件资源和接口量身定做的工程,可以展示其FPGA芯片的功能和性能特点。从示例程序入手最大的好处就是:示...
ash_riple_768180695 2015-11-03 16:46
开发板选取:FPGA快速系统原型设计--敏捷实践
    既然是“实践”,就不能只谈编码和仿真,必须要上板运行、调试。这个虚拟项目的目标是实现一块兼容Intel82574L以太网控制器的千兆网卡,需要运行在一块具备PCIe接口和10/100/10...
ash_riple_768180695 2015-10-22 12:41
开篇:FPGA快速系统原型设计--敏捷实践
    虽然借用了 “系统原型开发”的标题,本系列文章将围绕FPGA IP级别的开发这个主题展开,如果可能的话,将扩展至FPGA System级别的开发。     先上一篇PPT:RSPwFP...
ash_riple_768180695 2013-08-26 10:21
学习SystemVerilog(二)——学习它的理由
    学习SystemVerilog的理由也很多,我在阅读SystemVerilog for Design 和 SystemVerilog for Verification两本书前言的过程中,总...
ash_riple_768180695 2013-08-26 10:19
学习SystemVerilog(一)——不学习它的理由
    想要学习SystemVerilog已经很久了。曾经尝试通过Accellera网站上给出的LRM学习,怎奈内容众多,找不出入手点和重点,只能望而却步。虽然手头有三本SystemVerilog...
ash_riple_768180695 2011-06-26 23:20
Hardware-Assisted IEEE1588 Implementation Analysis
06/18/11 11:00:05 PM         最近一段时间在研究IEEE1588-2008精确时间同步协议(PTP)。该协议可以在软件中实现,如果需要提高时间同步...
EE直播间
更多
我要评论
5
4
关闭 站长推荐上一条 /3 下一条