◆システムタスク
SIM実行時に、メモリへの値を設定することや、データをファイルへ掃き出すことが必要となるケースがある。
そこで、これらを実行できる記述を紹介する。
①$readmemb / $readmemh
TXTファイルにデータを予め記述しておき、SIM実行時にメモリへデータを書き込むことができるシステムタスク
②$writememb / $writememh
SIM実行時にメモリからデータをTXTファイルに掃き出すことができるシステムタスク
<記述例>
//-------------------------------------------------------------------------------
//== 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;
//== ファイルからメモリへのデータ書き込み ==//
$readmemh("ファイル名", mem, start_adr, fin_adr);
//== メモリからファイルへのデータ掃出し ==//
$writememh("ファイル名", mem, start_adr, fin_adr);
//-------------------------------------------------------------------------------
<注意点>
・この例では、ファイルのフォーマットはヘキサの場合であり、ファイルフォーマットがバイナリの場合は、$readmemb,$writemembにする。
・これらのタスクでは、start_adrとfin_adrを記述しない場合、fin_adrを記述しない場合がある。
・ファイル中には、"@"でアドレスを記述しておくことも可能である。
例) 以下ファイルの中身(フォーマット:ヘキサ) : アドレスは上から0番地、1番地、2番地、…とした場合。
@0
0000_ffff
@1
1111_eeee
@2
2222_dddd
:
<System Verilog のbyte型で宣言されたメモリからデータを掃き出す場合>
・$writememすると、ファイル掃出し時にデータをデータの間に"@"の行が挿入されることがある。
・byte型は、ASCII文字を含むため、ファイル掃出し時に"@"が付くらしい。
・"@"行をを取り除きたい場合は、掃き出したファイルを再度$readmemしてから$writememするとよい。
・$readmemするときに代入する配列の宣言は、ASCII文字を含まない型(reg、など)で宣言しなければならないらしい。