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

来源:本站
导读:目前正在解读《Modelsim时序仿真中遇到的三个问题》的相关信息,《Modelsim时序仿真中遇到的三个问题》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《Modelsim时序仿真中遇到的三个问题》的详细说明。
简介:由于HDL设计中没有采用复位信号,系统的初始化完全依靠FPGA器件上电后各个寄存器的缺省状态,虽然在QuartusII下进行基于波形激励的时序仿真没有问题,但是针对HDL源代码 的功能仿真无法进行。无奈之下只好尝试对布局布线后的网表进行仿真,网表的功能仿真做对了,在尝试时序仿真时却遇到了几个问题。

我很少做时序仿真(记忆中针对8051的IP core做过QuartusII下面的时序仿真,针对Samsung的一款Nand Flash仿真模型做过Modelsim下的时序仿真)。一是因为仿真速度慢;二是因为仿真的对象是布局布线后的门级网表,许多信号都消失不见了。由于其受限的可观察性,针对布局后网表的仿真并不适用于HDL设计的开发和调试阶段;针对HDL源代码的仿真才能提供最佳的可观察性。

时序仿真不好做,但也并不是一无是处,也有其适用的领域——门级时序仿真是最接近FPGA设计在真实器件中运行行为的仿真,是最“真”的仿真——比如在设 计稳定后,不关心系统的内部实现细节,仅需要验证系统对外的功能和接口时序时;比如试图通过时序仿真确认系统的时序特性是否满足要求时。

最近,就遇到了这么一种情况:由于HDL设计中没有采用复位信号(这是个大问题),系统的初始化完全依靠FPGA器件上电后各个寄存器的缺省状态(这应该是可行 的),虽然在QuartusII下进行基于波形激励的时序仿真没有问题(这是不推荐的方法,手工编辑波形很难进行大量的仿真测试),但是针对HDL源代码 的功能仿真无法进行(满屏幕都是红的X,幸好后来找到了一个方法,这是后话)。无奈之下只好尝试对布局布线后的网表进行仿真,网表的功能仿真做对了,在尝试时序仿真时却遇到了几个问题。

问题一:正确的instance层次化名称指定。这一问题,在Modelsim的User's ManualStandard Delay Format (SDF) Timing AnnotationTroubleshootingSpecifying the Wrong Instance下面有详细的讲解和例子。错误地指定SDF文件对应的例化模块的层次化名称,甚至是忘记指定例化模块,是用户最容易犯的错误。抄一个 Modelsim给出的例子在此。

下面的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的仿真工作目录下。

在加载过程中,会看到如下的打印信息:

...    # 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

语句进行的。

加载两次并不是我们的本意。采用vsim命令或者.vo文件中的$sdf_annotate都可以实现延迟参数的载入。不过,由于vsim命令方式支持更 多的配置参数,建议注释掉.vo中的$sdf_annotate语句,按照vsim命令中更具体灵活的参数进行。

在上述的两种加载方式中,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语句的原因。

问题三:采用编译后的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。

针对编译后SDF文件的vsim命令为

vsim -sdfmax /testbench/dut=netlists/myasic_8_1200mv_85c_v_slow.sdf testbench

编译SDF文件不但减小了文件大小,还能显著加快SDF文件的加载速度。

提醒:《Modelsim时序仿真中遇到的三个问题》最后刷新时间 2024-03-14 01:03:28,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《Modelsim时序仿真中遇到的三个问题》该内容的真实性请自行鉴别。