SystemVerilog - Randomization

2023-07-16
SystemVerilog

SystemVerilog主要是拿來驗證Verilog Design,需要盡可能的驗證所有可能的狀況,但是如果所有test case都是由驗證者一個一個想的話,很容易就遺漏一些沒考慮到的狀況,所以要用random generator產生隨機的值去驗證design。

但因為某些random的值可能是不合法的輸入,所以在使用random方式產生test input的時候需要和constraint搭配,產生出合理的test input。

要產生出random variable需要在變數宣告的前面加入randrandc,這兩個差別是rand會直接隨機產生random值,而randc是週期性的隨機,要等全部的值都取過之後才會randc到重覆的值。

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class rand_cls;
rand bit[2:0] rand_val;
randc bit[2:0] randc_val;

constraint c_rand_val { rand_val <= 3; }
constraint c_randc_val { randc_val >= 1; randc_val <= 3; }

function display_val();
$display("rand_val:%0d, ranc_val:%0d", rand_val, randc_val);
return 0;
endfunction
endclass

module tb;
rand_cls rand_pkg;

initial begin
rand_pkg = new();
for (int i = 0; i < 10; i++) begin
rand_pkg.randomize();
rand_pkg.display_val();
end
end

endmodule

Output:

1
2
3
4
5
6
7
8
9
10
# rand_val:3, ranc_val:2
# rand_val:2, ranc_val:3
# rand_val:2, ranc_val:1
# rand_val:0, ranc_val:3
# rand_val:0, ranc_val:1
# rand_val:1, ranc_val:2
# rand_val:2, ranc_val:1
# rand_val:0, ranc_val:2
# rand_val:0, ranc_val:3
# rand_val:3, ranc_val:2

上面的例子可以看到
rand_val有使用constraint限制random的值必須是小於等於3,rand_val則是限制random的值必須大於等於1且小於等於3。
可以看到rand_val所random出來的值都小於等於3,每次random出來的值都是隨機介於0和3之間。
randc_val所random出來的值一定會等到1到3之間的值都被random過了之後,才會重複random,所以每三列一定都會出現數值1/2/3。