總結verilog產生隨機數的$random和seed

?

$random(seed)是verilog中最簡單的產生隨機數的系統函數。

?

在調用系統函數$random(seed)時,可以寫成三種樣式:1)$random,2)$random(),3)$random(seed)。下面分別說明:

1)$random

這是最簡單的一種寫法,略去了seed這個傳入參數,$random會使用一個默認的seed(這個默認值為0?)。也正因此,每次進行仿真時,$random產生的隨機數序列都是相同的。

2)$random()

這種寫法和寫法1)的作用是相同的,同樣是沒有給$random傳入seed。

3)$random(seed)

這種寫法與上面兩種不同,給$random傳入了參數seed,因此$random根據seed來產生隨機數。seed不同,產生的隨機數的序列也不同。而且,每執行一次$random(seed)產生一個隨機數,seed也自動更新一次。

?

下面討論seed的產生。

據我有限的知識,seed有兩種產生方式:4)直接賦值為一個確定數,5)利用系統函數$get_initial_random_seed獲得值。下面分別討論:

4)直接賦值

在一個initial塊中直接將seed變量寫成某值,如下面代碼:

integer seed;

reg [7:0] rand_num;

initial??begin seed = 0; end

always @(posedge clk) begin rand_num <= $random(seed); end

在上面代碼中,seed初始值被賦為0(也可以是1或其它數),在第一個時鐘上升沿,rand_num取得的第一個隨機數就是$random(0)產生的,seed也隨即更新;在第二個時鐘上升沿時,rand_num取得第二個隨機數,是$random(更新后的seed)產生的,seed又隨即更新;如此下去。

值得注意的是,如果把seed賦值為0,那么利用$random(seed)產生的隨機數序列和直接執行$random產生的隨機數序列是相同的。這個結論是我根據經驗得出的。

5)seed = $get_initial_random_seed()

如下面代碼:

integer seed;

reg [7:0] rand_num;

initial??begin seed = $get_initial_random_seed(); end

always @(posedge clk) begin rand_num <= $random(seed); end

在上面代碼中,利用系統函數得到的seed的值是1,此后seed更新后的值和$random(seed)產生的隨機數序列都和將seed直接賦值成1,利用$random(seed)產生隨機數的情況相同。這也是我根據經驗得出的結論。

我在網上沒有找到關于$get_initial_random_seed的詳細介紹。

?

下面討論仿真時如何改變seed的初值:

如果seed的初值是確定的,那么不論進行多少次仿真,產生的隨機數的序列總是確定的,就不能覆蓋更多的情況。因此在仿真時,要能夠改變seed的初值。目前我所知道的改變seed的初值有兩種方法:6)修改代碼;7)采用deposit方式。下面分別介紹:

6)修改代碼

這種方式最直接,缺點是每次要修改seed時都需要重新編輯一遍代碼。

比如,第一次仿真時,代碼寫成下面的樣子:

integer seed;

reg [7:0] rand_num;

initial??begin seed = 0; end

always @(posedge clk) begin rand_num <= $random(seed); end

而第二次仿真時,想修改seed的初值,就寫成下面的樣子:

integer seed;

reg [7:0] rand_num;

initial??begin seed = 1; end

always @(posedge clk) begin rand_num <= $random(seed); end

7)采用deposit的方式

這種方式比較靈活,不必修改代碼,也不必重新編譯,直接修改輸入到仿真軟件的命令即可。

下面是最簡單的一個命令:

deposit top.seed 2

run 125ns

exit

上面命令的意思是,將信號(或變量)seed的初值設成1,然后開始仿真,仿真時間為125ns,然后結束仿真。

deposit是在仿真開始之前起作用的(如果沒有給deposit加上其它時間方面的條件),而且它只是將某個信號的初始值設為某一個數(可以是確定數,也可以是隨機數),此后便不再干預該信號的值。如果仿真開始后有別的條件或語句改變該變量的值,則該變量就變成改變后的值。

如果代碼按下面的樣子寫:

integer seed;

reg [7:0] rand_num;

initial??begin seed = 1; end

always @(posedge clk) begin rand_num <= $random(seed); end

