返回介绍

12.8 使用constraint_mode()控制约束

发布于 2020-09-09 22:55:50 字数 1740 浏览 1446 评论 0 收藏 0

constraint_mode()方法可以用来控制激活或关闭一个约束。当约束处于未激活(关闭)状态时,它不会被randomize()方法所考虑。所有的约束最初都是激活的。

constraint_mode()方法的语法如下:

task object[.constraint_identifier]::constraint_mode(bit on_off);

或者

function int object.constraint_identifier::constraint_mode();

object是能够产生对象句柄的任何表达式,并且约束在其中定义。

constraint_identifier是约束被应用的约束块的名字。约束名字可以是类层次中任意约束块的名字。如果没有指定约束名字(仅在作为任务调用是才允许出现这种情况),这个操作应用于指定对象中的所有约束。

当作为任务调用的时候,constraint_mode方法的参数确定了需要执行的操作:

表格12-2:constraint_mode参数

含义描述
0OFF将指定的约束块设置成未激活状态,这样它就不会被后来对randomize()方法的调用所强制。
1ON将指定的约束块设置成激活状态,这样它会被后来对randomize()方法的调用所考虑。

如果指定的约束块在类层次中不存在,那么编译器应该发布一条错误信息。

当作为函数调用的时候,constraint_mode()方法返回指定约束块当前的激活状态。如果约束处于激活状态(ON),那么它返回1;如果约束处于未激活状态(OFF),那么它返回0。

例子:

class Packet;
    rand integer source_value;
    constraint filter1 {source_value > 2 * m;}
endclass

function integer toggle_rand(Packet p);
    if (p.filter1.constraint_mode())
        p.filter1.constraint_mode(0);
    else
        p.filter1.constraint_mode(1);

    toggle_rand = p.randomize();
endfunction

在这个例子中,toggle_rand函数首先检查指定的Packet对象p中约束filter1当前的激活状态。如果约束处于激活状态,函数会将它设置为处于非激活状态;如果约束处于非激活状态,那么函数会将它激活。最后,函数会调用randomize方法来为随机变量source_value产生一个新的随机值。

constraint_mode()方法是内建的并且不能被过载。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文