精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SystemVerilog的隨機約束方法

sanyue7758 ? 來源: 芯片學堂 ? 2023-09-24 12:15 ? 次閱讀

上一篇文章《暗藏玄機的SV隨機化》介紹了SystemVerilog的各種隨機化方法,本文將在其基礎上引入SystemVerilog的隨機約束方法(constraints)。通過使用隨機約束,我們可以將隨機限制在一定的空間內,有針對性地提高功能覆蓋率。

SV隨機約束的應用,就像是我們用陳述性(declarative)的語句告訴仿真器我們要的隨機數要滿足哪些條件,然后仿真器的約束解算器(constraint solver)就會去找到能夠滿足我們所有描述語句的解,再從這些解中隨機選出來一個值作為隨機的結果。

約束解算器

約束解算器是SV仿真器重要的一部分,它被專門用來求解約束。這里說的求解,就是指的仿真程序通過某種算法,找到能夠滿足我們所有約束條件的隨機值的過程。如果隨機被過約束(over-constraint)了,或者存在隨機值的組合情況不能滿足約束,則約束解算器就會解算失敗。在實際應用中,仿真程序就會報錯,然后打印出來告訴我們是哪段約束沒有解算成功。

理解約束解算器的重要性,可以想想如果沒有約束解算器會怎么樣?舉一個簡單的栗子,現在我們有一個約束條件:變量A的隨機值總是小于變量B的隨機值。如果沒有約束功能,代碼可以這么實現:

do begin
 A = $urandom; 
