返回介绍

12.4.9 变量排序

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

求解器必须确保选择的值在有效的值组合中具有均匀的值分布(也就是说,所有的有效值组合在求解过程中具有相等的概率)。这个重要的特性能够保证所有的值组合的可能性是相等的,这也就允许随机化能够更好地探索整个设计空间。

然而,有时我们希望强制某种组合出现的频率更高一些。考虑一个案例,其中1位的控制变量s约束了一个32位的数据值d

class B;
    rand bit s;
    rand bit [31:0] d;
    constraint c {s -> d == 0;}
endclass

约束c表明“s蕴含着d等于0”。尽管表面上看好像由s确定d,但事实上sd是一起确定的。{s,d}共有233种组合,但s仅在{1,0}这种组合时才为真。因此s为真的可能性为1/233,它近似于等于0。

约束为排序变量提供了一种机制,这样s可以独立于d被选择。这种机制在变量的计算上定义了一个部分排序,并使用solve关键字说明。

class B;
    rand bit s;
    rand bit [31:0] d;
    constraint c {s -> d == 0;}
    constraint order {solve s before d;}
endclass

在这个例子中,order约束向求解器指示sd被求解之前求解。这么做的效果就是s具有50%的概率被选择为真,接下来d根据s的值被选择。相应地,d == 0的概率为50%,d != 0的概率也为50%。

变量排序可以被用来强制被选择的边界条件出现的机会更频繁一些。然而,一个“solve...before ...”约束不会改变求解空间,并且不会引起求解器失败。

在一个约束块中定义变量顺序的语法如下:

constraint_block_item ::=         // 引用自附录A.1.9
    solve identifier_list before identifier_list;
  | constraint_expression

语法12-7 — Solve...before约束排序语法(摘录自附录A)

solve和before使用一个逗号分割的integral变量或数组元素。

下列限制应用于变量排序:

  • 仅允许随机变量,也就说它们必须使用rand声明。
  • 不允许使用randc变量。randc变量总是在其它变量之前求解。
  • 变量必须是integral值。
  • 约束块既可以包含单一值约束也可以包含排序约束。
  • 在排序上不能有循环的依赖性,就好像“在b之前求解a”与“在a之前求解b”那样。
  • 没有被显式排序的变量应该与最后一组排序变量一起求解。这些值的求解被尽可能晚地推迟以便确保一个好的值分布。
  • 只要结果相同,变量可以以排序约束不一致的顺序求解。一个可能的例子如下:
x == 0;
x < y;
solve y before x;

在这个例子中,由于x具有唯一可能的赋值(0),所以x可以在y之前求解。约束求解器可以使用这种灵活性来加速求解过程。

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

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

发布评论

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