EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2009/7/20 18:01:16

1

关于投票

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

    我很少做时序仿真(记忆中针对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

系统分类: CPLD/FPGA  |  用户分类: Modelsim  |  标签: modelsim sdf  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1059) | 回复(4)

发表于 2008/6/29 10:39:22

1

关于投票

采用Signal Spy增强VHDL的测试能力

    可观测性和可控制性是对testbench的基本要求。与Verilog相比,VHDL语言缺少层次化路径访问的能力;但是在VHDL语言中可以通过全局变量进行entity之间的通讯,这里的全局变量就是在package中定义的signal。在实际应用中,Verilog的层次化路径访问是真正的“无损探测”;VHDL的全局变量更适合用于测试组件之间通信,不适于在DUT组件内部使用(需要在设计中添加测试专用的语句)。 riple

   最初发现Signal Spy这一功能,始于 riple 和“蔡晃悠”大哥的一段讨论。开始使用这一功能还是最近的事。 riple

    Signal Spy给VHDL语言增加了等价于Verilog语言的层次化路径访问能力,再加上VHDL语言的全局变量通信能力,VHDL似乎比Verilog更适合用作HDL测试语言。 riple

    Signal Spy是Modelsim专用的工具,不是VHDL语言内置的特性。添加这一功能对Modelsim来说不是什么难事,因为不论是Verilog,还是VHDL,在Modelsim编译后得到的数据库都是支持层次化路径访问的。 riple

    使用Signal Spy需要: riple

    1. 包含modelsim_lib中的Util Package riple

     library modelsim_lib;
     use modelsim_lib.util.all;

    2. 初始化Signal Spy riple

    init_signal_spy(, , , )

 

    炒一个栗子在此: riple

library ieee;
library modelsim_lib;
use ieee.std_logic_1164.all;
use modelsim_lib.util.all;

entity top is
end;

architecture only of top is
    signal top_sig1 : std_logic;
begin
    ...
    spy_process : process
    begin
        init_signal_spy("/top/uut/inst1/sig1","/top/top_sig1",1,1);
        wait;\
    end process spy_process;
    ...
    spy_enable_disable : process(enable_sig)
    begin
        if (enable_sig = '1') then
            enable_signal_spy("/top/uut/inst1/sig1","/top/top_sig1",0);
        elseif (enable_sig = '0')
            disable_signal_spy("/top/uut/inst1/sig1","/top/top_sig1",0);
        end if;
    end process spy_enable_disable;
    ...
end;

系统分类: CPLD/FPGA  |  用户分类: Modelsim  |  标签: Modelsim VHDL SignalSpy  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(790) | 回复(0)

发表于 2008/6/29 0:11:54

2

关于投票

采用JobSpy控制Modelsim批处理仿真

    JobSpy可以用来管理Modelsim的批处理仿真过程,具体应用如下: riple

  • 1. Checking the progress of a simulation.
  • 2. Examining internal signal values to check if the design is functioning correctly, without stopping the simulation.
  • 3. Suspending one job to release a license for a more important job, also allowing you to restart the suspended job later.
  • 4. Instructing the running batch job to do a checkpoint of the job and then continue the run. If the workstation that was running a batch job were to fail at sometime in the future, you would could restart the job again from the saved checkpoint file.

 

     riple 做了一些实验,发现在Modelsim的手册中一些没有说清楚的要点: riple

1. JobSpy是针对“批处理仿真”的,只有通过vsim -c启动的仿真才能被JobSpy管理。 riple

2. JobSpy需要JOBSPY_DAEMON环境变量才能运行。在Windows下,可以在“我的电脑”属性中配置,也可以在命令行配置。在命令行配置的好处是,另外的命令行窗口只有设置同样的环境变量值,才能访问同一个JobSpy;在另外的命令行中启动的仿真,只有先行设置JOBSPY_DAEMON环境变量才能被具有相同设置的JobSpy访问,这样一来,这个环境变量值成了不同窗口间通讯的密码。 riple

3. 只有在JobSpy启动之后开始的批处理仿真,并且拥有相同的环境变量值,才可以被JobSpy管理,JOBSPY_DAEMON环境变量取值不同的,或者是在JobSpy之前启动的仿真是无法被JobSpy看到的。 riple

 

    Jobspy在WinXP下的操作流程:

1. 运行jobspy_start.bat点击下载

2. 运行batch_sim.bat点击下载

3. 运行jobspy_gui.bat点击下载

4. 在GUI界面控制simulation_jobs的运行

5. 仿真结束后关闭GUI界面,运行jobspy_kill.bat点击下载

 

JobSpy GUI界面:

点击看大图

系统分类: CPLD/FPGA  |  用户分类: Modelsim  |  标签: Modelsim JobSpy 批处理  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(789) | 回复(0)

发表于 2008/6/28 21:48:10

1

关于投票

学习Modelsim的命令(二)

 riple 认为,在自动化的测试流程中,获得仿真结果(可观测性)比向测试平台施加激励(可控制性)更重要。 riple

昨天为了通过Tcl脚本把modelsim仿真过程中的变量值读出来, riple 挨个把modelsim的命令读了一遍。还好,才读到e开头的命令,就找到了examine这条命令。采用这条命令,可以读取modelsim仿真过程中所有object的取值。 riple

