記錄幾個SystemVerilog的語法——覆蓋率

1. 前言

通常說的覆蓋率有兩種類型:code coverage(代碼覆蓋率)和functional coverage(功能覆蓋率)。代碼覆蓋率是使用EDA工具自動從設計代碼里提取出來的,功能覆蓋率是用戶指定的,用于衡量測試設計意圖和功能進展。因此,功能覆蓋率有兩個關鍵點:

  • 它是用于指定的,而不是根據設計代碼自動推測生成的;
  • 它是基于設計需求,獨立于實際設計代碼和結構;

覆蓋率主要由覆蓋率組(covergroup)、覆蓋率點(coverage point)、交叉覆蓋率(cross coverage)、覆蓋率選項(coverage option)和覆蓋率方法(coverage method)組成的。

2. covergroup

Covergroup用于構建覆蓋率模型,它將覆蓋率模型和規范封裝起來,內部可以包含以下組件:

  • 用于coverage point同步和采樣的時鐘事件;
  • Coverage points;
  • Cross coverage;
  • 可選的參數;
  • Coverage options

Covergroup是用戶定義的類型,可以定義在package、module、program、interface、checker或class里面。類似于class,covergroup可以在多處地方調用new()構造函數例化。如下所示,covegroup name是cg,通過new()構造函數,創建了cg的例化cg_inst。

covergroup cg; ... endgroup

cg cg_inst = new;

covergroup可以通過new(xx)構造函數傳遞參數進去,參數的類型只能是ef(會被處理成const ref)或input,而不能時output或inout。

可以通過@event或sample()方法來指定coverage何時采樣。Covergroup可以包含一個或多個coverage points。Coverage point可以覆蓋一個變量或一個表達式。Coverage point內部可以包含一組bins(倉),用于采集values或value transitions。用于采集value 集合的bin稱為state bins,用于采集value transitions的bin稱為transition bins

也可以將coverage group嵌入到class定義中,這是一種常見的做法,它提供了一種簡單的方式去覆蓋類中的屬性,可以保護類的封裝性,這種方式稱作embedded covergroup declaration。

3. coverage point

Coverpoint表達式(包括iff condition)的采樣是發生在covergroup被采樣的時候。Coverpoint會創建一個層次化范圍且可選的labeled。如果有使用label,那么該label就是coverage point的名字。該名字也可以用于cross coverage 和訪問coverpoint中的方法。如果沒有指定label且coverpoint只和一個單一變量關聯,那么該變量名可以是coverpoint的名字,其它情況,由工具實現定義,但該自動生成的名字只是用于coverpoint報告,不能被其它地方語言引用。

Coverpoint bin將一個name和count與一組value或value transition 序列聯系起來,當一個bin指定的value或value transition 序列每一次滿足時,相應的count加1。每一個bins的后面都可以跟著iff construct來指定該bins是否滿足采樣條件,如果是false,那么count肯定不會增加的。Transition bin在每一個sample中,最多只能增加1,不管同時有幾個hit同一個bins。

bins允許對于給定范圍列表的每一個value創建一個獨立的bin,可以在bin name后面加上[]就可以了,或者如果要把給定范圍列表分配到幾個bin內,可以在[]里加上正整數expression。如果bins的固定個數小于values的指定個數,那么盡力采用均分,無法均分,最后一個全部兜著。如果bins的個數大于values的指定個數,那么有一些bins將會是空的。

bins允許對于范圍列表創建一個單一的bin,也就是bin name的等號后面使用{}指定一組values。

對于范圍列表,允許使用[ expression : $ ] or [ $ : expression ]。

如果沒有指定bins的話,coverpoint bin會自動創建,創建的最大個數為auto_bin_max(coverage option)指定的。

default可以用于替代沒有被顯式定義的bins中指定的其它值,對于coverpoint覆蓋率的計算不考慮default bin,同樣的,cross coverage也不考慮default。default sequence用于替代沒有被顯式定義的transition bins中指定的其它transition值。defualt或者defualt sequence bin不能被顯式ignored。如果一個bins被指定為ignore_bins且被指定為default或defualt sequence,那么會報錯的。

