goo blog サービス終了のお知らせ 

モノ申す!

いろいろ突っ込むぜ。
パンドラの箱だって開けちゃうぜ。

Verilog(前回の続き編)

2013-09-21 10:47:47 | 日記

前回システムタスク(writememhやreadmemh)を用いた、①TXTファイルからメモリへのロード、②メモリからTXTファイルへの掃き出しの記述を紹介した。
しかし、これらはシステムタスクを使用せずにも実現可能であるらしい。
今回はその記述方法について、紹介したいと思う。
同時に前回紹介した記述と比較し、どちらがよいか判断してもらいたい。

//-------------------------------------------------------------------------------
// 前回の記述
//-------------------------------------------------------------------------------
  $readmemh("ファイル名", mem, start_adr, fin_adr);
  $writememh("ファイル名", mem, start_adr, fin_adr);
//-------------------------------------------------------------------------------

//-------------------------------------------------------------------------------
// 今回の記述
//-------------------------------------------------------------------------------
//==  INTEGER宣言  ==//
  integer i    ;
  integer fp_1 ;
  integer fp_2 ;
  integer fp_3 ;
  integer fp_4 ;

//==  REG宣言  ==//
  reg [31:0] mem [0:15];  // メモリ(32bit)の配列(計:16個)
  reg [31:0] start_adr ;  // 開始アドレス
  reg [31:0] fin_adr    ;  // 終了アドレス

//==  アドレス設定 ==//
  strat_adr = 32'h0000_0000;
  fin_adr    = 32'h0000_0000;

// ①TXTファイルからメモリへのロードの記述

// ②メモリからTXTファイルへの掃き出しの記述
  initial begin
    fp_1 = $fopen("ファイル名");
    fp_2 = $fopen("ファイル名");
    fp_3 = $fopen("ファイル名");
    fp_4 = $fopen("ファイル名");
    
    for(i=start_adr; i<fin_adr; i=i+1)           // 書き込み条件
      $fdisplay (fp_1, "%h",  mem[i][31:0]);  // 改行する
      $fwrite    (fp_2, "%h",  mem[i][31:0]);  // 改行しない
      $fmonitor(fp_3, "%h",  mem[i][31:0]);  // 信号の変化があった時
      $fstrobe  (fp_4, "%h",  mem[i][31:0]);  // 全てのイベントが終了後
    end
  end

//-------------------------------------------------------------------------------


  fp_1~fp_4のファイル名は、異なる任意の名前とすること。
  (同一ファイル名の場合は、後に実行される$*で掃き出される値が入る?)
 
  start_adrからの指定サイズ(dat_size)がある場合は、fin_adrを算出すること。
  fin_adr = start_adr + dat_size;
  但し、ビット幅を考慮すること。(dat_size[31:0]なら、上式のまま)