examine [-delta <delta>] [-env <path>] [-handle] [-in] [-out] [-inout] [-internal] [-maxlen [0 | <integer>]] [-ports] [-expr <expression>] [-name] [-<radix_type>] [-radix <type>] [-time <time>] [-value] <name>…

最好配合上radix -hexadecimal,可以把所有object变成16进制表示,方便Tcl处理。 riple

此外,find命令也不错,可以用来模糊查找signals。 riple

 

应bigyellow朋友的要求,写个简单的例子在此: riple

proc get_value_formated {{radix hex} {node}} {

    examine -$radix -$node

}

puts [get_value_formated hex  /tb_DUT/DUT/counter_q]

系统分类: CPLD/FPGA  |  用户分类: Modelsim  |  标签: modelsim Tcl  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1407) | 回复(6)

发表于 2008/6/16 22:16:45

1

关于投票

构思中的

仿真调试不能代替硬件调试。

仿真调试可以辅助硬件调试。

典型应用:CPU与FPGA接口的系统调试。

 

1. Trace记录功能。基于SingalTap II的,基于Virtual JTAG的。

2. 测试向量生成功能。基于测试集合的,基于Trace的。

3. 断言功能。检查测试向量输入的,检查测试结果的。

4. 结果自动检查功能。打印信息输出到log文件中,通过外部程序检查测试结果。

 

系统分类: CPLD/FPGA  |  用户分类: Modelsim  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(518) | 回复(0)

发表于 2008/6/15 23:02:33

1

关于投票

学习Modelsim的命令(一)

vsim -c -f xxxx.do

从命令行运行modelsim,执行xxxx.do中的编译、仿真命令。 riple

 

vcom -work work -f file_list.txt

在编译VHDL库文件时,指定一个文件作为编译的补充选项。该文件中可以包含vcom的命令选项,还可以包含一系列的文件路径。在本例中,file_list.txt就包含了所有需要编译到work library中的文件路径。通过file_list.txt,可以使Modelsim与其他EDA工具共享同一组文件列表,有助于实现自动化的测试流程。 riple

 

vcom -work bin_lib -refresh

不通过VHDL源代码,通过已编译的库生成当前版本可用的库。这一命令常用于编译从第三方获得的仿真库。第三方的仿真库通常可以在器件厂商的网站上获得,比如samsung的nand flash芯片。提供仿真库的网站,往往不提供行为级的源代码。由于第三方提供的仿真库可能是采用其他版本的Modelsim编译获得的,必须通过执行改命令,该仿真库才可以被正确加载。 riple

 

transcript file abcde.log

记录命令窗口的打印信息到abcde.log文件中。可以通过echo "xxxx"命令,从命令窗口向log文件中写入记录信息。通过log文件,可以实现仿真结果的记录和自动检查,有助于编写自动化的测试流程。 riple

 

vsim -t 10ps work.xxxx

针对xxxx运行仿真,仿真精度设定为10 ps。这一命令在VHDL仿真中很有用,因为VHDL文件中没有Verilog的`timescale编译指令,只能通过在仿真开始时指定。过小的仿真精度会导致仿真速度变慢,过大的仿真精度会得到不精确甚至不正确的仿真结果。 riple

 

verror 32

打印出编号为32的信息的详细内容。通过该命令,可以查看warning或error的具体信息。其作用相当于在线帮助。执行verror -ranges可以查看Modelsim所有信息的分类和编号。 riple

系统分类: CPLD/FPGA  |  用户分类: Modelsim  |  标签: Modelsim  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(2019) | 回复(2)

发表于 2008/6/7 8:46:04

2

关于投票

Modelsim中,结合使用Project和.do的最佳方法

一定有!

思考中...

系统分类: CPLD/FPGA  |  用户分类: Modelsim  |  标签: Modelsim  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(811) | 回复(0)

发表于 2008/6/7 8:44:12

1

关于投票

Modelsim下如何做代码覆盖率分析

谁能告诉我?

系统分类: CPLD/FPGA  |  用户分类: Modelsim  |  标签: Modelsim 代码覆盖率  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(949) | 回复(0)

发表于 2008/5/31 21:31:48

2

关于投票

Modelsim仿真脚本与批处理运行模式

        附件点击下载是建立Modelsim仿真环境并运行仿真的一组脚本(.do)。 riple

        其中的两个批处理文件(.bat)分别支持从Windows命令行运行全部脚本和从GUI运行全部脚本。 riple

        其中的fmf_models文件夹包含一组从Free Model Foundry下载的仿真模型文件,具体的器件是at93c46。 riple

        该仿真环境没有建立testbench,针对at93c46模型运行的仿真只是一个示例。实际的仿真环境应该是一个例化了at93c46模型和spi主设备模型的testbench。 riple

         riple 给出这组脚本的的目的是为了和大家分享以下几点收获: riple

1. 如何通过.do文件执行Modelsim完整的仿真流程(编译器件专用库、编译第三方模型库、编译用户文件、启动仿真、修改用户文件后重新编译并仿真); riple

2. 如何在Windows命令行启动Modelsim GUI; riple

3. 如何在Windows命令行执行Medelsim批处理仿真; riple

4. 如何在Modelsim中建立Altera器件仿真库; riple

5. 如何在Modelsim中建立FMF器件仿真库。 riple

系统分类: CPLD/FPGA  |  用户分类: Modelsim  |  标签: Modelsim 仿真 批处理  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1314) | 回复(0)

Total , Page /