请问有人帮助我使用关联数组编写记分板存储结构。输出事务无序。还有更好的方法来实施数据检查吗?
答案 0 :(得分:1)
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
字段作为键来定义此类型的键控列表。这意味着元素可以按位置(它们添加到列表中的顺序)进行索引,也可以按键进行索引。
有关详细信息,请查看文档中的键控列表章节。
答案 1 :(得分:0)
感谢。那就是我在寻找的东西。我尝试用这种方式实现键控列表:
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项,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的项目是8而不是4.我明白了吗?
答案 2 :(得分:0)
的Rahul,
您获得的结果似乎是准确的。 列表是[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中的一个开源。它还使用密钥列表。
答案 3 :(得分:0)
请不要在密钥和索引之间混淆。在 e 的键控列表中,每个条目都有。
当您使用(key: it)
声明键控列表时,表示每个条目的键都是其自己的值。所以,a.key(4) = 4
等等。
另一方面,你是正确的,索引4的条目是8.这意味着a[4] = 8
或a.key_index(8) = 4
。
换句话说,键控列表中的每个条目仍然具有索引,就像在常规(非键控)列表中一样。但索引与它们的关键是完全无关的。当您向列表中添加新条目时(使用add()
),它会添加到下一个索引(就像使用非键控列表一样),并且也获取相关密钥。