相關閱讀
Verilog基礎?編輯https://blog.csdn.net/weixin_45791458/category_12263729.html
? ? ? ? $random系統函數語法的BNF范式如下所示,有關BNF范式相關內容,可以瀏覽以往文章Verilog基礎:巴科斯范式(BNF)。
????????$random系統函數在每次調用時返回一個32位的隨機數,這個隨機數是有符號的,可正可負。按照Verilog標準語法,$random系統函數的調用方式為$random或$random(seed),但實際上$random()這種調用方式也是可以的,且其與$random完全一樣。
? ? ? ? seed是系統函數產生隨機數的種子,當不指定種子時,如$random()或$random,系統會默認指定一個在每次調用后都會改變的隱形種子,且種子的改變軌跡是確定的,具體如下所示。????????
`timescale 1ns/1ns
module test();
initial begin repeat(10) #5 $display("Default Random number is %d", $random);
end
endmodule輸出:
Default Random number is 303379748
Default Random number is -1064739199
Default Random number is -2071669239
Default Random number is -1309649309
Default Random number is 112818957
Default Random number is 1189058957
Default Random number is -1295874971
Default Random number is -1992863214
Default Random number is 15983361
Default Random number is 114806029
? ? ? ? 上面代碼的隨機數序列是確定的,即第一次調用系統函數時返回303379748,第二次時返回-1064739199,以此類推。
? ? ? ??對于相同數值的種子,系統函數會返回相同的值,如下所示。
`timescale 1ns/1ns
module test();
initial begin repeat(10) #5 $display("Default Random number is %d", $random(0));
end
endmodule輸出:
Default Random number is 303379748
Default Random number is 303379748
Default Random number is 303379748
Default Random number is 303379748
Default Random number is 303379748
Default Random number is 303379748
Default Random number is 303379748
Default Random number is 303379748
Default Random number is 303379748
Default Random number is 303379748
? ? ? ? 從上面的輸出我們還可以發現,系統默認的隱形種子的種子值可能就是從0開始。
????????如果指定了種子值,我們必須保證在每次調用系統函數前的種子值是不同的,這樣才能得到一個看近似隨機的數字,如使用$time系統函數,它會返回當前的仿真時間。
`timescale 1ns/1ns
module test();
initial begin repeat(10) #5 $display("Default Random number is %d", $random($time));
end
endmodule輸出:
Default Random number is -2147138048
Default Random number is -2146792448
Default Random number is -2146447360
Default Random number is -2146101760
Default Random number is -2145756672
Default Random number is -2145411072
Default Random number is -2145065984
Default Random number is -2144720384
Default Random number is -2144375296
Default Random number is -2144029696
?????????$random系統函數返回的是32位有符號數,如果我們不需要這么大的有符號數可以使用求余運算符得到一個小的隨機數,如下所示。
`timescale 1ns/1ns
module test();
initial begin repeat(10) #5 $display("Default Random number is %d", {$random} % 8);
endmodule輸出:
Default Random number is 4
Default Random number is -7
Default Random number is -7
Default Random number is -5
Default Random number is 5
Default Random number is 5
Default Random number is -3
Default Random number is -6
Default Random number is 1
Default Random number is 5
? ? ? ? 通過對8求余,我們得到了一個位于-7到7之間的隨機數。
? ? ? ? 如果我們需要無符號的隨機數,我們可以利用拼接運算符、域選或$unsigned系統函數,如下所示。
`timescale 1ns/1ns
module test();
integer a;
initial begin repeat(10) #5 $display("Default Random number is %d", {$random} % 8);//repeat(10) #5 begin a = $random; a = a[2:0]; $display("Default Random number is %d", a);end//repeat(10) #5 $display("Default Random number is %d", $unsigned($random) % 8);
end
endmodule輸出:
Default Random number is 4
Default Random number is 1
Default Random number is 1
Default Random number is 3
Default Random number is 5
Default Random number is 5
Default Random number is 5
Default Random number is 2
Default Random number is 1
Default Random number is 5
? ? ? ? 三種方法的輸出結果是一樣的,因為他們的原理是類似的,{}拼接運算符的結果是無符號的;域選運算符的結果也是無符號的,同時域選的位寬還可以保證輸出數據的大小,這甚至省略了求余的操作;$unsigned系統函數可以直接將一個有符號數轉換為無符號數。