第六章:隨機化(續2)
6.10 隨機化句柄數組
如果想要產生多個隨機對象,那麽你可能需要建立隨機句柄數組,和整數數組不同,隨機求解器不會創建對象,所以你需要在隨機化前分配所有的元素。
動態數組可以按照需要分配最大數量的元素,然後按照約束再逐步減小數組的大小。在隨機化時,動態句柄數組的大小可以保持不變或減小,但是不能增加。
6.11 產生原子激勵和場景
每次只產生一個事務,這些產生一個隨機總線事務、一個網絡包、一條處理器指令都是原子隨機事務。
6.11.1 隨機序列
產生事務序列的另一種方法是使用SystemVerilog的randsequence結構。
- 給出權重分布
- 程序性代碼可以調試($display),不像randomize()函數要麽成功,要麽失敗。
產生序列的代碼與序列使用的包是分開的,風格也完全不同。
6.11.2 隨機控制
之前的介紹能夠使我們很隨意的產生隨機序列,但是如果設計只是偶爾才需要隨機決策,你就會認為上面的方法是一件很麻煩的事情。程序員更喜歡用程序性的語句,這樣就可以使用調試工具逐條運行。使用randcase和$urandom_range的隨機控制。
使用randomize()函數的隨機控制。
6.11.3 用randcase建立決策樹
通過下列兩級代碼,便可以清楚知道決策樹是怎麽建立的。
6.12 隨機數發生器
6.12.1 偽隨機數發生器
Verilog使用了一種簡單的PRNG(偽隨機數發生器),通過$random函數訪問,這個發生器有一個內部狀態,可以通過$random的種子來設置。
SystemVerilog通過randomize()和randcase來調用PRNG。6.12.2 隨機穩定性---多個隨機發生器
Verilog在整個仿真中使用一個PRNG。
SystemVerilog中,每個對象和線程都有一個獨立的PRNG。6.12.3 隨機穩定性和層次化種子
SystemVerilog的每個對象都有自己的PRNG和獨立的種子。在仿真開始時,一個種子可以產生可以產生多個隨機激勵流,它們之間又是相互獨立的。
當調試測試平臺的時候,如果修改代碼的話,即使是具備隨機穩定性,代碼的變化也會使測試平臺產生不同的隨機值。特別是當調試DUT的故障時,測試平臺卻不能再現相同的激勵。把新增的對象和線程放在現有對象和線程之後,可以減小修改代碼帶來的影響。6.12.4 隨機器件配置
測試DUT的一個重要工作是測試DUT內部設置和環繞DUT的系統配置。測試應該隨機化環境,這樣才能保證盡可能測試足夠多的模式。
第六章:隨機化(續2)