如何使用派生类约束检查类随机对象结果

Ald*_*doT 1 system-verilog uvm

假设我有这两个类:

class random_packet extends uvm_sequence_item;
    rand int cmd;
    ...
endclass
Run Code Online (Sandbox Code Playgroud)

及其扩展:

class good_packet extends random_packet;
    constraint good_constr {
    cmd inside {0,1,2};
    }
    ...
endclass
Run Code Online (Sandbox Code Playgroud)

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

random_packet pkt;
pkt = random_packet::type_id::create("pkt");
pkt.randomize();
Run Code Online (Sandbox Code Playgroud)

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

if (pkt.cmd == 0 || pkt.cmd == 1 || pkt.cmd == 2) $display("good");
else $display("bad");
Run Code Online (Sandbox Code Playgroud)

Tud*_*imi 6

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

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

class random_packet extends uvm_sequence_item;
  // ...

  virtual function void update(random_packet source);
    this.cmd = source.cmd;
  endfunction
endclass
Run Code Online (Sandbox Code Playgroud)

使用此功能,您可以更新good_packet先前创建的字段:

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

good_packet g_pkt = new();
g_pkt.update(pkt);
Run Code Online (Sandbox Code Playgroud)

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

if (g_pkt.randomize(null))
  $display("good");
else
  $display("bad");
Run Code Online (Sandbox Code Playgroud)

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

你可以找到在这个结构中的部分更多信息18.11.1在在线约束检查中的IEEE标准1800年至2012年.

  • @VineethVS我们没有将`constraint_mode`设置为0.我说它就像把`rand_mode`设置为0.解算器将获取已经设置的值并检查它们是否匹配**所有**的启用约束. (2认同)