我們來看一下,在仿真開始之前deposit將seed賦值為2,然而仿真開始后的0ns時刻,initial塊又將seed賦為1,因此相當于deposit沒有起到預期的作用。我們想要的是,seed的初值為2,$random(2)產生一個隨機數后,seed再由2變成其它的數;而不是$random(1)產生一個隨機數,然后seed又由1變成其它的數。

為了達到我們的預期目的,要把deposit命令改成下面的樣子:

deposit top.seed 2 -after 1ns

run 125ns

exit

在仿真開始的0ns時,initial塊執行,將seed設為1。加上"-after 1ns"后,deposit命令就會在仿真開始后的1ns時起作用,把seed的值改為2,然后作用于第一次$random(seed)的執行,然后seed再更新。

?

綜上討論,我得出以下結論:

1. 利用$random產生隨機數時最好利用上seed參數,即寫成$random(seed)樣式。

2. 沒有必要利用$get_initial_random_seed()函數給seed賦值,直接寫成一個值即可,像4)一樣。

3. 建議用deposit的方式在仿真時改變seed的初值,使$random(seed)產生不同的隨機數序列

轉載于:https://www.cnblogs.com/Dinging006/p/8592393.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390048.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390048.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390048.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

326. 3的冪

326. 3的冪 給定一個整數&#xff0c;寫一個函數來判斷它是否是 3 的冪次方。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 整數 n 是 3 的冪次方需滿足&#xff1a;存在整數 x 使得 n 3x 示例 1&#xff1a;輸入&#xff1a;n 27 輸出&#x…

Lottie 站在巨人的肩膀上實現 Android 酷炫動畫效果

說到動畫效果&#xff0c;一般都會感到很高端&#xff0c;感覺很酷炫&#xff1b;而小菜技術有限&#xff0c;稍復雜的動畫效果也需要很多時間處理&#xff0c;但是遇到時間緊任務重的情況該怎么辦呢&#xff1f;那就嘗試一下 Lottie 吧&#xff0c;酷炫的動畫集成卻相當簡單&a…

正則表達式(讀書過程所記未整理)

\d 表示一位數字字符 \d{3} 表示3個數字字符 匹配電話比如400-400-1118 import re phone_number re.compile(r\d{3}-\d{3}-\d{4}) mo phone_number.search(rfor a number is 400-400-4000) print(mo.group()) ************************************************************…

java1

不知道為啥粘貼的圖片是一堆編碼。。。。 如何插入圖片 博客后后臺MarkDown編輯器上只有一個按鈕&#xff0c;就是用來上傳圖片并自動插入MarkDown標記的&#xff0c;超級好用 &#xff08;一&#xff09;學習總結 1.在java中通過Scanner類完成控制臺的輸入&#xff0c;查閱JDK…

430. 扁平化多級雙向鏈表

430. 扁平化多級雙向鏈表 多級雙向鏈表中&#xff0c;除了指向下一個節點和前一個節點指針之外&#xff0c;它還有一個子鏈表指針&#xff0c;可能指向單獨的雙向鏈表。這些子列表也可能會有一個或多個自己的子項&#xff0c;依此類推&#xff0c;生成多級數據結構&#xff0c…

PHPstudy搭建本地環境的網頁加載速度慢的解決方案

PHP5.3以上&#xff0c;如果數據庫鏈接地址是localhost&#xff0c;會自動檢測最終的地址是IPV4還是IPV6&#xff0c;所以會比較慢。解決辦法&#xff1a;修改數據庫的鏈接地址&#xff0c;將localhost改為127.0.0.1即可。 原文鏈接&#xff1a;https://chasjd.com/posts/fb433…

標記偏見_分析師的偏見

標記偏見“Beware of the HiPPO in the room” — The risks and dangers of top-down, intuition-based decision making are well known in the business world. Experimentation and data-based decision making become widely acknowledged as the right way to steer a bu…

scott登錄查詢常用語句

一、簡單查詢 1.簡單查詢select * from emp;--查詢表emp中的所有數據select empno as id,ename as name from emp;--查詢表emp中的empno顯示為id&#xff0c;ename顯示為name 2.去除重復select distinct job from emp;--將表emp中的job去重select distinct job,deptno from emp…

CSS結構的基礎認知

css的屬性值與html的屬性值用法不相上下&#xff0c;但是css主要分為內聯樣式表和外聯樣式表。 內聯樣式表用法&#xff1a;在html文件中的《head》頭文件中添加<style></style>標簽&#xff0c;在標簽內添加所需的屬性值&#xff0c;例如&#xff1a;<!DOCTYPE…

