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

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

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

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

聊聊Systemverilog中的function in constraints

冬至子 ? 來(lái)源:CSDN ? 作者:谷公子 ? 2023-06-21 17:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

不過(guò)在使用function in constraints有以下幾點(diǎn)需要注意:

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

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

接下來(lái)看個(gè)例子來(lái)加深印象。

代碼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傳遞的實(shí)參是size和add,因此systemverilog會(huì)先求解size和add變量的值,然后再去計(jì)算calc的返回結(jié)果,這時(shí)size, add以及calc()函數(shù)的返回值都當(dāng)作state variables,最終再去求解length變量的值。

但如果將代碼1里第4行的/ solve length before size; /注釋打開(kāi),也就是如下代碼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é)果分析:

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

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

    關(guān)注

    0

    文章

    113

    瀏覽量

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

    關(guān)注

    0

    文章

    80

    瀏覽量

    4748
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    SystemVerilog的Virtual Methods

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

    SystemVerilog的“const”類(lèi)屬性

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

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

    SystemVerilog ,聯(lián)合只是信號(hào),可通過(guò)不同名稱和縱橫比來(lái)加以引用。
    的頭像 發(fā)表于 10-08 15:45 ?1862次閱讀
    <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 ?2570次閱讀
    從可綜合的RTL代碼的角度<b class='flag-5'>聊聊</b>interface

    [啟芯公開(kāi)課] SystemVerilog for Verification

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

    SystemVerilog$cast的應(yīng)用

    SystemVerilog casting意味著將一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型。在將一個(gè)變量賦值給另一個(gè)變量時(shí),SystemVerilog要求這兩個(gè)變量具有相同的數(shù)據(jù)類(lèi)型。
    的頭像 發(fā)表于 10-17 14:35 ?3375次閱讀

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

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

    SystemVerilog的package

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

    SystemVerilog的struct

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

    SystemVerilog的Shallow Copy

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

    SystemVerilog的Semaphores

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

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

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

    SystemVerilog實(shí)用知識(shí)點(diǎn):覆蓋率之Function Coverage

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

    Systemverilog的Driving Strength講解

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

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

    上一篇文章《暗藏玄機(jī)的SV隨機(jī)化》介紹了SystemVerilog的各種隨機(jī)化方法,本文將在其基礎(chǔ)上引入SystemVerilog的隨機(jī)約束方法(constraints)。通過(guò)使用隨機(jī)約束,我們可以將隨機(jī)限制在一定的空間內(nèi),有針
    的頭像 發(fā)表于 09-24 12:15 ?2448次閱讀
    主站蜘蛛池模板: 美女免费视频黄 | 色视频在线观看网站 | 天天射天天操天天干 | 成 人 黄 色视频免费播放 | 日本免费人成在线网站 | 色老头·com 色老头成人免费综合视频 色老头久久久久 | 欧美色成人综合 | 天天爱天天干天天 | 男女视频免费观看 | 婷婷六| 午夜亚洲福利 | 欧美日操 | 操熟逼| 欧美日韩精品一区二区在线线 | 亚洲国产精品久久精品怡红院 | 天堂网在线www最新版在线 | 欧美成人免费高清网站 | 四虎永久免费观看 | 天天看视频 | 国产精品高清久久久久久久 | 玖玖在线免费视频 | www.色五月.com| 日本在线视频一区二区 | 天天色天天色天天色 | 免费看三级黄色片 | 天天曰天天干天天操 | 久久久xxx | 亚洲视频一区 | 精品在线一区二区三区 | 免费一级在线 | 日日夜夜天天人人 | 亚洲精品成人a | 老头天天吃我奶躁我的动图 | 亚洲第成色999久久网站 | 久久这里只有精品免费播放 | 国产精品久久在线 | 你懂的网站在线观看网址 | 久久99久久精品国产99热 | 朋友夫妇和交换性bd高清 | 人人揉揉香蕉大免费不卡 | 亚洲香蕉视频 |