B = $urandom;
end while (! (A

使用約束語句代碼是這樣的:

class ictalking;
rand bit [7:0] A, B;
  constraint c_ab { A

可以看得出來,如果沒有約束解算器,我們在描述約束的時候就會變得比較繞,通常會花掉很多時間去重復執行相同的一段代碼,有時候甚至會跑了半天都撞不出來一個滿足約束的隨機值,更別說那些復雜的約束了。有了約束解算器,我們就可以在其框架內加入各種約束語句,它總能幫我們快速找到那個解。

約束關系和控制

約束的解算順序:約束的解算順序可以使用solve-before來控制。約束解算器會優先求解before之前的約束,因此使用solve-before會影響隨機數組合的概率分布情況。

class ictalking;
rand bit [7:0] A, B;
constraint c_a { A > B; }
constraint c_order {solve A before B;}

// 順序約束可以寫在同一個約束塊中,

// 也可以分開寫在不同的約束塊中(如本例)

endclass

硬約束和軟約束:當我們在不同的層次對隨機變量附加約束的時候,軟約束可以被后面指定的約束給覆蓋。典型的應用場景是在UVM的sequence_item(或者叫transaction)定義時,我們可以通過軟約束指定默認的隨機約束,這樣方便我們后面在繼承或者例化的時候可以使用更高優先級的約束對其覆蓋。

class ictalking;
rand int count;
constraint c_count {
  soft count inside {[666:888]}; // 指定軟約束需要使用關鍵字soft
 }
endclass

ictalking ict = new();
ict.randomize() with { count inside {[123:456]}; }

約束的控制開關:默認情況下,所有的約束一寫上就默認使能,即約束解算器就會按照這些約束開始算。但SV提供約束條件的控制方法constraint_mode(),可以很方便的控制約束是否啟用,以及查詢約束的啟用狀態。

// 繼續上面的例子
int con_status;
ictalking ict_obj1 = new();
ictalking ict_obj2 = new();

ict_obj1.c_count.constraint_mode(0); // 不啟用ict_obj1中的約束c_count
ict_obj2.c_count.constraint_mode(1); // 啟用ict_obj2中的約束c_count
ict_obj1.count.rand_mode(0); // 順便提一嘴,隨機變量類似的可以使用rand_mode開關隨機功能

con_status = ict_obj1.c_count.constraint_mode(); // 獲得ict_obj1中約束c_count的啟用狀態

五花八門的約束代碼

SV中的約束非常靈活,下面給出一些常用的約束代碼,可以作為參考和總結。

范圍約束:使用inside指定隨機數的范圍或者枚舉值

rand int temp_var;
constraint c_var_1 {temp_var inside {[2000:2021]}; }     // 限定范圍
constraint c_var_2 {temp_var inside {2008, 2016, 2019}; } // 限定枚舉值
constraint c_var_3 {! (temp_var inside {[1:2007]});      // 反向限定范圍

條件約束:SV中有兩種寫條件約束的方式:implication(有些地方會翻譯成蘊藏或者關聯等等)和 if-else,用來指定在某些條件下才做進一步的約束,這兩種方法使用上幾乎沒有區別。

rand bit mode;
rand int count;
constraint c_var_1 { mode == 1 -> count < 2021; } // 使用implication操作符->
constraint c_var_2 { if (mode == 1) {count < 2021;} else {count > 6000;} } // 使用if-else

權重約束:約束可以指定隨機值的權重,主要有兩種方式:dist和randcase。dist一般用在constraint約束塊中,但randcase一般用在程序執行塊中,比如某個函數、任務或者initial塊等。

rand bit mode;
rand int count;
constraint c_var_1 {
  mode == READ -> count inside {[2008:2016]};
mode == WRITE -> count inside {[2017:2021]};
mode dist {READ := 4, WRITE := 6}; // mode隨機成READ的概率為40%,WRITE為60%
}

initial begin
repeat (100) begin

randcase

2: $display("In 1st branch."); // 在100次循環中,執行分支1的概率是20%

7: $display("In 2nd branch."); // 在100次循環中,執行分支2的概率是70% 1: $display("In 3rd branch."); // 在100次循環中,執行分支3的概率的10% endcase end end

唯一約束:唯一約束使用unique關鍵字來限定變量之間的值是唯一的,即兩兩之間互不相等。

rand int a, b, c;
rand int array[5];
int q[$] = `{200, 53, 656};

constraint c_unique {
unique {a, b, c};   // 該約束要求a和b和c兩兩之間互不相等
unique {a, b, array}; // 該約束要求a和b和array中的所有值互不相等
unique {array};    // 該約束要求array數組內的5個值互不相等
unique {a, q};    // 該約束要求a隨機出來的值不等于q中的任一值
}

循環約束:在對隊列或者數組進行隨機化的時候,可以使用foreach來對其循環施加約束。

rand int q[$];
constraint c_foreach {
q.size() inside {[3:8]};
  foreach (q[i]) {
   if (i > 0) q[i] > q[i-1]; // 約束q隊列的下一個值總比上一個值大
 }
}

縮位約束:縮位約束會相對復雜一些,但是很好理解。1. 縮位運算:比如對于數組arr[5],arr.sum就是arr[0] + arr[1] + ... + arr[4]。除sum之外,還有product、and、or、xor,分別表示乘積、與、或、異或運算。2. 這些縮減運算的方法的返回值類型,跟隊列或者數組的元素類型一樣,因此當類型不匹配的時候,需要做類型轉換的操作。3. 縮減運算的方法可以可選的加with條件,用來篩選隊列或者數組中的元素。另外關鍵字item表示當前的數組元素,item.index表示當前數組元素的索引

rand bit qbit[$];
rand int qint[$];

constraint c_qbit {
qbit.size() inside {[4:6]};
(qbit.sum with (int'(item))) == 3; // 將當前元素item轉為int類型,并約束所有元素有且只有3個為1
}

constraint c_qint {
qint.size() inside {[5:9]};
(qint.sum with ((item.index < 3) ? item : 0)) == 45; // 約束qint隊列的前三個加起來等于45
}

靜態約束:靜態約束使用的關鍵字static跟靜態變量是一樣的。靜態約束表示的是所有的對象實例都使用的同一個約束,所以使用constraint_mode()進行開關控制的時候具有全局性。

class ictalking;
rand int count;
static constraint c_count {count > 34;}
endclass

module testbench;

initial begin

ictalking ict_obj1 = new();

ictalkingict_obj2=new();

ict_obj1.c_count.constraint_mode(0); // 關掉的之后ict_obj2中的c_count也會失效

... end

endmodule

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 仿真器
    +關注

    關注

    14

    文章

    1016

    瀏覽量

    83647
  • Verilog
    +關注

    關注

    28

    文章

    1345

    瀏覽量

    109996
  • System
    +關注

    關注

    0

    文章

    165

    瀏覽量

    36888
  • 約束
    +關注

    關注

    0

    文章

    82

    瀏覽量

    12718

原文標題:五花八門的SystemVerilog隨機約束

文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    SystemVerilog 的VMM驗證方法學教程教材

    SystemVerilog 的VMM 驗證方法學教程教材包含大量經典的VMM源代碼,可以實際操作練習的例子,更是ic從業人員的絕佳學習資料。SystemVerilog 的VMM 驗證方法
    發表于 01-11 11:21

    驗證方法簡介

    則和指南。驗證方法提供了構建穩健、可靠和完整的驗證環境的方法。驗證方法通過其預定義的庫減少了驗證工作。 驗證方法進一步提供了一個框架,用于簡化覆蓋驅動的
    發表于 02-13 17:03

    設計驗證中的隨機約束

    隨機約束在現代集成電路驗證中已得到國際IC 設計業界的普遍認可,并逐漸開始普及。與傳統的定向測試比較,它在驗證效率、驗證覆蓋率等方面具有諸多優勢。最新公布的Sys
    發表于 12-14 09:54 ?13次下載

    如何利用SystemVerilog仿真生成隨機

    采用SystemVerilog進行仿真則更容易生成隨機數,而且對隨機數具有更強的可控性。對于隨機變量,在SystemVerilog中可通過r
    的頭像 發表于 10-30 10:33 ?1.1w次閱讀
    如何利用<b class='flag-5'>SystemVerilog</b>仿真生成<b class='flag-5'>隨機</b>數

    SystemVerilog中的操作方法

    SystemVerilog提供了幾個內置方法來支持數組搜索、排序等功能。
    的頭像 發表于 10-31 10:10 ?2704次閱讀

    簡述SystemVerilog的各種隨機方法

    我習慣將驗證空間理解為:驗證中原則上需要覆蓋的芯片所有有可能出現的工作狀態的集合。為了探索這片廣袤的驗證空間,驗證的時候搞出了帶有約束隨機測試(constrainted-random testing),并搞了覆蓋率(coverage)作為評估機制。這也是一套成熟可信的工
    的頭像 發表于 01-21 16:59 ?6099次閱讀
    簡述<b class='flag-5'>SystemVerilog</b>的各種<b class='flag-5'>隨機</b>化<b class='flag-5'>方法</b>

    簡述SystemVerilog隨機約束方法

    上一篇文章介紹了SystemVerilog的各種隨機方法,本文將在其基礎上引入SystemVerilog隨機
    的頭像 發表于 01-21 17:03 ?2013次閱讀

    使用SystemVerilog解決數組問題

    數獨是一種非常流行的游戲,數獨本質上也是一個約束問題,所以我們可以讓SystemVerilog約束求解器來幫助我們解決。 約束求解器的精妙之處就是,我們只描述
    的頭像 發表于 03-08 14:06 ?1530次閱讀

    一些有趣的數組相關的SystemVerilog約束

    我們在工作中常常會針對數組施加各式的約束,下面列舉一下有趣的Systemverilog數組約束示例。
    的頭像 發表于 03-08 13:12 ?922次閱讀

    SystemVerilog中“軟約束”與“硬約束”的應用示例

    示例中采用的是“硬約束”,因為定義在類中的約束隨機時指定的內嵌約束“矛盾”,所以導致約束解析器解析隨機
    發表于 03-15 16:56 ?4593次閱讀

    列舉一下有趣的Systemverilog數組約束示例

    上面是最先想到的寫法,但是會報錯,因為SV約束語法不允許使用size()或任何其他隨機值作為索引。
    的頭像 發表于 05-04 17:35 ?991次閱讀

    systemverilog隨機約束implication的概率分析

    在此設計三種不同的隨機先后順序,分析x和y取值的其概率分布。
    的頭像 發表于 05-04 18:24 ?1128次閱讀
    <b class='flag-5'>systemverilog</b><b class='flag-5'>隨機</b><b class='flag-5'>約束</b>implication的概率分析

    一些有趣的數組相關的SystemVerilog約束

    我們在工作中常常會針對數組施加各式的約束,下面列舉一下有趣的**Systemverilog數組約束**示例
    的頭像 發表于 05-30 11:13 ?753次閱讀

    創建約束隨機測試目標

    數據項的順序。 這種方法提供了更多的靈活性和控制。 約束數據項? 默認情況下,sequencers會生成完全隨機的數據項。測試用例編寫者可以控制生成的數據項數量,并向數據項添加約束。為
    的頭像 發表于 06-17 14:06 ?614次閱讀
    創建<b class='flag-5'>約束</b><b class='flag-5'>隨機</b>測試目標

    SV約束隨機化總結

    constraint 約束隨機化類中的變量 在main_phase 之前就已經提前產生一個變量的隨機值。 用法:一般在類中定義一個rand 類型的變量, 然后根據需求寫約束
    的頭像 發表于 12-14 14:30 ?814次閱讀
    SV<b class='flag-5'>約束</b><b class='flag-5'>隨機</b>化總結