您能否请有人帮助我使用关联数组编写记分牌存储结构。输出交易出现故障。还有更好的方法来实施数据检查吗?
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
我们使用字段作为键来定义这种类型的键控列表。这意味着元素可以按位置(它们添加到列表中的顺序)进行索引,也可以通过键进行索引。
查看文档中的键控列表章节以获取更多信息。
Thanks. That's what I was looking for. I tried to implement keyed list this way:
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);
};
};
};
The output I get is:
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
Clearly, the item at key 4 is 8 not 4. Do I understand wrong?
请不要混淆键和索引。在e的键控列表中,每个条目都有。
当你用 声明一个键控列表时(key: it)
,这意味着每个条目的键都是它自己的值。所以, a.key(4) = 4
, 等等。另一方面,您说得对,索引 4 处的条目是 8。这意味着a[4] = 8
or a.key_index(8) = 4
。
换句话说,键控列表中的每个条目仍然有一个索引,就像在常规(非键控)列表中一样。但是索引和它们的键是完全无关的。当您向列表中添加一个新条目时(使用add()
),它会被添加到下一个索引中(就像使用非键列表一样),并且它还会获得相关的键。
拉胡尔,
你得到的结果似乎是准确的。列表是 a[0] = 0, a[1] = 2, a[2] = 4, ...
a.key(4) 返回其key为“4”的item(item为“4”,当然……)
a.key_index(4) 返回值为 4 - 2 (a[2] == 4) 的项目的索引
a.key_index(7) 返回值为 7 的项的索引。由于不存在其键为 7 的项,因此结果为 UNDEF
我建议查看 uvm_scoreboard。它是 specman/uvm/uvm_lib 中的一个开源项目。它还使用密钥列表。