0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡(jiǎn)述SystemVerilog的各種隨機(jī)化方法

jf_78858299 ? 來(lái)源:芯片學(xué)堂 ? 作者:JKZHAN ? 2023-01-21 16:59 ? 次閱讀

我習(xí)慣將驗(yàn)證空間理解為:驗(yàn)證中原則上需要覆蓋的芯片所有有可能出現(xiàn)的工作狀態(tài)的集合。為了探索這片廣袤的驗(yàn)證空間,驗(yàn)證的時(shí)候搞出了帶有約束的隨機(jī)測(cè)試(constrainted-random testing),并搞了覆蓋率(coverage)作為評(píng)估機(jī)制。這也是一套成熟可信的工程學(xué)方法。

因?yàn)榧s束和隨機(jī)化可以講的干貨太多,于是我做了拆分。本文要介紹的內(nèi)容就僅涉及SV的隨機(jī)化處理,包括偽隨機(jī)數(shù)的產(chǎn)生、隨機(jī)穩(wěn)定性和編程示例。

偽隨機(jī)數(shù)的產(chǎn)生

SystemVerilog提供了很多生成偽隨機(jī)數(shù)的方法,比如產(chǎn)生隨機(jī)數(shù)的內(nèi)建函數(shù)**random, **urandom, $urandom_range,對(duì)象隨機(jī)方法object.randomize(),標(biāo)準(zhǔn)庫(kù)隨機(jī)函數(shù)std::randomize()等等。這些函數(shù)的用法在很多教程中都會(huì)提到,而本文要做的,是要挖一挖這些函數(shù)的“玄機(jī)”。

圖片

1. Probabilistic Distribution System Functions

第一類(lèi)隨機(jī)函數(shù)是概率分布系統(tǒng)函數(shù)(probabilistic distribution system funtions),這類(lèi)函數(shù)在LRM中明確包括**random, **dist_uniform, **dist_normal, **dist_exponential, $dist_poisson等可以產(chǎn)生滿(mǎn)足不同概率分布的隨機(jī)數(shù)的函數(shù),并且在附錄N中用C代碼給出了這些函數(shù)的實(shí)現(xiàn)算法。這就意味著,使用相同的種子,這些函數(shù)在不同的仿真軟件中產(chǎn)生出來(lái)的隨機(jī)數(shù)序列應(yīng)該是一致的。這也是這類(lèi)函數(shù)跟其他類(lèi)函數(shù)的主要區(qū)別。

2. Object and Scope Randomization Method

再來(lái)看對(duì)象隨機(jī)方法object.randomize(),這個(gè)函數(shù)在LRM中被稱(chēng)為“the object and scope randomization method”。顧名思義,它專(zhuān)門(mén)被用來(lái)隨機(jī)化對(duì)象。它是所有SV類(lèi)中都會(huì)默認(rèn)存在的內(nèi)置虛函數(shù)(原型是virtual function int randomize()),但是它不能被覆蓋(overridden)。當(dāng)你使用object.randomize() 來(lái)對(duì)對(duì)象進(jìn)行隨機(jī)化的時(shí)候,注意它只會(huì)隨機(jī)化類(lèi)中有rand關(guān)鍵詞修飾的成員變量,并且在成功隨機(jī)化之后會(huì)返回1,失敗則返回0。除此之外,每個(gè)類(lèi)中還有randomize的兩個(gè)回調(diào)函數(shù)pre_randomize()和post_randomize(),這兩個(gè)函數(shù)分別會(huì)在執(zhí)行randomize()的前后自動(dòng)被調(diào)用。注意,這兩個(gè)函數(shù)并不是虛函數(shù)(其函數(shù)原型沒(méi)有virtual關(guān)鍵字),但他們是由虛函數(shù)randomize()來(lái)自動(dòng)調(diào)用的,因此也表現(xiàn)為虛函數(shù)的多態(tài)行為。

這套使用類(lèi)來(lái)描述和控制隨機(jī)數(shù)據(jù)及其約束的機(jī)制相當(dāng)強(qiáng)大。之所以這么說(shuō),一方面是因?yàn)橛辛祟?lèi)的繼承特性的加持,隨機(jī)變量可以方便地繼承和擴(kuò)展;另一方面是因?yàn)镾V還提供了約束的覆蓋、擴(kuò)展、使能和禁用等功能。但這里有一個(gè)問(wèn)題,就是object.randomize()還是只能隨機(jī)化類(lèi)的成員變量,不能隨機(jī)化局部變量。為了解決這個(gè)問(wèn)題,SV又搞來(lái)了一個(gè)可用于當(dāng)前范圍內(nèi),且不限于對(duì)象成員的隨機(jī)化函數(shù)std::randomize(),它在LRM中的定性是scope randomize function。

