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

    浏览量

    8206
  • 求解器
    +关注

    关注

    0

    文章

    77

    浏览量

    4505
收藏 人收藏

    评论

    相关推荐

    SystemVerilog的Virtual Methods

    SystemVerilog多态能够工作的前提是父类的方法被声明为virtual的。
    发表于 11-28 11:12 674次阅读

    SystemVerilog的“const”类属性

    SystemVerilog可以将类属性声明为常量,即“只读”。目的就是希望,别人可以读但是不能修改它的值。
    发表于 11-29 10:25 2077次阅读

    SystemVerilog的联合(union)介绍

    SystemVerilog ,联合只是信号,可通过不同名称和纵横比来加以引用。
    的头像 发表于 10-08 15:45 1275次阅读
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的联合(union)介绍

    从可综合的RTL代码的角度聊聊interface

    SystemVerilog引入了interface,这里我们从可综合的RTL代码的角度聊聊interface。
    的头像 发表于 10-12 09:06 1684次阅读
    从可综合的RTL代码的角度<b class='flag-5'>聊聊</b>interface

    [启芯公开课] SystemVerilog for Verification

    学快速发展,这些趋势你了解吗?SystemVerilog + VM是目前的主流,在未来也将被大量采用,这些语言和方法学,你熟练掌握了吗?对SoC芯片设计验证感兴趣的朋友,可以关注启芯工作室推出的SoC芯片
    发表于 06-10 09:25

    更好地理解SystemVerilog的多态Polymorphism

    多态(Polymorphism) ,从字面意思上看指的是多种形式,在OOP(面向对象编程)中指的是同一个父类的函数可以体现为不同的行为。在SystemVerilog,指的是我们可以使用父类句柄来
    发表于 12-05 17:34

    SystemVerilog可以嵌套的数据结构

    SystemVerilog除了数组、队列和关联数组等数据结构,这些数据结构还可以嵌套。
    的头像 发表于 11-03 09:59 1544次阅读

    SystemVerilog的package

    SystemVerilog packages提供了对于许多不同数据类型的封装,包括变量、task、function、assertion等等,以至于可以在多个module中共享。
    的头像 发表于 11-07 09:44 1194次阅读

    SystemVerilog的struct

    SystemVerilog“struct”表示相同或不同数据类型的集合。
    的头像 发表于 11-07 10:18 2370次阅读

    SystemVerilog的Shallow Copy

    SystemVerilog的句柄赋值和对象复制的概念是有区别的。
    的头像 发表于 11-21 10:32 859次阅读

    SystemVerilog的Semaphores

    SystemVerilogSemaphore(旗语)是一个多个进程之间同步的机制之一,这里需要同步的原因是这多个进程共享某些资源。
    的头像 发表于 12-12 09:50 3278次阅读

    简述SystemVerilog的随机约束方法

    上一篇文章介绍了SystemVerilog的各种随机化方法,本文将在其基础上引入SystemVerilog的随机约束方法(constraints)。通过使用随机约束,我们可以将随机限制在一定的空间内,有针对性地提高功能覆盖率。
    的头像 发表于 01-21 17:03 1994次阅读

    SystemVerilog实用知识点:覆盖率之Function Coverage

    SystemVerilog是一名芯片验证工程师,必须掌握的一门语言,其中Function Coverage是必须要懂的知识点之一;
    的头像 发表于 06-04 16:30 7228次阅读
    <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 1469次阅读
    <b class='flag-5'>Systemverilog</b><b class='flag-5'>中</b>的Driving Strength讲解

    SystemVerilog的随机约束方法

    上一篇文章《暗藏玄机的SV随机化》介绍了SystemVerilog的各种随机化方法,本文将在其基础上引入SystemVerilog的随机约束方法(constraints)。通过使用随机约束,我们可以将随机限制在一定的空间内,有针
    的头像 发表于 09-24 12:15 1555次阅读