
有些特定場景下,我們可能需要將約束塊或者隨機(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)用講解。