SV中的隨機化

2021-09-06 22:25:38 字數 1742 閱讀 1394

sv搭建testbench的關鍵概念:crt(constraint random test),測試集的隨機化。

由於物件class由資料和操作組成,所以對資料的隨機化一般放在乙個class內。(對環境或環境的配置也可以反映在配置引數的隨機化上)

乙個constraint包括兩部分:rand/randc變數宣告,constraint約束塊。其中randc會在重複之前,週期性取值,constraint約束塊中的變數至少有乙個rand/randc

變數,constraint約束塊必須在{}內,用;來表示多個約束。約束塊是一種宣告性的**,並行執行。

sv中的randomize函式有兩種引用方法:

1)直接用任意乙個class型別的物件引用,作用在整個class的rand/randc型別變數上。 this.randomize(var),只隨機var,但是pre/post_randomize也會被呼叫

obj.randomize(null),此時的randomize只是作為乙個checker,檢查solver是否成功,不是作為乙個generator。現有值符合constraint,success返回1,failed返回0。

2)std::randomize(,,,) with {} ,其中()內的變數便是需要random的variable,with表示一些random constraint

success = std::randomize(a,b,c) with    //關係操作符必須分開來寫

2)constraint   length     //約束塊內不能有賦值語句,相反應該用關係運算子

3)constraint   c_dist       //:=後表示權重---相等

dst_dist ;}}   //:/後表示權重---比例

4)constraint   c_rang ;                       //inside:low-high

b inside ;                      //$可以表示邊界

!(c inside ); }               //加()可以加!表示非

5)constraint   c_io ; }  //--->if--else

6)constraint   c_xy 

7)assert (t.randmize() with )

隨機化的開關控制:

rand bit[7:0] length;

p.length.rand_mode(0);    //設定包長為非隨機值 

約束的開關控制:

initial  begin

p = new();

p.c_short.constraint_mode(0);   //控制代碼+約束塊+mode,控制這個約束塊mode

assert( p.randomize() );

transmit(p);

p.constraint_mode(0);                //控制代碼+mode,控制整個控制代碼的mode

p.c_short.constraint_mode(1);

assert( p.randomize() );

transmit(p);

end對陣列的約束:

1)constraint    d_size   ;

d.sum == 4'h4; }  //sum的位數與陣列中的數的位數相同,所以又是可能達不到想要的範圍。

在實際應用中,應該多用變數來控制約束。  

隨機化演算法

隨機化演算法的主要目的是希望讓隨機發生在演算法上,而不是發生在輸入分布上,這樣的話,沒有特別的輸入會引起我們的演算法的最壞情況。即使你最壞的敵人也無法產生最壞的輸入陣列。因為隨機排列使得輸入次序不再相關。只有在隨機數生成器產生乙個不走運的排列時,隨機演算法才會執行得很差。一.隨機優先順序陣列法 我們...

隨機化搜尋

參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 nn 個深埋在地下的寶藏屋,也給出了這 nn 個寶藏屋之間可供開發的mm 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發寶藏屋之間的道路 則相...

簡單隨機化

有乙個挺不錯的 隨機化blog codechef mstones 平面上有 n 個點 x i,y i 保證這 n 個點可以用 7 條直線覆蓋。找出一條直線使得它覆蓋的點最多 30 組 test n leq10 4 x i y i leq1.5 times10 4 每次隨機找兩個點 a,b 判斷它們所...