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

モノ申す!

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

Verilog(システムタスク編)

2013-09-14 21:49:41 | 日記

◆システムタスク
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、など)で宣言しなければならないらしい。