2010年12月30日星期四

dump_wave.sv

`ifndef FSDB_DUMP_TOP
`define FSDB_DUMP_TOP dump_top
`endif
`timescale 1ns/1ps
module dump_wave;
integer  fsdbdumpstart, fsdbdumpend, fsdb_size;
integer  vpd_dump_level, vpddumpstart, vpddumpend;
reg      fsdb_en, vcd_en, vpd_en;
integer  fsdb_dump_level;
reg[8*100-1:0]   fsdb_no_dump, fsdbfile, dump_top, vpdfile;
integer  plusargs_status;
/// vcd config
integer  vcddumpstart, vcddumpend;
reg[8*100-1:0]   vcdfile;
initial begin
  // print time format as timeunit in ns
  $timeformat(-9, 0, " ns", 20);
  /// fsdb
  `ifndef DUMP_WAVE_DISABLE
  fsdb_en       = 1'b0;
  fsdbdumpstart = 0;
  fsdbdumpend   = 0;
  fsdb_size     = 0;
  fsdbfile      = "wave.fsdb";
  dump_top      = "";
  fsdb_dump_level = 0;
  fsdb_no_dump  = "";
  /// vpd
  vpd_en         = 1'b0;
  vpddumpstart   = 0;
  vpddumpend     = 0;
  vpdfile        = "wave.vpd";
  vpd_dump_level = 0;
  /// vcd
  vcd_en       = 1'b0;
  vcdfile      = "wave.vcd";
  vcddumpstart = 0;
  vcddumpend   = 0;
  ////// wave for fsdb format
  if ($test$plusargs("fsdb")) begin
    fsdb_en = 1'b1;
    plusargs_status = $value$plusargs("fsdb=%d",fsdbdumpstart);
    if($test$plusargs("fsdboff")) plusargs_status = $value$plusargs("fsdboff=%d",fsdbdumpend);
    if($test$plusargs("fsdbfile")) plusargs_status = $value$plusargs("fsdbfile=%s",fsdbfile);
    if($test$plusargs("fsdblevel")) plusargs_status = $value$plusargs("fsdblevel=%d",fsdb_dump_level);
    if($test$plusargs("fsdbsize")) plusargs_status = $value$plusargs("fsdblimit=%d",fsdb_size);
    if($test$plusargs("fsdbnodump")) plusargs_status = $value$plusargs("fsdbsupress=%s",fsdb_no_dump);
    if($test$plusargs("fsdbtop")) plusargs_status = $value$plusargs("fsdbtop=%s",dump_top);
  end
  ////// wave for vcd format
  else if ($test$plusargs("vcd")) begin
    vcd_en = 1'b1;
    plusargs_status = $value$plusargs("vcd=%d",vcddumpstart);
    if($test$plusargs("vcdoff")) plusargs_status = $value$plusargs("vcdoff=%d",vcddumpend);
    if($test$plusargs("vcdfile")) plusargs_status = $value$plusargs("vcdfile=%s",vcdfile);
  end
  ////// wave for vpd format
  else if ($test$plusargs("vpd")) begin
    vpd_en = 1'b1;
    plusargs_status = $value$plusargs("vpd=%d",vpddumpstart);
    if($test$plusargs("vpdoff")) plusargs_status = $value$plusargs("vpdoff=%d",vpddumpend);
    if($test$plusargs("vpdfile")) plusargs_status = $value$plusargs("vpdfile=%s", vpdfile);
  end
  ////// dump wave
  ////// dump wave for fsdb format
  if (fsdb_en) begin
    #(fsdbdumpstart);
    /// $fsdbDumplimit
    if (fsdb_size > 0) begin
      if (fsdb_size < 10 || fsdb_size > 1843) begin
$display("Error: The file size you can set for $fsdbDumplimit should be more than 10MB and less than 1.8GB");
      end
      else begin
$fsdbDumplimit(fsdb_size);
      end
    end
    $fsdbDumpfile(fsdbfile);
    /// fsdbSuppress
    if (fsdb_no_dump != "") begin
      $fsdbSuppress(fsdb_no_dump);
    end
    $fsdbDumpon();
    /// fsdbDumpvars
    if (dump_top != "") begin
        $fsdbDumpvars("level=", fsdb_dump_level, `FSDB_DUMP_TOP);
    end
    else if (fsdb_dump_level > 0) begin
      $fsdbDumpvars("level=", fsdb_dump_level);
    end
    else begin
      $fsdbDumpvars();
      //$fsdbDumpvars("+all");  // add "+all" to dump dynamic array and memory.
    end
    if(fsdbdumpend > 0) begin
      #(fsdbdumpend);
      $fsdbDumpoff();
    end
  end
  ////// dump wave for vcd format
  else if(vcd_en) begin
    #(vcddumpstart);
    $dumpfile(vcdfile);
    $dumpon;
    $dumpvars;
    if(vcddumpend > 0) begin
      #(vcddumpend);
      $dumpoff;
    end
  end
  ////// dump wave for vpd format
  else if (vpd_en) begin
    #(vpddumpstart);
    //$vcdplusfile(vpdfile);
    $vcdpluson;
    if(vpddumpend > 0) begin
      #(vpddumpend);
      $vcdplusoff;
    end
  end
`endif
end
endmodule

*enable wave dump by adding "-fsdb" at compile time and setting DEBUSSY_HOME correctly.

没有评论:

发表评论