覆盖约束

时间:2017-04-21 15:00:03

标签: system-verilog uvm

我在测试平台中覆盖约束时遇到了一些麻烦。 按照我的顺序,我正在做以下事情:

    `uvm_do_with(req, {trans_kind == WRITE ;
                       address == 40'hc0_0000_0000;
                       mask_mismatch_error == 1;
                       bus_error_type == SCB_BUS_ERR_NONE;
                       }) //this line sends the transaction

在我的序列中:

    constraint c_mask_mismatch_error_disable_map8 { (cfg_h.is_map8 == 1) -> (mask_mismatch_error == 0); }

日志文件发出此警告:

  

ncsim:* W,SVRNDF(源位置/行):randomize方法调用   失败。失败的randomize调用的唯一ID是86。

     

观察模拟时间:79492842 PS + 14

     

ncsim:* W,RNDOCS:这些约束有助于这一组   冲突约束:})//此行发送事务   (   (mask_mismatch_error == 0); }(来源位置/行)

     

ncsim:* W,RNDOCS:这些变量导致冲突集   约束:

     

状态变量:cfg_h.is_map8(1)[source location / line]

     

rand变量:mask_mismatch_error [源位置/行]

我不明白为什么这种类型的覆盖是不可能的。我该怎么做才能覆盖序列中的约束?

1 个答案:

答案 0 :(得分:1)

with调用的randomize子句仅用于添加约束;它无法覆盖它们。覆盖约束的正确OOP方法是扩展事务类并在扩展类中声明具有相同名称的约束。

您的另一个选择是使用

关闭约束
req.c_mask_mismatch_error_disable_map8.constraint_mode(0);

如果你这样做,你就不能再使用`umm_do_with宏了,很多人建议不要使用它。