Std lib下的std::randomize()的適用性比object.randomize()要好,不過(guò)它不能自動(dòng)隨機(jī)對(duì)象中的rand成員變量,也沒(méi)有pre和post函數(shù)可以調(diào)用,畢竟魚(yú)和熊掌不可兼得呀。std::randomize()在某些場(chǎng)景下前面的“std::”是可以省略的,但還是建議使用的時(shí)候加上比較好,能與上面講的object.randomize()做出區(qū)分。除了可以隨機(jī)化當(dāng)前范圍內(nèi)變量,std::randomize()使用的時(shí)候可以將需要隨機(jī)化的多個(gè)變量同時(shí)放到參數(shù)列表中一起做隨機(jī),且能適配這些變量的位寬。該函數(shù)返回結(jié)果跟object.randomize()一樣,成功返回1,失敗返回0。

3. Random Number System Function

最后要將講的是SV中比較古老的隨機(jī)函數(shù)和方法urandom()和urandom_range()。后者只是在前者的基礎(chǔ)上增加了范圍限制。**urandom的函數(shù)原型是function int unsigned **urandom [(int seed)]??梢钥闯鰜?lái),這兩個(gè)函數(shù)的返回值都是32bit的無(wú)符號(hào)數(shù)。如果初始隨機(jī)種子一樣,則相同工具的每一次仿真跑出來(lái)的隨機(jī)數(shù)是一致的,這是涉及到下小節(jié)要講的一個(gè)重要的特性:隨機(jī)穩(wěn)定性。

隨機(jī)穩(wěn)定性(Random stability)

在SV中,不同線程(thread)或?qū)ο螅╫bject)在隨機(jī)化時(shí)使用的隨機(jī)數(shù)產(chǎn)生器(RNG)是相互獨(dú)立的。另一方面,相同線程或相同對(duì)象在相同隨機(jī)種子的情況下,每一次仿真中產(chǎn)生的隨機(jī)數(shù)序列是一樣的。這個(gè)屬性就叫random stability。

隨機(jī)穩(wěn)定性之所以重要,是因?yàn)樵谛酒?yàn)證中,隨機(jī)驗(yàn)證方法是很重要的一部分,在用例回歸之后,那些Failed的測(cè)試用例通常需要使用觸發(fā)錯(cuò)誤的隨機(jī)種子來(lái)重現(xiàn),比如把波形Dump出來(lái)。因此,有必要了解線程和對(duì)象的隨機(jī)化機(jī)制。下面從三個(gè)層面看這套機(jī)制是怎么運(yùn)作的。

**Initialization RNG:**初始化RNG是產(chǎn)生隨機(jī)數(shù)的開(kāi)始,用來(lái)給RNG初始化隨機(jī)種子。每一個(gè)模塊實(shí)例(module instance)、接口實(shí)例(interface instance)、程序塊(program)和包(package)實(shí)例都有屬于自己的初始化RNG,在不指定隨機(jī)種子的情況下,默認(rèn)的隨機(jī)種子根據(jù)不同編譯器的實(shí)現(xiàn)決定的。上小節(jié)講的每一種偽隨機(jī)數(shù)的產(chǎn)生方法都有自己指定隨機(jī)種子的函數(shù)

**Hierarchy seeding:**分層分配隨機(jī)種子是隨機(jī)穩(wěn)定性的重要機(jī)制。在創(chuàng)建新的線程或者實(shí)例化對(duì)象的時(shí)候,父線程使用的RNG的下一個(gè)隨機(jī)值會(huì)作為這個(gè)新線程或者新對(duì)象的RNG的隨機(jī)狀態(tài),即作為新的種子傳遞下去。

**Thread and Object Stability:**SV中將程序(program)、模塊(module)、接口(interface)、函數(shù)(function)、任務(wù)(task)等這些獨(dú)立的塊叫Process。每個(gè)Process都有自己的RNG。每個(gè)RNG都有自己的隨機(jī)狀態(tài)(random state)。我們可以通過(guò)process::self()這個(gè)靜態(tài)方法獲取當(dāng)前Process的RNG句柄,在通過(guò)句柄調(diào)用get_randstate()方法來(lái)獲得隨機(jī)狀態(tài)。不同的仿真工具返回來(lái)的隨機(jī)狀態(tài)的值的表現(xiàn)方式可能會(huì)不一樣,但基本都是一段看起來(lái)沒(méi)有規(guī)律的字符串,這個(gè)字符串表示下一個(gè)要產(chǎn)生的隨機(jī)數(shù)的值。

