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

System verilog 如何使用派生类约束检查类随机化对象结果,system-verilog,uvm,System Verilog,Uvm,假设我有两门课: 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对象,但我只想使用它的约束作

假设我有两门课:

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_数据包对象并将其随机化:

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");

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

首先,您需要一个函数,该函数可以根据
随机\u数据包的字段更新
良好\u数据包的字段

class random_packet extends uvm_sequence_item;
  // ...

  virtual function void update(random_packet source);
    this.cmd = source.cmd;
  endfunction
endclass
使用此功能,您可以更新先前创建的
good_数据包
的字段:

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

good_packet g_pkt = new();
g_pkt.update(pkt);
既然
g_pkt
包含与
pkt
相同的值,您可以使用内联约束检查器构造来检查
good_数据包
类中定义的约束是否有效:

if (g_pkt.randomize(null))
  $display("good");
else
  $display("bad");
调用
randomize(null)
实际上不会随机化
g\u pkt
中的任何内容(这有点像将每个字段设置为
rand\u模式(0)


您可以在的18.11.1节在线约束检查器中找到有关此构造的更多信息。

您可以将
pkt
的内容复制到
good\u packet
类型的新数据包中,然后检查约束是否有效

首先,您需要一个函数,该函数可以根据
随机\u数据包的字段更新
良好\u数据包的字段

class random_packet extends uvm_sequence_item;
  // ...

  virtual function void update(random_packet source);
    this.cmd = source.cmd;
  endfunction
endclass
使用此功能,您可以更新先前创建的
good_数据包
的字段:

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

good_packet g_pkt = new();
g_pkt.update(pkt);
既然
g_pkt
包含与
pkt
相同的值,您可以使用内联约束检查器构造来检查
good_数据包
类中定义的约束是否有效:

if (g_pkt.randomize(null))
  $display("good");
else
  $display("bad");
调用
randomize(null)
实际上不会随机化
g\u pkt
中的任何内容(这有点像将每个字段设置为
rand\u模式(0)


您可以在。

18.11.1在线约束检查器部分找到有关此构造的更多信息。即使我们将约束模式设置为0,调用randomize()是否仍尝试解决约束?@vinethvs我们没有将
约束模式设置为0。我说这就像将
rand\u mode
设置为0。解算器将获取已设置的值,并检查它们是否匹配所有已启用的约束。@Tudor这正是我想要的,谢谢!randomize(null)是强制randomize()方法作为一个检查器。@Tudor抱歉,这是一个输入错误。我理解你所说的约束模式。我想问的是,如果我们将
随机模式设置为0,然后执行
随机(空)
;解算器是否尝试解算约束。不管怎样,我只是试着找出了区别。感谢您的回复。即使我们将约束模式设置为0,调用randomize()是否仍会尝试解决约束?@VineThvs我们没有将
约束模式设置为0。我说这就像将
rand\u mode
设置为0。解算器将获取已设置的值,并检查它们是否匹配所有已启用的约束。@Tudor这正是我想要的,谢谢!randomize(null)是强制randomize()方法作为一个检查器。@Tudor抱歉,这是一个输入错误。我理解你所说的约束模式。我想问的是,如果我们将
随机模式设置为0,然后执行
随机(空)
;解算器是否尝试解算约束。不管怎样,我只是试着找出了区别。谢谢你的回复。