systemverilog约束----randc/rand

1 rand and randc

1.1 rand

rand:rand修饰的变量,每次随机时都会在取值范围内随取一个值,每次随机的概率都是一样的;

rand bit[7:0] a_rand;

a_rand的取值范围是0-255,并且每次randomize时,每个被取到的值得概率都是1/256。就像每次掷骰子一样,每次的概率都是1/6;

1.2 randc

randc:修饰变量时,变量周期性随机,所有可能的值都取过后才会取重复的值,依次类推;
randc bit[7:0] b_rand;
b_rand 的取值范围是0-255;调用random()后,前256次randomize取到的值会覆盖0-255;然后第257次才会重新重复,同样的257-512次randomize得到的值依然会覆盖0-255所有的值;

注:

  1. randc的随机序列在constrain约束发生变化,或者序列中剩下的值不能满足当前的约束要求时,变量的随机序列会被重新计算;
  2. randomize()计算随机变量时,randc修饰的变量会被首先计算,在包含rand和randc的变量的约束计算中,可能会导致错误,需要注意。

2 使用randc的约束类

如果有下例:

class CONT;
  randc bit[7:0] c_randc;
endclass

如果在另一个类或者module里使用此类产生不重复的数据,应该注意,new()函数不应出现在repeat或者for循环里,否则将不会实现上诉目标,而是每次都会充c_rand范围内取任何一个数据;

class test_sequence extends base_sequence;
  ...
  task body();
    CONT c_const;
    c_const = new();
    repeat(10) begin
       if(c_const.randomize()) beign
         $display("randomize success");
       end
       else beign
         $display("randomize fail");
       end
    end
  endtask
  ...
endclass
posted @ 2024-05-21 19:40  自然史  阅读(293)  评论(0)    收藏  举报