04. 連想配列

> 記述例(メモリ)

☆連想配列(Associative array)

連想配列(以降aa)は、通常の配列とは配列番号の指定方法が異なります。通常の配列は、配列番号を数値で指定しますが、aaでは指定した型で指定します。よく使われるケースとしては、メモリモデルをコーディングするときなどに使います。

例えば16bitアドレス空間を定義したいとします。静的配列でこの空間を定義すると、大きなメモリ領域を必要とします。aaでは、使用された(書きこまれた)番地の分だけメモリ領域を確保するだけなので、シミュレーションで実際に書き込んだ分だけメモリ領域を使用します。

  • 定義:
  • data_type $array_name[index_type];
  • 連想配列のエントリー数を取得します
    • $array_name.num();
  • 連想配列を消去します
    • $array_name.delete();
  • キー検索し、存在すると1が返ります
    • $array_name.exists(key); // keyは検索したいアイテム
  • キー検索し、最初にヒットしたキーを返します
    • $array_name.first(key); // keyはref 属性。返り値は0(array is empty) or 1
  • キー検索し、最後にヒットしたキーをref で返します
    • $array_name.last(key); // keyはref 属性。返り値は0(array is empty) or 1
  • 指定したkeyに対して、次のキーをref で返します
    • $array_name.next(key); // keyはref 属性。返り値は次があれば1、なければ0
  • 指定したkeyに対して、前のキーをref で返します
    • $array_name.prev(key); // keyはref 属性。返り値は前があれば1、なければ0

以下の例では、32bitメモリ空間とメモリ書き込み関数を定義しています。

queueとaaの簡単な複合例となります。1つの番地にbyteデータを格納するため、

data_typeはbyte、アドレスは32bit unsigned型なので、int unsignedを指定しています。

--- test.sv ---module test; byte memory[int unsigned]; int unsigned mem_access_q[$]; function void mem_write(int unsigned addr, byte data); memory[addr] = data; endfunction initial begin for(int unsigned i=0; i<16; i++)begin mem_write(32'h0000_0000 + 4*i, i); mem_access_q.push_back(32'h0000_0000 + 4*i); end for(int unsigned i=0; i<mem_access_q.size(); i++)begin $display("memory[%08xh] = %02xh", mem_access_q[i], memory[mem_access_q[i]]); end endendmodule

--- 実行例 ---

# memory[00000000h] = 00h# memory[00000004h] = 01h# memory[00000008h] = 02h# memory[0000000ch] = 03h# memory[00000010h] = 04h# memory[00000014h] = 05h# memory[00000018h] = 06h# memory[0000001ch] = 07h# memory[00000020h] = 08h# memory[00000024h] = 09h# memory[00000028h] = 0ah# memory[0000002ch] = 0bh# memory[00000030h] = 0ch# memory[00000034h] = 0dh# memory[00000038h] = 0eh# memory[0000003ch] = 0fh