0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

聊聊Systemverilog中的function in constraints

冬至子 ? 來源:CSDN ? 作者:谷公子 ? 2023-06-21 17:31 ? 次閱讀

有些情況下,constraint不能簡單用一行來表達(dá),而是需要復(fù)雜的計算,如果都寫到constraint block內(nèi)部就比較復(fù)雜,而且很亂,這時候可以調(diào)用functions來約束隨機(jī)變量。在constraint內(nèi)調(diào)用function就稱為”function in constraints”。它的格式如下:

constraint constraint_name { rand_var == function_call(arguments...); }
  • function的定義寫在constraint block之外,它內(nèi)部包含了對arguments的處理。
  • 在調(diào)用randomize()的時候,function會先被求解,function的返回值將會作為state variables去參與接下來的求解。

不過在使用function in constraints有以下幾點需要注意:

  • 在constraint內(nèi)部調(diào)用的function不能包含output或ref類型的arguments,但是const ref是允許的;
  • 在constraint內(nèi)部調(diào)用的function應(yīng)該是automatic類型的;
  • 在constraint內(nèi)部調(diào)用的function不能修改constraints,例如調(diào)用rand_mode或constraint_mode方法;
  • Function會先被求解,也就是它的返回值會被當(dāng)作state variables。因此,function的arguments和其它rand variables會隱含建立求解order關(guān)系(有一點點類似solve…before…),arguments會先求解,解完之后作為傳入function得到返回值作為state variables,最后再求解其它rand variables。另外,如果隱含約束關(guān)系會造成求解循環(huán)依賴,那么仿真器將會報錯;

順便提一下state variables的概念,它是constraint guards的一種,我們可以把它理解成常數(shù)(constants),也就是它的值是固定的了,不會發(fā)生變化,不會創(chuàng)建constraint。

接下來看個例子來加深印象。

代碼1如下:

class packet;
  rand int length, size, add;
  
  constraint const_c { /*solve length before size;*/ length == calc(size, add); }
  constraint const_d { size inside {1, 2, 3, 4, 5, 6, 7, 8}; }
  constraint const_e { add inside {1, 0}; }
  
  function int calc(int _s, int _m);
    if ( _m )
      return ( 100 + 2**_s + _s);
    else
      return ( 100 - 2**_s - _s);
  endfunction: calc
  
endclass
 
module top;
  initial begin
    packet pkt;
    pkt = new();
    repeat(3) begin
      pkt.randomize();
      $display("length = %0d, size = %0d, add=%0d",pkt.length, pkt.size, pkt.add);
    end
  end
endmodule

使用Cadence Xcelium 20.09運(yùn)行結(jié)果如下:

xcelium > run
length = 120, size = 4, add=1
length = -35, size = 7, add=0
length = 80, size = 4, add=0
xmsim: *W,RNQUIE: Simulation is complete.

結(jié)果分析:

上面例子在const_c constraint block里使用了函數(shù)calc,block給calc傳遞的實參是size和add,因此systemverilog會先求解size和add變量的值,然后再去計算calc的返回結(jié)果,這時size, add以及calc()函數(shù)的返回值都當(dāng)作state variables,最終再去求解length變量的值。

但如果將代碼1里第4行的/ solve length before size; /注釋打開,也就是如下代碼2:

class packet;
  rand int length, size, add;
  
  constraint const_c { solve length before size; length == calc(size, add); }
  constraint const_d { size inside {1, 2, 3, 4, 5, 6, 7, 8}; }
  constraint const_e { add inside {1, 0}; }
  
  function int calc(int _s, int _m);
    if ( _m )
      return ( 100 + 2**_s + _s);
    else
      return ( 100 - 2**_s - _s);
  endfunction: calc
  
endclass
 
module top;
  initial begin
    packet pkt;
    pkt = new();
    repeat(3) begin
      pkt.randomize();
      $display("length = %0d, size = %0d, add=%0d",pkt.length, pkt.size, pkt.add);
    end
  end
endmodule

那么使用Cadence Xcelium 20.09運(yùn)行結(jié)果變成如下所示:

xcelium > run
xmsim: *W,RNDSVB: These solve/before constraints are circular:
0.    length - > size
          constraint const_c { solve length before size; length == calc(size, add); } (./testbench.sv,4)
1.    size - > length
        ( because of an implicit solve..before for random function-call arguments ):   constraint const_c { solve length before size; length == calc(size, add); } (./testbench.sv,4)
 
      pkt.randomize();
                  |
xmsim: *W,SVRNDF (./testbench.sv,22|18): The randomize method call failed. The unique id of the failed randomize call is 0.
Observed simulation time : 0 FS + 0

結(jié)果分析:

這是因為solve length before size與cacl()函數(shù)創(chuàng)造的隱含求解order約束沖突了。(Circular dependencies)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Verilog語言
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    8206
  • 求解器
    +關(guān)注

    關(guān)注

    0

    文章

    77

    瀏覽量

    4505
