当一个变量被声明为rand类型后,常常会对其进行一定的约束,但这个范围应该尽量宽一些。
在实际项目中碰到该问题,一个cfg类,其变量x在constraint中做了如下约束
rand bit x;
constraint soft_c_xxx_cfg{
soft x == 1;
}
并且该xxx_cfg在包含在一个更大的sys_cfg中,且在这个sys_cfg中的post_randomize()函数中调用了xxx_cfg.randomize()
function void post_randomize();
xxx_cfg.randomize();
endfunction
此时,本想在case中构造x在0和1中随机,在case中代码如下:
p_sequencer.cfg.xxx_cfg.randomize with{
x inside {0, 1};
};
如上代码实现不了x在0和1中随机,原因是该变量x应遵循其约束条件soft x==1;
此时case中给的范围是0和1,这样会取其交集1作为随机值;
若两个约束没有交集,大概率会报错(约束冲突);
正确的做法:
1.在constraint中的约束范围给宽一些;
2.直接赋值p_sequencer.cfg.xxx_cfg.x == $urandom_range(0, 1)
7408

被折叠的 条评论
为什么被折叠?



