連想配列を使用してスコアボードのストレージ構造をコーディングするのを手伝ってくれませんか。出力トランザクションが順不同になっています。データチェックを実装するより良い方法はありますか?
4 に答える
e
従来の意味での連想配列はありません。ただし、キー付きリストはあります。次に例を示します。
struct array_entry {
key : string;
val : uint;
};
最初に、キー付きリストのエントリがどのように見えるかを定義する必要があります。これを、キーと値のペアを含む構造体としてモデル化します。また、同じキーでインデックス付けされた複数の値フィールドを持つことを妨げるものは何もないことに注意してください。
extend sys {
!assoc_array: list(key: key) of array_entry;
run() is also {
// adding an entry
var s : array_entry = new;
s.key = "foo";
s.val = 0xdead_beef;
assoc_array.add(s);
// check if an entry exists
print assoc_array.key_exists("bar");
// get an entry
if assoc_array.key_exists("foo") {
print assoc_array.key("foo").val using hex;
};
};
};
key
フィールドをキーとして使用して、このタイプのキー付きリストを定義します。これは、要素が位置 (リストに追加される順序) だけでなく、キーによってもインデックス付けできることを意味します。
詳細については、ドキュメントのキー付きリストの章をご覧ください。
ラフル、
得られる結果は正確なようです。リストは a[0] = 0、a[1] = 2、a[2] = 4、...
a.key(4) は、そのキーが「4」であるアイテムを返します (アイテムはもちろん「4」です...)
a.key_index(4) は、値が 4 - 2 (a[2] == 4) であるアイテムのインデックスを返します。
a.key_index(7) は、値が 7 であるアイテムのインデックスを返します。キーが 7 であるアイテムは存在しないため、結果は UNDEF になります。
uvm_scoreboard を確認することをお勧めします。これは、specman/uvm/uvm_lib のオープン ソースです。また、キー リストを使用します。
キーとインデックスを混同しないでください。eのキー付きリストでは、各エントリに両方があります。
でキー付きリストを宣言すると(key: it)
、各エントリのキーが独自の値になることを意味します。などa.key(4) = 4
など。一方、インデックス 4 のエントリが 8 であることは正しいです。つまり、a[4] = 8
またはa.key_index(8) = 4
.
つまり、キー付きリストの各エントリには、通常の (キー付きではない) リストと同様にインデックスがあります。しかし、インデックスとキーはまったく無関係です。( を使用して) リストに新しいエントリをadd()
追加すると、次のインデックスに追加され (キーのないリストと同様)、関連するキーも取得されます。
ありがとう。それが私が探していたものです。この方法でキー付きリストを実装しようとしました:
extend sys {
!a : list (key:it) of uint(bits:4);
run() is also {
var b : uint = 0;
for i from 0 to 10 {
a.add(b);
b = b+2;
};
if a.key_exists(4) {
print a;
print a.key(4);
print a.key_index(4);
print a.key_index(7);
};
};
};
a = (11 items, dec): 4 2 0 14 12 10 8 6 4 2 0 .0
a.key(4) = 4 a.key_index(4) = 2 a.key_index(7) = -1
明らかに、キー 4 の項目は 4 ではなく 8 です。間違っていると思いますか?