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

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

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

SystemC的隨機驗證過程是怎樣的?

sanyue7758 ? 來源:處芯積律 ? 2023-08-07 09:43 ? 次閱讀

SystemC是基于C++的系統(tǒng)級設(shè)計語言,兼具描述硬件電路模型和面向?qū)ο蟮某橄竽芰?。?a href="http://www.ttokpm.com/v/tag/137/" target="_blank">芯片設(shè)計開發(fā)中,常用于芯片架構(gòu)的建模、性能仿真和評估、軟硬件聯(lián)合仿真等場景。尤其是在融合TLM2.0事務(wù)級建模方法以后,SystemC的模型也出現(xiàn)事務(wù)級、cycle級等不同抽象等級的劃分,用于不同的場景需求。

隨著基于systemC建模的廣泛適用,對SC模型的驗證也是應(yīng)運而生;正如Systemverilog用于對verilog的驗證。SystemC Verification (SCV)就是SC中的一個驗證庫,其包含了:

transaction-based verification

data introspection

constrainted and weighted randomization

01cc2b1a-3473-11ee-9e74-dac502259ad0.png

這篇文章準備介紹SCV中的約束隨機:constrainted randomization。在systemverilog中隨機約束是CDV的一大利器,SV中具有豐富的隨機表達語法,比如inside、dist、solve before、->、unique等。C/C++中卻不具備如此豐富的約束能力,而SCV作為SC的驗證庫,引入了約束隨機描述。

Basic Randomization

無論是sc內(nèi)建的基本數(shù)據(jù)類型,如sc_int/sc_uint等;還是自定義的struct數(shù)據(jù),都可以使用scv_smart_ptr修飾,進行基本的隨機化操作。常見的用法如下:

//基本數(shù)據(jù)類型隨機
scv_smart_ptr< sc_uint<8> > data; 
data->next(); 
//自定義數(shù)據(jù)結(jié)構(gòu)隨機
struct packet_t { 
int data; 
int array[10]; 
}; 
scv_smart_ptr< packet_t > p; 
// generate a random value and assign it to the data field 
p->data.next(); 


//generate a random value and assign it to the array element with index 3 
p->array[3].next(); 


// generate random values for all fields and all array elements 
p->next(); 


// generate random values for all fields and all array elements, 
//except for the data field
p->data.disable_randomization(); 
p->next();

scv_smart_ptr會例化一個內(nèi)部的隨機對象,使用next方法產(chǎn)生隨機值。
對于自定義符合數(shù)據(jù)結(jié)構(gòu),也可以只針對其中部分參數(shù)進行隨機;不需要隨機的參數(shù),使用disable_randomization關(guān)閉隨機。

Constrained Randomization

上述的簡單約束,可以使用scv_smart_ptr實現(xiàn)。對于其他的復雜約束,則需要借助scv_constraint_base實現(xiàn)。(scv_smart_ptr可以認為是systemverilog中的random函數(shù),而constraint或者solve-before,則必須要在class中實現(xiàn))。
用法如下:

class write_constraint : virtual public scv_constraint_base { 
public: 
scv_smart_ptr< rw_task_if::write_t > write; 
SCV_CONSTRAINT_CTOR(write_constraint) { 
SCV_CONSTRAINT( write->addr() < 0x00FF ); 
SCV_CONSTRAINT( write->addr() != write->data() ); 
} 
}; 
//上面SCV代碼的systemverilog等效格式:
class write_constraint extend scv_constraint_base ; 
rand rw_task_if::write_t  write; 
constraint write_constraint { 
write.addr < 0x00FF; 
write.addr != write.data; 
} 
endclass

在scv_constraint_base擴展出的子類中,需要隨機的參數(shù)仍需要使用scv_smart_ptr修飾。使用SCV_CONSTRAINT_CTOR聲明一段約束,SCV_CONSTRAINT用于添加一條約束表達式。
約束表達式可以支持:算術(shù)表達式(+,-,*,/),關(guān)系表達式(==, !=, >, >=, <, <=),邏輯表達式( !, &&, ||)。約束表達式有三種:

1.SCV_CONSTRAINT代表是一種hard constraint;

2.SCV_SOFT_CONSTRAINT表達一種soft constraint;

3. SCV_BASE_CONSTRAINT代表基類中的約束。

此處的hard和soft constraint含義和systemverilog中soft修飾隨機的含義基本一致。

上述的隨機類定義好后,便可以進行實例化和隨機。前面提到的disable_randomization仍然可以使用,并且統(tǒng)一使用next方法進行隨機生成。