SV的這套隨機(jī)穩(wěn)定性機(jī)制,盡管通常不需要我們?nèi)プ鍪裁矗且溃涸谖覀円獜?fù)現(xiàn)一個(gè)執(zhí)行失敗的測(cè)試用例的時(shí)候,不要改動(dòng)之前布下的種子,也不要改變程序中線程和對(duì)象創(chuàng)建的順序,避免更改了分層隨機(jī)種子的順序。

編程示例

下面的例程和仿真結(jié)果展示了以上介紹到的隨機(jī)函數(shù)和特性,代碼中也附有必要的注釋。如果需要源碼,可以在公眾號(hào)中直接回復(fù)"SV隨機(jī)"獲得下載鏈接。

圖片

仿真結(jié)果如下圖所示:

圖片

參考文獻(xiàn)

[1] IEEE Standard Association. "IEEE Standard for SystemVerilog-Unified Hardware Design, Specification, and Verification Language." (2013).

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    452

    文章

    50005

    瀏覽量

    419729
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1338

    瀏覽量

    109873
  • System
    +關(guān)注

    關(guān)注

    0

    文章

    164

    瀏覽量

    36805
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    求教!!LabVIEW怎樣數(shù)據(jù)的隨機(jī)化

    數(shù)據(jù)的隨機(jī)化是通過(guò)偽隨機(jī)二進(jìn)制序列生成器作用于輸入數(shù)據(jù)來(lái)實(shí)現(xiàn)的,其中隨機(jī)器的生成多項(xiàng)式為:1+X^15+X^14,請(qǐng)問(wèn)怎樣用LabVIEW實(shí)現(xiàn)這個(gè)過(guò)程呢?謝謝各位的幫助?。?/div>
    發(fā)表于 02-18 20:32

    高速ADC的數(shù)字輸出隨機(jī)化

    ADC輸出頻譜中引起不良的音調(diào)。通過(guò)在將數(shù)字輸出傳輸?shù)叫酒庵皩?duì)數(shù)字輸出進(jìn)行隨機(jī)化,我們可以避免最麻煩的數(shù)字輸出轉(zhuǎn)換-即在中檔輸入電壓下發(fā)生的從全1到全零的轉(zhuǎn)換。通過(guò)在LSB和所有其他數(shù)據(jù)輸出位之間
    發(fā)表于 11-11 10:07

    緩沖區(qū)溢出的危害及避免緩沖區(qū)溢出的三種方法

    1. 蠕蟲(chóng)病毒簡(jiǎn)介2. 緩沖區(qū)溢出3. 緩沖區(qū)溢出舉例4. 緩沖區(qū)溢出的危害5. 內(nèi)存在計(jì)算機(jī)中的排布方式6. 計(jì)算機(jī)中越界訪問(wèn)的后果7. 避免緩沖區(qū)溢出的三種方法7.1 棧隨機(jī)化7.2 ...
    發(fā)表于 03-30 14:01

    新的隨機(jī)化廣播加密方案

    提出一種新的隨機(jī)化廣播加密方案,通過(guò)構(gòu)建隨機(jī)函數(shù)族為用戶(hù)分配密鑰,可以使合法用戶(hù)以概率1 獲取解密密鑰,而用戶(hù)的密鑰存儲(chǔ)僅為(l +1) 個(gè),與其他基于二叉樹(shù)結(jié)構(gòu)的方案相
    發(fā)表于 03-24 09:40 ?10次下載

    SystemVerilog中的隨機(jī)化激勵(lì)

    隨著集成電路的驗(yàn)證工作日漸復(fù)雜,對(duì)驗(yàn)證的可靠性提出了越來(lái)越高的要求。傳統(tǒng)的驗(yàn)證工作中也使用隨機(jī)化激勵(lì)以便減輕測(cè)試代碼編寫(xiě)的工作量,以提升驗(yàn)證的可靠性。在SystemV
    發(fā)表于 12-14 10:55 ?14次下載

    System Verilog中的隨機(jī)化激勵(lì)

    在SystemVeri log更強(qiáng)調(diào)了利用隨機(jī)化激勵(lì)函數(shù)以提高驗(yàn)證代碼的效率和驗(yàn)證可靠性的重要性。本文以VMM庫(kù)為例,闡述了如何在SystemVeri 1og中使用隨機(jī)化函數(shù)來(lái)編寫(xiě)高效率的測(cè)試代碼,重點(diǎn)介
    發(fā)表于 04-01 15:03 ?30次下載
    System Verilog中的<b class='flag-5'>隨機(jī)化</b>激勵(lì)

    基于System Verilog中的隨機(jī)化激勵(lì)

    基于System Verilog中的隨機(jī)化激勵(lì)
    發(fā)表于 10-31 09:25 ?9次下載
    基于System Verilog中的<b class='flag-5'>隨機(jī)化</b>激勵(lì)

    一種隨機(jī)化的軟件模型生成方法

    .提出一種隨機(jī)化的模型生成方法,該方法能夠根據(jù)元模型的定義以及用戶(hù)輸入的約束條件隨機(jī)且正確地生成模型文件.實(shí)驗(yàn)結(jié)果表明:該方法與其他
    發(fā)表于 12-30 12:06 ?0次下載
    一種<b class='flag-5'>隨機(jī)化</b>的軟件模型生成<b class='flag-5'>方法</b>

    華為手機(jī)已經(jīng)開(kāi)啟了MAC地址隨機(jī)化功能可以有效的防范WiFi探針

    華為EMUI官方微信稱(chēng),華為手機(jī)EMUI 8.0以上版本已經(jīng)默認(rèn)開(kāi)啟了MAC地址隨機(jī)化功能,MAC地址隨機(jī)化是指手機(jī)WiFi開(kāi)啟后,每次在掃描周?chē)鶺iFi熱點(diǎn)時(shí)攜帶的MAC地址都是隨機(jī)生成的,就算被WiFi探針獲取也無(wú)法做正確的
    發(fā)表于 03-18 09:43 ?1.4w次閱讀

    華為手機(jī)EMUI 8.0及以上版本已經(jīng)默認(rèn)開(kāi)啟了MAC地址隨機(jī)化功能

    華為EMUI官方微信稱(chēng),華為手機(jī)EMUI 8.0及以上版本已經(jīng)默認(rèn)開(kāi)啟了MAC地址隨機(jī)化功能,MAC地址隨機(jī)化是指手機(jī)WiFi開(kāi)啟后,每次在掃描周?chē)鶺iFi熱點(diǎn)時(shí)攜帶的MAC地址都是隨機(jī)生成的,就算被WiFi探針獲取也無(wú)法做正確
    發(fā)表于 03-20 08:56 ?8269次閱讀

    固態(tài)硬盤(pán)的順序讀寫(xiě)和隨機(jī)讀寫(xiě)有何區(qū)別

    順序與隨機(jī)指的是每次數(shù)據(jù)存取請(qǐng)求對(duì)應(yīng)的地址是否連續(xù)。Windows系統(tǒng)采取“見(jiàn)縫插針”的策略進(jìn)行數(shù)據(jù)寫(xiě)入,多任務(wù)系統(tǒng)下各進(jìn)程對(duì)硬盤(pán)位置的讀寫(xiě)請(qǐng)求也變得更為隨機(jī)化
    發(fā)表于 09-28 06:34 ?2.3w次閱讀

    簡(jiǎn)述SystemVerilog隨機(jī)約束方法

    上一篇文章介紹了SystemVerilog各種隨機(jī)化方法,本文將在其基礎(chǔ)上引入SystemVerilog
    的頭像 發(fā)表于 01-21 17:03 ?1943次閱讀

    UVM中的uvm_do宏簡(jiǎn)析

    uvm_do宏及其變體提供了創(chuàng)建、隨機(jī)化和發(fā)送transaction items或者sequence的方法
    的頭像 發(fā)表于 06-09 09:36 ?4646次閱讀
    UVM中的uvm_do宏簡(jiǎn)析

    SystemVerilog隨機(jī)約束方法

    上一篇文章《暗藏玄機(jī)的SV隨機(jī)化》介紹了SystemVerilog各種隨機(jī)化方法,本文將在其基礎(chǔ)上引入
    的頭像 發(fā)表于 09-24 12:15 ?1417次閱讀

    SV約束隨機(jī)化總結(jié)

    constraint 約束隨機(jī)化類(lèi)中的變量 在main_phase 之前就已經(jīng)提前產(chǎn)生一個(gè)變量的隨機(jī)值。 用法:一般在類(lèi)中定義一個(gè)rand 類(lèi)型的變量, 然后根據(jù)需求寫(xiě)約束就可以
    的頭像 發(fā)表于 12-14 14:30 ?729次閱讀
    SV約束<b class='flag-5'>隨機(jī)化</b>總結(jié)