1.rand与randc的区别
rand用于生成伪随机的、均匀分布的随机值。它会在每次调用时生成一个新的随机值,且每个值的概率相等;
randc也用于生成随机值,但不包括上一个随机值。换句话说,它生成的随机值不会与上一个生成的随机值相同。
这在某些情况下可以确保避免连续生成相同的随机序列,增加随机性。
2.子类对父类的约束是继承还是约束
当子类约束和父类约束同名时,是覆盖,以子类的约束为准。当子类约束和父类约束不同名,是继承,约束里面的相同变量要同同时满足子类和父类的约束
3.
类里所有没有被指定rand的变量也可以作为randomize()的参数而被随机化。
4.具有唯一元素的数组
即随机数组时如何让随机出来每个数组元素值都不一样
方法1:使用foreach函数
class UniqueSlow; rand bit [7:0] ua[64]; constraint c{ foreach(ua[i]) foreach(ua[j]) if(i != j) ua[i] != ua[j]; } endclass
但是这样仿真速度太低了
方法2:使用包含randc的辅助类
class randc8; randc bit [7:0] val; endclass class LittleUniqueArray; bit [7:0] ua [64]; function void pre_randomize(); randc8 rc8; rc8=new(); foreach(ua[i])begin assert(rc8.randomize()); ua[i] = rc8.val; end endfunction endclass
5.随机化句柄数组
不仅会随机化句柄数目,还会随机化句柄指向的对象。同理,动态数组在随机化时也会随机化大小和元素值
6.多个软约束的冲突问题
随机化解决软约束冲突,遵循后置约束覆盖前置约束,子类约束覆盖父类约束,内嵌约束覆盖类内部约束
7.结构体使用rand修饰符
类中的结构体变量为非组合型时(默认为此),需要对该结构体变量及其内部成员分别添加rand,结构体变量为组合型时,仅需要对改结构体变量添加rand修饰符(并且不支持对内部变量添加rand修饰符)