write_constraint c("write constraint"); 
for (int i=0; i<2; ++i) { 
c.next(); 
cout << *c.write << endl; 
} 


write_constraint c("write constraint"); 
c.write->addr->disable_randomization(); 
for (int i=0; i<2; ++i) { 
c.write->addr = i; 
c.next(); 
cout << *c.write << endl; 
}

Weight and Biased Randomization

在systemverilog隨機約束中,經(jīng)常會使用到inside、dist,用來表達帶有權(quán)重的隨機。同樣,SCV支持指定范圍隨機和帶權(quán)重的隨機,通過scv_bag實現(xiàn)。scv_bag可以用來收集需要范圍隨機信息以及權(quán)重信息。
單值權(quán)重設(shè)置使用scv_bag表達,實例:

scv_bag bag; 
bag.push(1,60); 
bag.push(2,40); 
scv_smart_ptr data; 
data->set_mode(bag); 
data->next(); 
//systemverilog的等效表達
rand int data;
data dist {1:/60,2:/40};

在scv_bag收集好權(quán)重信息后,通過set_mode函數(shù)傳遞給參數(shù)的隨機對象即可。范圍權(quán)重設(shè)置使用scv_bag< pair< int,int> >表達,實例:

scv_smart_ptr data; 
scv_bag< pair< int,int> > distribution; 
distribution.push( pair(0,1), 40); 
distribution.push( pair(2,10), 60); 
data->set_mode(distribution); 
data->next(); 
//systemverilog的等效表達
rand int data;
data dist {[0:1]:/60,[2:10]:/40};

從上面可以看出如果需要添加范圍約束和權(quán)重約束,就必須要定義scv_bag,添加約束范圍和權(quán)重,并通過set_mode設(shè)置,稍顯復雜。因此SCV中引入keep_only和keep_out方法,用于添加隨機約束范圍,類似systemverilog中的inside和~inside。

scv_smart_ptr i; 
i->keep_only(0,4); 
i->keep_out(2); 
i->next(); 
// generate a value among { 0, 1, 3, 4 } 
//如果使用scv_bag方式,方法如下:
scv_smart_ptr i; 
scv_bag bag; 
bag.add(0); bag.add(1); bag.add(3);bag.add(4);  
i->next();

keep_only和keep_out除了可以接受固定數(shù)值外,還可以接收list類型的變量。

scv_smart_ptr i; 
list i_range;
i_range.push_back(0);
i_range.push_back(4);
i->keep_only(i_range); 
i->keep_out(2); 
i->next(); 
// generate a value among { 0, 3, 4 }

總結(jié)來看,設(shè)置隨機約束有如下方式:

set_mode方法

keep_only、keep_out方法

SCV_CONSTRAINT約束表達式

set_mode和keep_only/out的隨機約束設(shè)置會進行覆蓋。使用reset_distribution方法可以取消set_mode和keep_only/out方法設(shè)置的隨機約束。實例如下:

scv_smart_ptr i; 
i->keep_only(0,4); 
i->keep_out(2); 
i->next(); // generate a value among { 0, 1, 3, 4 } 
 
scv_bag b; 
b.add(2); b.add(7); 
i->set_mode(b); 
i->next(); // generate a value among {2,7} 


i->reset_distribution(); 
i->next(); // generate a value between INT_MIN and INT_MAX.

寫在最后

SCV 約束除了作為SC模型的驗證隨機約束外,一方面可以把SC模型階段的驗證激勵復用到中后期的RTL驗證;

0203e56e-3473-11ee-9e74-dac502259ad0.png

另一方面還可以在CPU核相關(guān)的C語言case中使用,由于SCV是基于C/C++語言,因此可以比較容易地和C based case結(jié)合,具體融合方式需要一些轉(zhuǎn)接件,這個后續(xù)有機會再做介紹。





審核編輯:劉清

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

    關(guān)注

    15

    文章

    980

    瀏覽量

    54620
  • 仿真器
    +關(guān)注

    關(guān)注

    14

    文章

    1008

    瀏覽量

    83441
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134120
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    384

    瀏覽量

    59519
  • Verilog語言
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    8192

原文標題:聊聊SystemC的驗證隨機

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

