在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

聊聊Systemverilog中的function in constraints

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

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

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

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

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

順便提一下state variables的概念,它是constraint guards的一種,我們可以把它理解成常數(constants),也就是它的值是固定的了,不會發生變化,不會創建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運行結果如下:

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.

結果分析:

上面例子在const_c constraint block里使用了函數calc,block給calc傳遞的實參是size和add,因此systemverilog會先求解size和add變量的值,然后再去計算calc的返回結果,這時size, add以及calc()函數的返回值都當作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運行結果變成如下所示:

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

結果分析:

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Verilog語言
    +關注

    關注

    0

    文章

    113

    瀏覽量

    8284
  • 求解器
    +關注

    關注

    0

    文章

    77

    瀏覽量

    4539
收藏 人收藏

    評論

    相關推薦

    SystemVerilog的Virtual Methods

    SystemVerilog多態能夠工作的前提是父類的方法被聲明為virtual的。
    發表于 11-28 11:12 ?717次閱讀

    SystemVerilog的“const”類屬性

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

    SystemVerilog的聯合(union)介紹

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

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

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

    [啟芯公開課] SystemVerilog for Verification

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

    SystemVerilog$cast的應用

    SystemVerilog casting意味著將一種數據類型轉換為另一種數據類型。在將一個變量賦值給另一個變量時,SystemVerilog要求這兩個變量具有相同的數據類型。
    的頭像 發表于 10-17 14:35 ?2897次閱讀

    SystemVerilog可以嵌套的數據結構

    SystemVerilog除了數組、隊列和關聯數組等數據結構,這些數據結構還可以嵌套。
    的頭像 發表于 11-03 09:59 ?1634次閱讀

    SystemVerilog的package

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

    SystemVerilog的struct

    SystemVerilog“struct”表示相同或不同數據類型的集合。
    的頭像 發表于 11-07 10:18 ?2500次閱讀

    SystemVerilog的Shallow Copy

    SystemVerilog的句柄賦值和對象復制的概念是有區別的。
    的頭像 發表于 11-21 10:32 ?933次閱讀

    SystemVerilog的Semaphores

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

    簡述SystemVerilog的隨機約束方法

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

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

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

    Systemverilog的Driving Strength講解

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

    SystemVerilog的隨機約束方法

    上一篇文章《暗藏玄機的SV隨機化》介紹了SystemVerilog的各種隨機化方法,本文將在其基礎上引入SystemVerilog的隨機約束方法(constraints)。通過使用隨機約束,我們可以將隨機限制在一定的空間內,有針
    的頭像 發表于 09-24 12:15 ?1818次閱讀
    主站蜘蛛池模板: 韩国三级hd中文字幕好大| 激情文学综合网| 中文字幕在线播放第一页| 国产高清在线观看| 一级欧美视频| 亚洲2020天天堂在线观看| 四虎最新在线| 日韩一级欧美一级一级国产| 欧美精品久久久久久久小说| 久久黄色精品视频| 国产成人精品视频一区二区不卡| www.久久精品视频| 手机看片国产高清| 国产资源视频在线观看| 2018天天干夜夜操| 色爱区综合五月激情| 在线a免费| 日韩爽片| 国产三级在线观看视频| 午夜在线影院| 国产精品视频久久久久久| 国产农村乱色xxxx| www.色涩| 日韩特级片| 激情深爱| 午夜影院三级| 5x性区m免费毛片视频看看| 日本在线视频二区| 五月天丁香婷| 欧美高清一级片| 俺来也久久| 久久九色| 亚洲一级毛片中文字幕| 性欧美大胆高清视频| 女人张开腿双腿让男人桶| 俺要操| 亚洲国产日韩欧美在线as乱码| 亚洲成人网页| 亚洲性人人天天夜夜摸| 日韩免费毛片全部不收费| 国产手机免费视频|