約束塊和隨機(jī)變量隨機(jī)模式控制

有些特定場景下,我們可能需要將約束塊或者隨機(jī)變量開啟使能或者關(guān)閉來構(gòu)造工程師們想要的激勵而不影響其他已經(jīng)調(diào)試過的cases,System verilog有兩個task分別對應(yīng)對約束塊和隨機(jī)變量的開關(guān)。

constraint_mode():首先它是內(nèi)嵌的,不能overridden重載。即可以作為一個task也可以作為一個function。

作為task,它的原型如下

task object[.constraint_identifier]::constraint_mode( bit on_off );

作為function,它的原型如下

function int object.constraint_identifier::constraint_mode();

上面的object就是一般定義了constraint block約束塊的對象句柄,一般就是你在system verilog的class類或者相似文件。

Constraint_identifier就是constraint block約束塊名字。

如果此處調(diào)用沒有constraint_identifier這一項那么它會作用到當(dāng)前文件中定義(object)的所有約束塊,當(dāng)然這種用法僅限于被用作task,如果function這樣用會報編譯error的。

如果被用作task當(dāng)實參設(shè)為1時當(dāng)前文件類或者你指定的約束塊是可以完成randomize(),否則是不能的,當(dāng)然默認(rèn)情況下是打開的,只有你需要構(gòu)造特殊用力而不影響其他場景用例時可以選擇關(guān)閉還是開啟。

從function的定義我們可以看出它的返回值是一個整型變量,其實只是返回0或者1。當(dāng)約束塊為active狀態(tài)時(就是能randomize())時返回1,反之返回0。

舉個例子吧

class example;?

?rand unsigned int ?aa_bb; ?

constraint name_exp?{ aa_bb?> 2 * m; };//constraint block here

endclass

function unsigned int?exp_pp( example?p );

if ( p.name_exp.constraint_mode() ) ?

? p.name_exp.constraint_mode(0);//當(dāng)前約束塊被設(shè)置為inactive

else

?? p.name_exp.constraint_mode(1);

?? exp_pp?= p.randomize();

endfunction

else分支最后返回了一個p class中變量aa_bb的值作為這個function的返回值。


好了再來講講rand_mode()吧

rand_mode()用來控制一個隨機(jī)變量是否需要隨機(jī)的開關(guān),在某些異常用例你不需要用到正常用例中對某個隨機(jī)變量值得約束,而是要給它一個特定值,此刻這個家伙就看起來很帥。

它也既可以用作task,也可以用作function。

作為task,它的原型如下

task object[.random_variable]::rand_mode( bit on_off );

作為function,它的原型如下

function int object.random_variable::rand_mode();

上面的object就是一般定義了隨機(jī)變量的的對象句柄,random_variable就是里面的隨機(jī)變量或者被調(diào)用的子類

作為task如果此處調(diào)用沒有random_variable這一項那么它會作用到當(dāng)前文件中定義(object)的隨機(jī)變量或者被調(diào)用的子類,同上,如果function這樣用會報編譯error的。


這里有以下幾點(diǎn)需要注意

1. 如果變量是unpaked數(shù)組,那么你可以利用index選擇性的開關(guān)其中一員的隨機(jī)性,比如

rand logic[16:0] ?aa[19:0];

..aa[i][i].rand_mode(bit on_off)。如果沒有指定具體哪一個就會對所有元素起作用。

注:維數(shù)在變量名聲明之前的為paked array,維數(shù)在變量名聲明之后的為unpaked arrary

bit [7:0]aa; // packed array of scalar bit types

real bb?[7:0]; // unpacked array of real types

2.如果變量是unpaked structure,可以對其中某一元素開關(guān)隨機(jī)性

如:

class packet;

typedef struct {//此處upaked struct不能使用randc

randc int addr = 1 + constant;//但是uppaked struct的元素可以定義為rand和randc

int crc;

rand byte data [] = {1,2,3,4};

} header;

rand header h1;

endclass

packet p1=new;

P1.h1.data.rand_mode(0);//此處的data.

如果沒有指定就對所有元素起作用。

3.如果隨機(jī)變量是一個對象句柄,則只更改該變量的隨機(jī)模式,而不更改該對象中隨機(jī)變量的隨機(jī)模式。

? ? 作為function的定義它的返回值是一個整型變量,也其實只是返回0或者1。當(dāng)約束塊為active狀態(tài)時(就是能randomize())時返回1,反之返回0。

比如class exp;

? rand int aa_v, bb_v;

? ...

?endclass

int cc;exp?exp_a = new;

// Turn off all variables in object

exp_a.rand_mode(0);

// Enable aa_v

exp_a.aa_v.rand_mode(1);//task here

cc?= exp_a.bb_v.rand_mode();//function here.

System verilog本質(zhì)在于隨機(jī)化,更好的控制隨機(jī)化能會為你的場景構(gòu)造起到事半功倍的效果。今天就到這里吧,下次有時間會提供枚舉類型在環(huán)境可重用性和可讀性方面的應(yīng)用講解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容