1

假设我有这两个类:

class random_packet extends uvm_sequence_item;
    rand int cmd;
    ...
endclass

及其扩展:

class good_packet extends random_packet;
    constraint good_constr {
    cmd inside {0,1,2};
    }
    ...
endclass

(这里我不打算创建good_packet对象,但我只想使用它的约束作为参考)然后我实例化 random_packet 对象并随机化它:

random_packet pkt;
pkt = random_packet::type_id::create("pkt");
pkt.randomize();

我的问题:有没有更简单的方法利用其派生类good_packet的约束来检查结果是否pkt.cmd属于good_packet约束类别?这比编写冗余代码更好,例如:

if (pkt.cmd == 0 || pkt.cmd == 1 || pkt.cmd == 2) $display("good");
else $display("bad");
4

1 回答 1

6

您可以将 的内容复制pkt到类型的新数据包中good_packet,然后检查约束是否成立。

首先,您需要一个可以根据 a 的字段更新 a 的字段的good_packet函数random_packet

class random_packet extends uvm_sequence_item;
  // ...

  virtual function void update(random_packet source);
    this.cmd = source.cmd;
  endfunction
endclass

使用此函数,您可以更新good_packet之前创建的 a 的字段:

// ... randomization of 'pkt' happened earlier

good_packet g_pkt = new();
g_pkt.update(pkt);

现在它g_pkt包含与 相同的值pkt,您可以使用内联约束检查器构造来检查good_packet类中定义的约束是否成立:

if (g_pkt.randomize(null))
  $display("good");
else
  $display("bad");

调用randomize(null)实际上不会随机化内部的任何内容g_pkt(这有点像将每个字段设置为rand_mode(0))。

您可以在IEEE 1800-2012 标准的第18.11.1 节内嵌约束检查器中找到有关此构造的更多信息。

于 2015-01-21T10:07:48.407 回答