SystemC是基于C++的系統(tǒng)級(jí)設(shè)計(jì)語(yǔ)言,兼具描述硬件電路模型和面向?qū)ο蟮某橄竽芰?。?a href="http://www.wenjunhu.com/v/tag/137/" target="_blank">芯片設(shè)計(jì)開(kāi)發(fā)中,常用于芯片架構(gòu)的建模、性能仿真和評(píng)估、軟硬件聯(lián)合仿真等場(chǎng)景。尤其是在融合TLM2.0事務(wù)級(jí)建模方法以后,SystemC的模型也出現(xiàn)事務(wù)級(jí)、cycle級(jí)等不同抽象等級(jí)的劃分,用于不同的場(chǎng)景需求。
隨著基于systemC建模的廣泛適用,對(duì)SC模型的驗(yàn)證也是應(yīng)運(yùn)而生;正如Systemverilog用于對(duì)verilog的驗(yàn)證。SystemC Verification (SCV)就是SC中的一個(gè)驗(yàn)證庫(kù),其包含了:
transaction-based verification
data introspection
constrainted and weighted randomization
這篇文章準(zhǔn)備介紹SCV中的約束隨機(jī):constrainted randomization。在systemverilog中隨機(jī)約束是CDV的一大利器,SV中具有豐富的隨機(jī)表達(dá)語(yǔ)法,比如inside、dist、solve before、->、unique等。C/C++中卻不具備如此豐富的約束能力,而SCV作為SC的驗(yàn)證庫(kù),引入了約束隨機(jī)描述。
Basic Randomization
無(wú)論是sc內(nèi)建的基本數(shù)據(jù)類(lèi)型,如sc_int/sc_uint等;還是自定義的struct數(shù)據(jù),都可以使用scv_smart_ptr修飾,進(jìn)行基本的隨機(jī)化操作。常見(jiàn)的用法如下:
//基本數(shù)據(jù)類(lèi)型隨機(jī) scv_smart_ptr< sc_uint<8> > data; data->next(); //自定義數(shù)據(jù)結(jié)構(gòu)隨機(jī) 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會(huì)例化一個(gè)內(nèi)部的隨機(jī)對(duì)象,使用next方法產(chǎn)生隨機(jī)值。
對(duì)于自定義符合數(shù)據(jù)結(jié)構(gòu),也可以只針對(duì)其中部分參數(shù)進(jìn)行隨機(jī);不需要隨機(jī)的參數(shù),使用disable_randomization關(guān)閉隨機(jī)。
Constrained Randomization
上述的簡(jiǎn)單約束,可以使用scv_smart_ptr實(shí)現(xiàn)。對(duì)于其他的復(fù)雜約束,則需要借助scv_constraint_base實(shí)現(xiàn)。(scv_smart_ptr可以認(rèn)為是systemverilog中的random函數(shù),而constraint或者solve-before,則必須要在class中實(shí)現(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擴(kuò)展出的子類(lèi)中,需要隨機(jī)的參數(shù)仍需要使用scv_smart_ptr修飾。使用SCV_CONSTRAINT_CTOR聲明一段約束,SCV_CONSTRAINT用于添加一條約束表達(dá)式。
約束表達(dá)式可以支持:算術(shù)表達(dá)式(+,-,*,/),關(guān)系表達(dá)式(==, !=, >, >=, <, <=),邏輯表達(dá)式( !, &&, ||)。約束表達(dá)式有三種:
1.SCV_CONSTRAINT代表是一種hard constraint;
2.SCV_SOFT_CONSTRAINT表達(dá)一種soft constraint;
3. SCV_BASE_CONSTRAINT代表基類(lèi)中的約束。
此處的hard和soft constraint含義和systemverilog中soft修飾隨機(jī)的含義基本一致。
上述的隨機(jī)類(lèi)定義好后,便可以進(jìn)行實(shí)例化和隨機(jī)。前面提到的disable_randomization仍然可以使用,并且統(tǒng)一使用next方法進(jìn)行隨機(jī)生成。
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ī)約束中,經(jīng)常會(huì)使用到inside、dist,用來(lái)表達(dá)帶有權(quán)重的隨機(jī)。同樣,SCV支持指定范圍隨機(jī)和帶權(quán)重的隨機(jī),通過(guò)scv_bag實(shí)現(xiàn)。scv_bag可以用來(lái)收集需要范圍隨機(jī)信息以及權(quán)重信息。
單值權(quán)重設(shè)置使用scv_bag表達(dá),實(shí)例:
scv_bagbag; bag.push(1,60); bag.push(2,40); scv_smart_ptr data; data->set_mode(bag); data->next(); //systemverilog的等效表達(dá) rand int data; data dist {1:/60,2:/40};
在scv_bag收集好權(quán)重信息后,通過(guò)set_mode函數(shù)傳遞給參數(shù)的隨機(jī)對(duì)象即可。范圍權(quán)重設(shè)置使用scv_bag< pair< int,int> >表達(dá),實(shí)例:
scv_smart_ptrdata; 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的等效表達(dá) rand int data; data dist {[0:1]:/60,[2:10]:/40};
從上面可以看出如果需要添加范圍約束和權(quán)重約束,就必須要定義scv_bag,添加約束范圍和權(quán)重,并通過(guò)set_mode設(shè)置,稍顯復(fù)雜。因此SCV中引入keep_only和keep_out方法,用于添加隨機(jī)約束范圍,類(lèi)似systemverilog中的inside和~inside。
scv_smart_ptri; 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ù)值外,還可以接收l(shuí)ist類(lèi)型的變量。
scv_smart_ptri; 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é)來(lái)看,設(shè)置隨機(jī)約束有如下方式:
set_mode方法
keep_only、keep_out方法
SCV_CONSTRAINT約束表達(dá)式
set_mode和keep_only/out的隨機(jī)約束設(shè)置會(huì)進(jìn)行覆蓋。使用reset_distribution方法可以取消set_mode和keep_only/out方法設(shè)置的隨機(jī)約束。實(shí)例如下:
scv_smart_ptri; 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.
寫(xiě)在最后
SCV 約束除了作為SC模型的驗(yàn)證隨機(jī)約束外,一方面可以把SC模型階段的驗(yàn)證激勵(lì)復(fù)用到中后期的RTL驗(yàn)證;
另一方面還可以在CPU核相關(guān)的C語(yǔ)言case中使用,由于SCV是基于C/C++語(yǔ)言,因此可以比較容易地和C based case結(jié)合,具體融合方式需要一些轉(zhuǎn)接件,這個(gè)后續(xù)有機(jī)會(huì)再做介紹。
審核編輯:劉清
-
芯片設(shè)計(jì)
+關(guān)注
關(guān)注
15文章
1023瀏覽量
54931 -
仿真器
+關(guān)注
關(guān)注
14文章
1019瀏覽量
83803 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7608瀏覽量
137111 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59849 -
Verilog語(yǔ)言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8277
原文標(biāo)題:聊聊SystemC的驗(yàn)證隨機(jī)
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論