如何使用派生的 class 约束检查 class 随机对象结果
How to check class randomized object result with its derived class constraint
假设我有这两个 classes:
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();
我的问题:有没有更简单的方法利用其派生的class good_packet
的约束来检查结果pkt.cmd
是否属于good_packet
约束的类别?
这比编写冗余代码更好:
if (pkt.cmd == 0 || pkt.cmd == 1 || pkt.cmd == 2) $display("good");
else $display("bad");
您可以将 pkt
的内容复制到类型为 good_packet
的新数据包中,然后检查约束是否成立。
首先,您需要一个可以根据 random_packet
:
的字段更新 good_packet
的字段的函数
class random_packet extends uvm_sequence_item;
// ...
virtual function void update(random_packet source);
this.cmd = source.cmd;
endfunction
endclass
使用此函数,您可以更新之前创建的 good_packet
的字段:
// ... randomization of 'pkt' happened earlier
good_packet g_pkt = new();
g_pkt.update(pkt);
现在 g_pkt
包含与 pkt
相同的值,您可以使用内联约束检查器构造来检查 good_packet
class 中定义的约束是否成立:
if (g_pkt.randomize(null))
$display("good");
else
$display("bad");
对 randomize(null)
的调用实际上不会随机化 g_pkt
中的任何内容(这有点像将每个字段设置为 rand_mode(0)
)。
您可以在 IEEE 1800-2012 standard.
的 18.11.1 内联约束检查器 部分找到有关此构造的更多信息
假设我有这两个 classes:
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();
我的问题:有没有更简单的方法利用其派生的class good_packet
的约束来检查结果pkt.cmd
是否属于good_packet
约束的类别?
这比编写冗余代码更好:
if (pkt.cmd == 0 || pkt.cmd == 1 || pkt.cmd == 2) $display("good");
else $display("bad");
您可以将 pkt
的内容复制到类型为 good_packet
的新数据包中,然后检查约束是否成立。
首先,您需要一个可以根据 random_packet
:
good_packet
的字段的函数
class random_packet extends uvm_sequence_item;
// ...
virtual function void update(random_packet source);
this.cmd = source.cmd;
endfunction
endclass
使用此函数,您可以更新之前创建的 good_packet
的字段:
// ... randomization of 'pkt' happened earlier
good_packet g_pkt = new();
g_pkt.update(pkt);
现在 g_pkt
包含与 pkt
相同的值,您可以使用内联约束检查器构造来检查 good_packet
class 中定义的约束是否成立:
if (g_pkt.randomize(null))
$display("good");
else
$display("bad");
对 randomize(null)
的调用实际上不会随机化 g_pkt
中的任何内容(这有点像将每个字段设置为 rand_mode(0)
)。
您可以在 IEEE 1800-2012 standard.
的 18.11.1 内联约束检查器 部分找到有关此构造的更多信息