System verilog 覆盖约束

System verilog 覆盖约束,system-verilog,uvm,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;

我在覆盖测试台中的约束时遇到了一些问题。 按照我的顺序,我将执行以下操作:

    `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(源位置/行):随机化方法调用 失败。失败的随机调用的唯一id为86

观测模拟时间:79492842 PS+14

ncsim:*W,RNDOCS:这些约束构成了 冲突约束:})//此行发送事务 ( (掩码不匹配错误==0);}(源位置/行)

ncsim:*W,RNDOCS:这些变量构成了一组冲突的 限制条件:

状态变量:cfg_h.is_map8(1)[源位置/行]

随机变量:掩码不匹配错误[源位置/行]


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

调用
随机化
with
子句只用于添加约束;它不能覆盖约束。覆盖约束的正确OOP方法是扩展事务类和在扩展类中声明具有相同名称的约束

另一个选项是使用禁用约束

req.c_mask_mismatch_error_disable_map8.constraint_mode(0);

如果这样做,您就不能再使用“umm\u do\u with macro”,许多人建议无论如何都不要使用它。

谢谢,我将实现您的解决方案另一个选项是将作为序列项一部分的约束声明为
软约束