收藏 人收藏

    評論

    相關(guān)推薦

    [1.6.1]--1.6.1學習視頻-典型隨機過程

    隨機過程
    jf_75936199
    發(fā)布于 :2023年03月09日 01:01:58

    如何在ModelSim下用SystemC的做驗證?

    如何在ModelSim下編譯和仿真SystemC的設(shè)計?如何在ModelSim下用SystemC的做驗證?SystemC作為一種系統(tǒng)級設(shè)計與驗證
    發(fā)表于 03-01 11:30

    如何基于uvm方法學采用systemc進行IC驗證?

    請教各位大佬,UVM是基于sv的驗證方法學,如果采用systemc語言編程,如何實現(xiàn)?
    發(fā)表于 11-07 15:30

    怎樣去描述RRM測試中的隨機接入過程?

    怎樣去介紹隨機接入過程隨機接入過程包括哪些步驟?RRM測試中對隨機接入有哪些硬性規(guī)定?
    發(fā)表于 04-15 06:42

    硬件驗證語言——簡介

    HDL 中的易于位級操作的特性。許多 HVL 將提供受約束的隨機激勵生成和功能覆蓋構(gòu)造,以協(xié)助進行復雜的硬件驗證。如果 HDL 意味著設(shè)計,那么 HVL 意味著驗證那些 HDL 代碼。 現(xiàn)在問題來了
    發(fā)表于 02-16 13:36

    SystemC進行SoC的系統(tǒng)級設(shè)計與仿真

    IC 技術(shù)已發(fā)展到SoC 階段,系統(tǒng)級設(shè)計、仿真和驗證已成為IC 設(shè)計面臨的巨大挑戰(zhàn)。SystemC 是新興的系統(tǒng)級設(shè)計語言,為復雜系統(tǒng)的設(shè)計與驗證提供了解決方案。本文介紹SystemC
    發(fā)表于 05-18 13:44 ?28次下載

    設(shè)計驗證中的隨機約束

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

    基于SystemC的系統(tǒng)驗證研究和應(yīng)用

    視頻編解碼芯片中運動估計與補償單元(MECU)的算法復雜,使用傳統(tǒng)硬件描述語言建立模型和模型驗證過程繁瑣耗時,為了縮短芯片驗證時間,本文針對MECU模塊提出了基于SystemC語言
    發(fā)表于 02-24 12:07 ?16次下載

    應(yīng)用隨機過程

    應(yīng)用隨機過程是現(xiàn)代應(yīng)用隨機過程教材,內(nèi)容從入門知識到學術(shù)前沿,包括預(yù)備知識、隨機過程的基本類型、
    發(fā)表于 03-19 08:47 ?0次下載

    數(shù)字專用集成電路設(shè)計中的SystemC建模驗證方法

    數(shù)字專用集成電路設(shè)計中的SystemC建模驗證方法
    發(fā)表于 07-17 16:36 ?31次下載

    SystemC 和SystemVerilog的比較

    SystemC 和 SystemVerilog 這兩種語言而言, SystemC 是C++在硬件支持方面的擴展,而 SystemVerilog 則繼承了 Verilog,并對 Verilog 在面向?qū)ο蠛?b class='flag-5'>驗證能力方面進行了擴
    發(fā)表于 08-16 10:52 ?5311次閱讀

    SystemC驗證方法和流程介紹

    SystemC 是由C++衍生而來,本質(zhì)是在C++的基礎(chǔ)上添加了硬件擴展庫和仿真核,這使SystemC 可以在不同抽象級對復雜電子系統(tǒng)建模。
    發(fā)表于 07-19 11:55 ?4933次閱讀
    <b class='flag-5'>SystemC</b> 的<b class='flag-5'>驗證</b>方法和流程介紹

    采用SystemC ESL設(shè)計的九個理由

    支持SystemC的電子系統(tǒng)級(ESL)設(shè)計和驗證環(huán)境旨在設(shè)計,分析,優(yōu)化和驗證片上系統(tǒng)(SoC)平臺模型。這樣的環(huán)境構(gòu)成了已建立的RTL實現(xiàn)流程的前端。
    的頭像 發(fā)表于 10-03 17:05 ?4964次閱讀

    看看使用芯片驗證隨機帶來的六宗罪

    以前看到不少驗證技術(shù)書籍都在說驗證環(huán)境中隨機怎么怎么好,然后為了隨機,UVM,SV 提供了什么什么支持。
    的頭像 發(fā)表于 04-10 11:21 ?584次閱讀

    怎樣設(shè)計和驗證TRL校準件以及TRL校準的具體過程

    怎樣設(shè)計和驗證TRL 校準件以及TRL 校準的具體過程
    發(fā)表于 12-14 09:40 ?0次下載