zoukankan      html  css  js  c++  java
  • 各种波形文件vcd,vpd,shm,fsdb生成的方法(zz)

    仿真是IC设计不可或缺的重要步骤,仿真后一般需要记录下波形文件,用于做详细分析和研究。说一下几种波形文件WLF(Wave Log File)、VCD(Value Change Dump)文件,fsdb(Fast Signal DataBase)文件、shm、vpd:

    对于WLF波形日志文件,只要我们使用过modelsim,应该都很熟。WLF(Wave Log File) 是Mentor Graphics 公司Modelsim支持的波形文件。但我们在波形窗口观察波形时,仿真结束时都会生成一个*.wlf的文件(默认是vsim.wlf)。我们下次就可以通过通过modelsim直接打开这个保存下来的波形。vsim -view vsim.wlf -do run.do 其中run.do中的内容为要查看的波形信号。要强调的是这个wlf文件只能是由modelsim来生成,也只能通过modelsim来显示。不是一个通用的文件文件格式。

    VCD (Value Change Dump)是一个通用的格式。 VCD文件是IEEE1364标准(Verilog HDL语言标准)中定义的一种ASCII文件。它主要包含了头信息,变量的预定义和变量值的变化信息。正是因为它包含了信号的变化信息,就相当于记录了整个仿真的信息,我们可以用这个文件来再现仿真,也就能够显示波形。因为VCD是 Verilog HDL语言标准的一部分,因此所有的verilog的仿真器都要能够实现这个功能,也要允许用户在verilog代码中通过系统函数来dump VCD文件。我们可以通过Verilog HDL的系统函数$dumpfile 来生成波形,通过$dumpvars的参数来规定我们抽取仿真中某些特定模块和信号的数据。

    特别说明的一点是,正是因为VCD记录了信号的完整变化信息,我们还可以通过VCD文件来估计设计的功耗,而这一点也是其他波形文件所不具备的。Encounter 和 PrimeTime PX (Prime Power)都可以通过输入网表文件,带功耗信息的库文件以及仿真后产生的VCD文件来实现功耗分析。

    因为VCD是Verilog HDL语言标准的一部分,因此所有的verilog的仿真器都要能实现这个功能。因此我们可以在verilog代码中通过系统函数来dumpVCD文件。另外,我们可以通过modelsim 命令来dump VCD文件,这样可以扩展到VHDL中。具体的命令: vcd file myfile.vcd

    vcd add /test/dut/* 这个就生成一个含dut下所有信号的VCD数据信息。

    我们在使用来进行仿真 vsim -vcdstim myfile.com

    test;add wave /*;run -all;

    或在testbench中加入:

    initial

    begin

    $dumpfile("*.vcd");

    $dumpvars(0,**);

    end

     fsdb(Fast Signal DataBase) 是Spring Soft (Novas)公司 Debussy / Verdi 支持的波形文件,一般较小,使用较为广泛,其余仿真工具如ncsim,modlesim等等可以通过加载Verdi 的PLI (一般位于安装目录下的share/pli 目录下) 而直接dump fsdb文件。fsdb文件是verdi使用一种专用的数据格式,类似于VCD,但是它是只提出了仿真过程中信号的有用信息,除去了VCD中信息冗余,就 像对VCD数据进行了一次huffman编码。因此fsdb数据量小,而且会提高仿真速度。我们知道VCD文件使用verilog内置的系统函数来实现 的,fsdb是通过verilog的PLI接口来实现的。$fsdbDumpfile,$fsdbDumpvars等

      Testbench中加入:

      initial

     begin

     $fsdbDumpfile("*.fsdb");

     $fsdbDumpvars(0,**);

     end

     其余波形文件就是各家不同的仿真或调试工具支持的文件类型,互不通用,但基本都可以由VCD文件转换而来(其实就是VCD文件的压缩版,因为只取仿真调试需要的数据,所以文件大小要远小于原始VCD文件),有的还提供与VCD文件的互转换功能。

     shm 是Cadence公司 NC verilog 和Simvision支持的波形文件,实际上 .shm是一个目录,其中包含了.dsn和.trn两个文件。

     vpd 是Synopsys公司 VCS DVE支持的波形文件,可以用$vcdpluson产生。

     通过使用Cadence NC Verilog 对同一testcase和相同dump波形条件的比较,产生shm文件的时间最短(废话,本来就是一个公司的),产生vcd文件的时间数倍于产生shm和 fsdb的时间。在笔者测试的例子中,产生的fsdb文件为十几MB,shm文件为几十MB,而vcd文件则要几个GB的大小。

      ********************************************************************************

     fsdb的一些用法:

     (1)下面是一个列表,提示了fsdb 的各种可能用法,具体的内容大家可以Google 一把,就都出来了。

    fsdbDumplimit - 限制FSDB 文件size 如何使用?

    $fsdbDumpvars([<level>], <scope | signal>*)

    fsdbDumpfile - 指定FSDB 文件名

    $fsdbDumpfile(“<FSDB name>”)

    fsdbDumpvars - Dump 指定的变量

    fsdbDumpSingle - Dump 指定的信号

    fsdbDumpvariable - Dump 指定的VHDL 变量

    fsdbSwitchDumpFile - 将dumping 切换到另一个FSDB 文件

    $fsdbSwitchDumpFile(“<new FSDB name>”)

    fsdbAutoSwitchDumpfile - 限制文件大小并在数据量过大时自动创建新的FSDB 文件

    $fsdbAutoSwitchDumpfile(<file size>, “<FSDB name>”,< number of file>)

    fsdbDumpflush - Force to Dump Result to FSDB file

    fsdbDumpMem - Dump 指定的memory 的内容

    $fsdbDumpMem(<reg name>, [<start addr>, [<size>]])

    $fsdbDumpon - 打开 FSDB dumping

    $fsdbDumpoff - 关闭 FSDB dumping

    (1)一个自由开关FSDB 的方法

    有时候要运行很长时间的仿真,但是关心的波形却只是其中一小段。这个时候怎么来开关波形,使文件不至于太过庞大呢?这里介绍一个方法。示例仅供参考,大家可以结合实际应用创造出更加多样的变化来。

     initial begin

    $timeformat(...);

    $fsdbAutoSwitchDumpfile(...);

    $fsdbDumpvars(...);

    // 条件表达式1

    $fsdbDumpoff;

    // 条件表达式2

    $fsdbDumpon;

    End

    ( 2 )、我们比较常用的一般还有$value$plusargs 这个task,在test_top 中:

    $value$plusargs("casename=%s",casename)

    通过脚本在run 的时候把casename 传递进去(给vcs/nc SIM_ARG: +casename=$Testcase_name.fsdb)

    便于如果同时跑多个testcase 的时候可以同时dumpfsdb,另外就是跳过一些时间开始

    dump(SIM_ARG: +time=$start_time)

    $value$plusargs("time=%d",skip)

    #skip

    (3)、project 中每个人关注的module 不同,为了频繁去修改test_top 的dump,一般也会把需要dump 的内容用dumplist

    的file 来实现

    $fsdbDumpvarsToFile("dump.list");

    比如dump.list 内容 #用于注释)

    0 test_top

    #1 test_top

    #0 test_top.dut

    #0 test_top.dut.m1

    #0 test_top.dut.m2

    用的时候一般是在test_top.v 添加相关的语句:

    reg [100:0] casename;

    integer skip, i;

    initial begin

    if( $test$plusargs("dumpfsdb") ) begin

    if( $value$plusargs("time=%d", skip) )

    #skip;

    if( $value$plusargs ("casename=%s",casename) )

    $fsdbAutoSwitchDumpfile(300, casename, 30);

    else

    $fsdbAutoSwitchDumpfile(300,"./test_top.fsdb",40);

    $fsdbDumpvarsToFile("dump.list");

    end

    end

     跑仿真的时候,对应的如果要从5000ns(时间单位根timescale 有关)处开始dump 波形,给vcs/nc 的参数

    +dumpfsdb +time= 5000 +casename= testcase1.fsdb

    其中的testcase1 一般我们都会在脚本处理后跟case 名字关联起来,这样子跑完之后就会从5000 开始dump

    testcase1_000.fsdb, testcase1_001.fsdb 这样子,

    2. 另外那个dump.list(名字可以随便取)里面的设定就跟平常的设定dump 的层次设置一样了

    层次 路径名

    0 test_top.dut.m1

    例子:

    //=================

    // dump FSDB wave

    interger start_dump;

    integer stop_dump;

    integer finish_time;

    integer result;

    reg [8*30*-1 : 0] waveform_name;

    initial begin:fsdb_dump

    start_dump = 0;

    finish_time = 0;

    waveform_name = "debussy.fsdb";

    if ($test$plusargs("FSDB"))

        begin

          if($test$plusargs("DUMP_FILE"))

             result = $value$plusargs("DUMP_FILE=%s",waveform_name);

             $fsdbAutoSwitchDumpfile(150,waveform_name,100);

             $fsdbDumpflush;

             #start_dump;

    //select dump signals

    $fsdbDumpvars(0,xx_tb);

        end

    end

  • 相关阅读:
    HDOJ 2095 find your present (2)
    HDOJ 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你
    九度 1337 寻找最长合法括号序列
    九度 1357 疯狂地Jobdu序列
    HDOJ 1280 前m大的数
    九度 1343 城际公路网
    九度 1347 孤岛连通工程
    HDOJ 2151 Worm
    九度 1342 寻找最长合法括号序列II
    九度 1346 会员积分排序
  • 原文地址:https://www.cnblogs.com/zeushuang/p/2769640.html
Copyright © 2011-2022 走看看