前回システムタスク(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]なら、上式のまま)