BZOJ1453: [Wc]Dface雙面棋盤

Time Limit: 10 Sec Memory Limit: 64 MB Submit: 784 Solved: 422 [Submit][Status][Discuss] Description 佳佳有一個 nnn 行 nnn 列的黑白棋盤&#xff0c;每個格子都有兩面&#xff0c;一面白色&#xff0c;一面黑色。佳佳把棋盤平放在桌子上&#xff0c;因此每個格子恰好一…

用戶體驗數據分析 書單_如何使用數據改善用戶體驗設計

用戶體驗數據分析 書單In the current age of technology, if an entrepreneur comes up with a grand idea, chances are they’ll need a pretty sweet website to go along with it. And if they want their idea to really sell, they will also need a website that reall…

推薦11個實用的JavaScript庫

2019獨角獸企業重金招聘Python工程師標準>>> JavaScript 仍然是 2018 年最受歡迎和使用最為廣泛的編程語言&#xff0c;因此 JavaScript 生態系統也會繼續發展壯大。 然而&#xff0c;JavaScript 的標準庫仍然繼續保持“短小精悍”的身材。為了填補標準庫功能方面的…

371. 兩整數之和

371. 兩整數之和 給你兩個整數 a 和 b &#xff0c;不使用 運算符 和 - ???????&#xff0c;計算并返回兩整數之和。 示例 1&#xff1a; 輸入&#xff1a;a 1, b 2 輸出&#xff1a;3 示例 2&#xff1a; 輸入&#xff1a;a 2, b 3 輸出&#xff1a;5 提示&a…

【福利】微信小程序精選Demo合集

小編最近在開發小程序&#xff0c;也讀到了不少優秀的小程序源碼&#xff0c;項目中有些需求可以直接從源碼里粘貼復制過來&#xff0c;雖然這樣做不利于自己獨立編寫代碼&#xff0c;但比較是給公司做項目啊&#xff0c;秉著效率第一的原則&#xff0c;簡直沒有什么比ctrlc,ct…

639. 解碼方法 II

639. 解碼方法 II 一條包含字母 A-Z 的消息通過以下的方式進行了編碼&#xff1a; A -> 1 B -> 2 ... Z -> 26要 解碼 一條已編碼的消息&#xff0c;所有的數字都必須分組&#xff0c;然后按原來的編碼方案反向映射回字母&#xff08;可能存在多種方式&#xff09;。…

[cpyhon源代碼]dict對象原理學習

Cpython 2.7 分支中&#xff0c;dict 對象的源代碼 lookdict 搜索算法 1 static PyDictEntry *2 lookdict(PyDictObject *mp, PyObject *key, register long hash)3 {4 register size_t i;5 register size_t perturb;6 register PyDictEntry *freeslot;7 regis…

熊貓數據集_熊貓邁向數據科學的第一步

熊貓數據集I started learning Data Science like everyone else by creating my first model using some machine learning technique. My first line of code was :通過使用某種機器學習技術創建我的第一個模型&#xff0c;我開始像其他所有人一樣學習數據科學。 我的第一行代…

SQLServer鎖的機制

SQLServer鎖的機制&#xff1a;共享鎖(S)排它鎖(X)更新鎖(U)意向共享 (IS)意向排它 (IX) 意向排它共享 (SIX)架構修改(Sch-M) 架構穩定性(Sch-S)大容量更新&#xff08;BU&#xff09;轉載于:https://www.cnblogs.com/yldIndex/p/8603902.html

你是否具有價值

一個有價值的人往往受歡迎的程度才會高。白天上午花了兩個多小時的時間幫前同事遠程解決了服務器部署時由于防火墻機制問題引起的系統功能失敗的問題。解決完這個問題之后&#xff0c;同事的心情很愉悅&#xff0c;其實我自己的心情也很愉悅&#xff0c;看來人都有幫助別人和被…

為什么選擇做班級管理系統_為什么即使在平衡的班級下準確性也很麻煩

為什么選擇做班級管理系統Accuracy is a go-to metric because it’s highly interpretable and low-cost to evaluate. For this reason, accuracy — perhaps the most simple of machine learning metrics — is (rightfully) commonplace. However, it’s also true that m…