收藏 人收藏

    評論

    相關(guān)推薦

    SystemVerilog的Virtual Methods

    SystemVerilog多態(tài)能夠工作的前提是父類的方法被聲明為virtual的。
    發(fā)表于 11-28 11:12 ?674次閱讀

    SystemVerilog的“const”類屬性

    SystemVerilog可以將類屬性聲明為常量,即“只讀”。目的就是希望,別人可以讀但是不能修改它的值。
    發(fā)表于 11-29 10:25 ?2074次閱讀

    SystemVerilog的聯(lián)合(union)介紹

    SystemVerilog ,聯(lián)合只是信號,可通過不同名稱和縱橫比來加以引用。
    的頭像 發(fā)表于 10-08 15:45 ?1274次閱讀
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的聯(lián)合(union)介紹

    從可綜合的RTL代碼的角度聊聊interface

    SystemVerilog引入了interface,這里我們從可綜合的RTL代碼的角度聊聊interface。
    的頭像 發(fā)表于 10-12 09:06 ?1684次閱讀
    從可綜合的RTL代碼的角度<b class='flag-5'>聊聊</b>interface

    [啟芯公開課] SystemVerilog for Verification

    學(xué)快速發(fā)展,這些趨勢你了解嗎?SystemVerilog + VM是目前的主流,在未來也將被大量采用,這些語言和方法學(xué),你熟練掌握了嗎?對SoC芯片設(shè)計驗證感興趣的朋友,可以關(guān)注啟芯工作室推出的SoC芯片
    發(fā)表于 06-10 09:25

    更好地理解SystemVerilog的多態(tài)Polymorphism

    多態(tài)(Polymorphism) ,從字面意思上看指的是多種形式,在OOP(面向?qū)ο缶幊?中指的是同一個父類的函數(shù)可以體現(xiàn)為不同的行為。在SystemVerilog,指的是我們可以使用父類句柄來
    發(fā)表于 12-05 17:34

    SystemVerilog可以嵌套的數(shù)據(jù)結(jié)構(gòu)

    SystemVerilog除了數(shù)組、隊列和關(guān)聯(lián)數(shù)組等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)還可以嵌套。
    的頭像 發(fā)表于 11-03 09:59 ?1541次閱讀

    SystemVerilog的package

    SystemVerilog packages提供了對于許多不同數(shù)據(jù)類型的封裝,包括變量、task、function、assertion等等,以至于可以在多個module中共享。
    的頭像 發(fā)表于 11-07 09:44 ?1194次閱讀

    SystemVerilog的struct

    SystemVerilog“struct”表示相同或不同數(shù)據(jù)類型的集合。
    的頭像 發(fā)表于 11-07 10:18 ?2370次閱讀

    SystemVerilog的Shallow Copy

    SystemVerilog的句柄賦值和對象復(fù)制的概念是有區(qū)別的。
    的頭像 發(fā)表于 11-21 10:32 ?858次閱讀

    SystemVerilog的Semaphores

    SystemVerilogSemaphore(旗語)是一個多個進(jìn)程之間同步的機(jī)制之一,這里需要同步的原因是這多個進(jìn)程共享某些資源。
    的頭像 發(fā)表于 12-12 09:50 ?3278次閱讀

    簡述SystemVerilog的隨機(jī)約束方法

    上一篇文章介紹了SystemVerilog的各種隨機(jī)化方法,本文將在其基礎(chǔ)上引入SystemVerilog的隨機(jī)約束方法(constraints)。通過使用隨機(jī)約束,我們可以將隨機(jī)限制在一定的空間內(nèi),有針對性地提高功能覆蓋率。
    的頭像 發(fā)表于 01-21 17:03 ?1991次閱讀

    SystemVerilog實用知識點:覆蓋率之Function Coverage

    SystemVerilog是一名芯片驗證工程師,必須掌握的一門語言,其中Function Coverage是必須要懂的知識點之一;
    的頭像 發(fā)表于 06-04 16:30 ?7222次閱讀
    <b class='flag-5'>SystemVerilog</b>實用知識點:覆蓋率之<b class='flag-5'>Function</b> Coverage

    Systemverilog的Driving Strength講解

    systemverilog,net用于對電路連線進(jìn)行建模,driving strength(驅(qū)動強(qiáng)度)可以讓net變量值的建模更加精確。
    的頭像 發(fā)表于 06-14 15:50 ?1468次閱讀
    <b class='flag-5'>Systemverilog</b><b class='flag-5'>中</b>的Driving Strength講解

    SystemVerilog的隨機(jī)約束方法

    上一篇文章《暗藏玄機(jī)的SV隨機(jī)化》介紹了SystemVerilog的各種隨機(jī)化方法,本文將在其基礎(chǔ)上引入SystemVerilog的隨機(jī)約束方法(constraints)。通過使用隨機(jī)約束,我們可以將隨機(jī)限制在一定的空間內(nèi),有針
    的頭像 發(fā)表于 09-24 12:15 ?1555次閱讀