Wildcard bin使得所有的X、Z或?可以被當作0或1。如下:

wildcard bins g12_15 = { 4'b11?? };

如果采樣值有1100、1101、1110和1111,那么g12_15命中的次數就增加。

Wildcard bins也可以用于separate bins,例如:

wildcard bins g12_15_array[] = { 4'b11?? };

上述會創建1100、1101、1110和1111這4個bin。

Wildcard bins也可以用于transition bins,例如:

wildcard bins T0_3 = (2'b0x => 2'b1x);

每當有下面的value transitions,T0_3 bin的計數會增加,有點類似于(0,1=>2,3)方法。

00 => 10、00 => 11、01 => 10、01 => 11

3.1. Transition bins的指定方式

value1(range_list1) => value2(range_list2):表示value1的下一次sample要是value2;如果有用到range_list,那么SV會拓展range_list里的值其它值進行轉換,比如:

1,5 => 6, 7

那么它的效果相當于:( 1=>6 ), ( 1=>7 ), ( 5=>6 ), ( 5=>7 )

trans_item [* repeat_range ]: 表示trans_item要重復repeat_range次,比如:

3 [* 5]

上述等價于:3=>3=>3=>3=>3

還可以指定重復的范圍,比如:

3 [* 3:5]

上述等價于:( 3=>3=>3 ), ( 3=>3=>3=>3 ), ( 3=>3=>3=>3=>3 )

trans_item [-> repeat_range],或trans_item [= repeat_range]:表示trans_item出現個數,中間不管有什么其它值。比如:

3 [-> 3]

上述等于:...=>3...=>3...=>3,(...)代表任何不包含值為3的轉換。在比如:

1 => 3 [ -> 3] => 5

上述等于:1...=>3...=>3...=>3 =>5

4. cross coverage

Coverage group可以指定在兩個或多個coverpoints或變量之間進行cross coverage。如果指定的是變量,那么SV會隱式地幫它定義一個coverpoint,然后再參與到cross。因此cross coverage的輸入本質上只有coverpoint。另外expression不能直接用于cross中,只能先將expression定義成coverpoint,然后再用cross。

Cross coverage提供了一個可選的label,該label會為cross中定義的bins創建一個層次化范圍。Cross coverage也可用iff來選擇是否在該次統計coverage。

對于coverpoint中定義為default、ignored或illegal的bins,在cross中不會創建bins的。Cross coverage只允許用同一個coverage group中的coverage points進行cross,引用其它group的coverpoint將會導致編譯錯誤。

除了cross自動生成的bins之外,SV允許用戶定義指定的cross coverage bins。可以使用bin select 方式來定義用戶自定義的bins。用戶自定義cross bins和自動生成 bins可以在同一個cross中生成的。只要沒有被用戶定義的cross bin截斷的其它自動生成bins都會保持。如下例子:

int i,j;

covergroup ct;

??? coverpoint i { bins i[] = { [0:1] }; }

??? coverpoint j { bins j[] = { [0:1] }; }

??? x1: cross i,j;

??? x2: cross i,j {

??????? bins i_zero = binsof(i) intersect { 0 };

??? }

endgroup

x1 cross的結果為:

<i[0],j[0]>

<i[1],j[0]>

<i[0],j[1]>

<i[1],j[1]>

x2 cross的結果為:

i_zero? // user-specified bin for <i[0],j[0]> and <i[0],j[1]>

<i[1],j[0]>? // an automatically generated bin that is retained

<i[1],j[1]>? // an automatically generated bin that is retained

binsof語法產生它里面表達式的bins,該表達式可以是coverage point(顯式)或單個變量(隱式生成coverpoint),或coverpoint bin。生成的結果bins可以進一步選擇,通過intersect語法來選擇或排除某些bins的值。Bins值的選擇可以使用逗號分隔來選取多個,因此可以選擇1個value、一個范圍value、也可以范圍值。例如:

[ $ : value ] => The set of values less than or equal to value

[ value : $ ] => The set of values greater or equal to value

bins的選擇可以和其它bins的的選擇進行邏輯運算(&&, ||)來進一步選擇的。

5. coverage option

Coverage options可以用于控制covergroup、coverpoint和cross的行為。有兩種options類型:一種用于指定covergroup instance的行為,另一種用于指定covergroup type的行為。如果對于同樣option,指定多個值會報錯的。

5.1 Covergroup instance options

下表為instance-specific covergroup options及其描述。這些options可以在初始化instance-specific options時指定不同的值。這些初始化option value只影響對應的instance。

Instance-specific options可以在covergroup定義的時候set進去。在covergroup定義時設置這些options的語法如下:

option.member_name = expression;

每一個covergroup、coverpoint或corss內部都自帶有option這個成員變量。covergroup定義時,內部的option賦值語句是在該covergroup例化時生效的。per_instance和get_inst_coverage options只能在covergroup定義時設置。auto_bin_max和detect_overlap options只能在covergroup和coverpoint定義時生效。其它的instance-specific options可以在covergroup例化之后,通過賦值來設置的。下表總結了instance options在不同語法層次(covergroup、coverpoint或cross)的總結。所有的instance options可以在covergroup層次指定。除了weight、goal、comment和per_instance options,所有其它options在covergroup設置后,也作為該covergroup內部所有coverpoints和crosses的相應options的默認值。當然獨立的coverpoints或crosses可以覆蓋這些默認值。weight、goal、comment和per_instance options在covergroup層次設置時,不會影響更低層次(coverpoint和cross)相應options的默認值。

5.2 Covergroup type options

下表列出的options描述covergroup type整體的屬性。它們就像是class中的static data members一樣,對于所有的instances都起作用的。

上述提到的covergroup type options可以在covergroup定義時設置,語法如下:

type_option.member_name = constant_expression;

type_option是每個covergroup、coverpoint和cross內建的static 成員。不同instances不能對type_options賦不同的值。這些options只能在初始化時通過常數表達式來設置。Strobe type option只能在covergroup定義時設置,其它type options可以在仿真進行中賦值,通過::方式來的。如下:

covergroup gc @(posedge clk) ;

??? a : coverpoint a_var;

??? b : coverpoint b_var;

endgroup

...

// Set the comment for all covergroups of type "gc"

gc::type_option.comment = "Here is a comment for covergroup g1";

// Set the weight for coverpoint "a" of all covergroups of type gc

gc::a::type_option.weight = 3;

gc g1 = new;

下表列出了不同層次的type options可以是否被設置。covergroup層次的設置不影響到底下層次的設置。

6. coverage method

covergroup提供了一些coverage方法,這些方法可以在任何時刻被調用:

get_coverage()返回type coverage,它包含了所有該type例化出來的coverage累積,它是static方法,可以用::操作符和.操作符來引用。get_inst_coverage()返回指定instance的coverage,它只能對應的instance有關聯,不是static方法,因此只能用.操作符。另外,covergroup里的sample()函數其實可以使用with關鍵字來override的。

SV提供了以下的系統方法去幫助管理覆蓋率數據收集:

  • $set_coverage_db_name ( filename ):設置覆蓋率數據庫的文件名,在仿真運行結束時將覆蓋率信息保存到該數據庫中。
  • $load_coverage_db ( filename ):從給定的文件名加載所有coverage group類型的累積覆蓋率信息。
  • $get_coverage ( ):返回0~100范圍內所有coverage group類型的總體覆蓋率的實數。這個數字是按照前面描述的方法計算的。

7. coverage computation

關于覆蓋率的計算,請看這篇文章《Systemverilog覆蓋率的合并和計算方式_覆蓋率merge-CSDN博客》。

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

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

相關文章

深度學習基礎—2

第一章、參數初始化 我們在構建網絡之后&#xff0c;網絡中的參數是需要初始化的。我們需要初始化的參數主要有權重和偏置&#xff0c;偏重一般初始化為 0 即可&#xff0c;而對權重的初始化則會更加重要&#xff0c;我們介紹在 PyTorch 中為神經網絡進行初始化的方法。 1.1 常…

PyTorch深度學習快速入門學習總結(三)

現有網絡模型的使用與調整 VGG — Torchvision 0.22 documentation VGG 模型是由牛津大學牛津大學&#xff08;Oxford University&#xff09;的 Visual Geometry Group 于 2014 年提出的卷積神經網絡模型&#xff0c;在 ImageNet 圖像分類挑戰賽中表現優異&#xff0c;以其簡…

是否需要買一個fpga開發板?

糾結要不要買個 FPGA 開發板&#xff1f;真心建議搞一塊&#xff0c;尤其是想在數字電路、嵌入式領域扎根的同學&#xff0c;這玩意兒可不是可有可無的擺設。入門級的選擇不少&#xff0c;全新的像 Cyclone IV、Artix 7 系列&#xff0c;幾百塊就能拿下&#xff0c;要是去二手平…

【模型細節】MHSA:多頭自注意力 (Multi-head Self Attention) 詳細解釋,使用 PyTorch代碼示例說明

MHSA:使用 PyTorch 實現的多頭自注意力 (Multi-head Self Attention) 代碼示例&#xff0c;包含詳細注釋說明&#xff1a;線性投影 通過三個線性層分別生成查詢(Q)、鍵(K)、值(V)矩陣&#xff1a; QWq?x,KWk?x,VWv?xQ W_qx, \quad K W_kx, \quad V W_vxQWq??x,KWk??x…

PGSQL運維優化:提升vacuum執行時間觀測能力

本文是 IvorySQL 2025 生態大會暨 PostgreSQL 高峰論壇上的演講內容&#xff0c;作者&#xff1a;NKYoung。 6 月底濟南召開的 HOW2025 IvorySQL 生態大會上&#xff0c;我在內核論壇分享了“提升 vacuum 時間觀測能力”的主題&#xff0c;提出了新增統計信息的方法&#xff0c…

神奇的數據跳變

目的 上周遇上了一個非常奇怪的問題,就是軟件的數據在跳變,本來數據應該是158吧,數據一會變成10,一會又變成158,數據在不斷地跳變,那是怎么回事?? 這個問題非常非常的神奇,讓人感覺太不可思議了。 這是這段時間,我遇上的最神奇的事了,沒有之一,最神奇的事,下面…

【跨國數倉遷移最佳實踐3】資源消耗減少50%!解析跨國數倉遷移至MaxCompute背后的性能優化技術

本系列文章將圍繞東南亞頭部科技集團的真實遷移歷程展開&#xff0c;逐步拆解 BigQuery 遷移至 MaxCompute 過程中的關鍵挑戰與技術創新。本篇為第3篇&#xff0c;解析跨國數倉遷移背后的性能優化技術。注&#xff1a;客戶背景為東南亞頭部科技集團&#xff0c;文中用 GoTerra …

【MySQL集群架構與實踐3】使用Dcoker實現讀寫分離

目錄 一. 在Docker中安裝ShardingSphere 二 實踐&#xff1a;讀寫分離 2.1 應用場景 2.2 架構圖 2.3 服務器規劃 2.4 啟動數據庫服務器 2.5. 配置讀寫分離 2.6 日志配置 2.7 重啟ShardingSphere 2.8 測試 2.9. 負載均衡 2.9.1. 隨機負載均衡算法示例 2.9.2. 輪詢負…

maven的阿里云鏡像地址

在 Maven 中配置阿里云鏡像可以加速依賴包的下載&#xff0c;尤其是國內環境下效果明顯。以下是阿里云 Maven 鏡像的配置方式&#xff1a; 配置步驟&#xff1a;找到 Maven 的配置文件 settings.xml 全局配置&#xff1a;位于 Maven 安裝目錄的 conf/settings.xml用戶級配置&am…

大語言模型信息抽取系統解析

這段代碼實現了一個基于大語言模型的信息抽取系統&#xff0c;能夠從金融和新聞類文本中提取結構化信息。下面我將詳細解析整個代碼的結構和功能。1. 代碼整體結構代碼主要分為以下幾個部分&#xff1a;模式定義&#xff1a;定義不同領域(金融、新聞)需要抽取的實體類型示例數據…

Next實習項目總結串聯講解(一)

下面是一些 Next.js 前端面試中常見且具深度的問題&#xff0c;按照邏輯模塊整理&#xff0c;同時提供示范回答建議&#xff0c;便于你條理清晰地展示理解與實踐經驗。 ? 面試講述結構建議 先講 Next.js 是什么&#xff0c;它為什么比 React 更高級。(支持 SSR/SSG/ISR,提升S…

React開發依賴分析

1. React小案例&#xff1a; 在界面顯示一個文本&#xff1a;Hello World點擊按鈕后&#xff0c;文本改為為&#xff1a;Hello React 2. React開發依賴 2.1. 開發React必須依賴三個庫&#xff1a; 2.1.1. react: 包含react所必須的核心代碼2.1.2. react-dom: react渲染在不同平…

工具(一)Cursor

目錄 一、介紹 二、如何打開文件 1、從idea跳轉文件 2、單獨打開項目 三、常見使用 1、Chat 窗口 Ask 對話模式 1.1、使用技巧 1.2 發送和使用 codebase 發送區別 1.3、問題快速修復 2、Chat 窗口 Agent 對話模式 2.1、agent模式功能 2.2、Chat 窗口回滾&撤銷 2.3…

Prompt編寫規范指引

1、&#x1f4d6; 引言 隨著人工智能生成內容&#xff08;AIGC&#xff09;技術的快速發展&#xff0c;越來越多的開發者開始利用AIGC工具來輔助代碼編寫。然而&#xff0c;如何編寫有效的提示詞&#xff08;Prompt&#xff09;以引導AIGC生成高質量的代碼&#xff0c;成為了許…

自我學習----繪制Mark點

在PCB的Layout過程中我們需在光板上放置Mark點以方便生產時的光學定位&#xff08;三點定位&#xff09;&#xff1b;我個人Mark點繪制步驟如下&#xff1a; layer層&#xff1a;1.放置直徑1mm的焊盤&#xff08;無網絡連接&#xff09; 2.放置一個圓直徑2mm&#xff0c;圓心與…

2025年財稅行業拓客破局:小藍本財稅版AI拓客系統助力高效拓客

2025年&#xff0c;在"金稅四期"全面實施的背景下&#xff0c;中國財稅服務市場迎來爆發式增長&#xff0c;根據最新的市場研究報告&#xff0c;2025年中國財稅服務行業產值將達2725.7億元。然而&#xff0c;行業高速發展的背后&#xff0c;80%的財稅公司卻陷入獲客成…

雙向鏈表,對其實現頭插入,尾插入以及遍歷倒序輸出

1.創建一個節點&#xff0c;并將鏈表的首節點返回創建一個獨立節點&#xff0c;沒有和原鏈表產生任何關系#include "head.h"typedef struct Node { int num; struct Node*pNext; struct Node*pPer; }NODE;后續代碼&#xff1a;NODE*createNode(int value) {NODE*new …

2025年自動化工程與計算機網絡國際會議(ICAECN 2025)

2025年自動化工程與計算機網絡國際會議&#xff08;ICAECN 2025&#xff09; 2025 International Conference on Automation Engineering and Computer Networks一、大會信息會議簡稱&#xff1a;ICAECN 2025 大會地點&#xff1a;中國柳州 審稿通知&#xff1a;投稿后2-3日內通…

12.Origin2021如何繪制誤差帶圖?

12.Origin2021如何繪制誤差帶圖?選中Y3列→點擊統計→選擇描述統計→選擇行統計→選擇打開對話框輸入范圍選擇B列到D列點擊輸出量→勾選均值和標準差Control選擇下面三列點擊繪圖→選擇基礎2D圖→選擇誤差帶圖雙擊圖像→選擇符號和顏色點擊第二個Sheet1→點擊誤差棒→連接選擇…