SV中的隨機化


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{a<b,a+b<length} ,隨機化成功,返回success為1.

  with約束中的變量如果與調用randomize的obj相同,需要用local::來為變量定位。

3)直接使用$urandom/$urandom_range()等函數。

constraint的引用:一般在一個initial模塊或program中引用,采用assert的形式來:assert( p.randomize() );隨機化失敗后,返回值為0,assert將會打印log,

                         並退出。還有兩個隱性function:pre_randomize(),post_randomize(), 可以加入非randomize變量的初始化,同時留下hook。

 

幾種約束方式:

1) constraint  longth { low < mid;

                                 mid < high;}    //關系操作符必須分開來寫

2)constraint   length { len == mid - low;}    //約束塊內不能有賦值語句,相反應該用關系運算符

3)constraint   c_dist  { src_dist {0:= 40, [1:3]:=60;}     //:=后表示權重---相等

                                  dst_dist {0:/ 40,  [1:3]:/ 60};}}   //:/后表示權重---比例

4)constraint   c_rang { c inside {[lo:hi]};                       //inside:low-high

                                  b inside {[10:$]};                      //$可以表示邊界

                                  !(c inside {[$:30]}); }               //加()可以加!表示非

5)constraint   c_io { (io_space_mode) -> addr[31]==1'b1;    //--->表示if

                              if (op==READ) len inside {[BYTE:WORD]}; }  //--->if--else

6)constraint   c_xy  {(x==0) -> y==0;      //solve..before可能改變解的概率

                                solve x before y;}

7)assert (t.randmize() with {addr > 50;    //內嵌式的約束,addr的作用域是class這一級的,randomize的效果等價

                                         addr < 150;} )

                                       

 

隨機化的開關控制:

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.size inside {[1:10]};

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

 

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

                     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM