0

您能否请有人帮助我使用关联数组编写记分牌存储结构。输出交易出现故障。还有更好的方法来实施数据检查吗?

4

4 回答 4

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我们使用字段作为键来定义这种类型的键控列表。这意味着元素可以按位置(它们添加到列表中的顺序)进行索引,也可以通过键进行索引。

查看文档中的键控列表章节以获取更多信息。

于 2014-11-11T11:15:36.307 回答
0

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?

于 2014-11-12T05:18:34.710 回答
0

请不要混淆键和索引。在e的键控列表中,每个条目都有。

当你用 声明一个键控列表时(key: it),这意味着每个条目的键都是它自己的值。所以, a.key(4) = 4, 等等。另一方面,您说得对,索引 4 处的条目是 8。这意味着a[4] = 8or a.key_index(8) = 4

换句话说,键控列表中的每个条目仍然有一个索引,就像在常规(非键控)列表中一样。但是索引和它们的键是完全无关的。当您向列表中添加一个新条目时(使用add()),它会被添加到下一个索引中(就像使用非键列表一样),并且它还会获得相关的键。

于 2014-11-12T07:24:36.077 回答
0

拉胡尔,

你得到的结果似乎是准确的。列表是 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 中的一个开源项目。它还使用密钥列表。

于 2014-11-12T07:18:27.740 回答