連想配列を使ってメモリをモデリング

SystemVerilogでメモリをモデリングする場合は、連想配列を使うとすごく便利。
連想配列を使うとなにが嬉しいかというと、下記のように大きなサイズのメモリを簡単に記述できる。

byte mem[int]; // 配列のインデックスに"int"、"string"等と書くと連想配列になる

initial begin
  mem[32'h00000000] = 8'h11; // 0番地に0x11を書き込む
  mem[32'hfffffffe] = 8'h22; // fffffffe番地に0x22を書き込む

  $display("address=%h, data=%h", 32'h00000000, mem[32'h00000000]);
  $display("address=%h, data=%h", 32'hfffffffe, mem[32'hfffffffe]);
end

・実行結果

# address=00000000, data=11
# address=fffffffe, data=22

もし、同じように2^32ビットのメモリをVerilogで使おうとして、

reg [7:0] mem[0:32'hffffffff];

と記述しても、パソコンのメモリを確保できないために、恐らくエラーが出ると思う。


また、仮にメモリ領域を確保できたとしても、初期化で下記のように書こうものならものすごく時間が掛かるはず。

initial begin
  for(ad=0;ad<32'hffffffff;ad=ad+1)
    mem = 8'h0;
end

この点、SystemVerilogの場合、2値型のbyteやbitを使えば、initial文で初期化しなくても初めから0か1が入っている。
(2値型の初期値がシミュレータ依存なのか言語仕様で決まっているのかは分りません)