聊聊Systemverilog中的function in constraints

news/2024/5/19 19:50:27 标签: Systemverilog, function, constraint, 求解, randomize

有些情况下,constraint不能简单用一行来表达,而是需要复杂的计算,如果都写到constraint block内部就比较复杂,而且很乱,这时候可以调用functions来约束随机变量。在constraint内调用function就称为”function in constraints”。它的格式如下:

constraint constraint_name { rand_var == function_call(arguments...); }

不过在使用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)

 


http://www.niftyadmin.cn/n/440788.html

相关文章

ubuntu18.04设置自启动踩坑贴(拿来即用)---全网搜索半天都没有,ChatGPT回答都是有问题的!!

前言:其实很简单,全网的资料实在坑太多(无语),有一篇还不错,我大多数借鉴这篇https://cloud.tencent.com/developer/article/1803805,但直接用貌似也不通,这边记录了我的实测可跑通版…

haproxy服务器对nginx服务器web服务调度负载均衡、用nfs做共享目录(脚本部署)

目录 一、准备 二、在作为haproxy的服务器上导入以下shell执行haproxy安装 三、由于nginx服务需要用的nfs共享目录,先部署nfs 四、nginx服务器1部署 五、nginx服务器2部署同上 六、测试 一、准备 四台服务器 系统IP搭建服务器centos7192.168.1.12haproxycent…

Redis入门 - 5种基本数据类型

原文首更地址,阅读效果更佳! Redis入门 - 5种基本数据类型 | CoderMast编程桅杆https://www.codermast.com/database/redis/five-base-datatype.html 说明 在我们平常的业务中基本只会使用到Redis的基本数据类型(String、List、Hash、Set、…

深度学习入门笔记2-从零开始实现线性回归

该节内容主要摘自李沐大神的 动手学AI。 🏷sec_linear_scratch 在了解线性回归的关键思想之后,我们可以开始通过代码来动手实现线性回归了。 在这一节中,(我们将从零开始实现整个方法, 包括数据流水线、模型、损失函数和小批量随…

Python ChatGPT API 新增的函数调用功能演示

文章目录 一、前言二、主要内容三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 OpenAI 重磅更新,API 添加函数调用能力,能处理更长上下文,价格又有所降低 … 知乎讨论:https://www.zh…

TOGAF10®标准中文版(全文目录)

The Open Group是一个通过技术标准实现业务目标的全球联盟。我们拥有超过870个成员组织,成员来自技术社区的各个部门,包括客户、系统和解决方案供应商、工具供应商、集成商和顾问,以及学者和研究人员。 The Open Group的使命是通过以下方式…

pandas---数学函数、离散化处理、分组聚合

1. 数学函数 方差:当数据分布比较分散(即数据在平均数附近波动较大)时,各个数据与平均数的差的平方和 较大,方差就较大;当数据分布比较集中时,各个数据与平均数的差的平方和较小。因此方差越 …

mysql学习整理

DML语言 DML语言 : 数据操作语言 数据库意义 : 数据存储、数据管理 用于操作数据库对象中所包含的数据 包括 : INSERT (添加数据语句)UPDATE (更新数据语句)DELETE(删除外键) Insert 语法 添加单条数据 语法: INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES(值1,值2,值…