五花八门的SystemVerilog随机约束

470 阅读1分钟

上一篇文章《暗藏玄机的SV随机化》介绍了SystemVerilog的各种随机化方法,本文将在其基础上引入SystemVerilog的随机约束方法(constraints)。通过使用随机约束,我们可以将随机限制在一定的空间内,有针对性地提高功能覆盖率。

SV随机约束的应用,就像是我们用陈述性(declarative)的语句告诉仿真器我们要的随机数要满足哪些条件,然后仿真器的约束解算器(constraint solver)就会去找到能够满足我们所有描述语句的解,再从这些解中随机选出来一个值作为随机的结果。

约束解算器

约束解算器是SV仿真器重要的一部分,它被专门用来求解约束。这里说的求解,就是指的仿真程序通过某种算法,找到能够满足我们所有约束条件的随机值的过程。如果随机被过约束(over-constraint)了,或者存在随机值的组合情况不能满足约束,则约束解算器就会解算失败。在实际应用中,仿真程序就会报错,然后打印出来告诉我们是哪段约束没有解算成功。

理解约束解算器的重要性,可以想想如果没有约束解算器会怎么样?举一个简单的栗子,现在我们有一个约束条件:变量A的随机值总是小于变量B的随机值。如果没有约束功能,代码可以这么实现:

do begin
    A = $urandom;
    B = $urandom;
end while (! (A<B));

使用约束语句代码是这样的:

class ictalking;
    rand bit [7:0] A, B;
    constraint c_ab { A < B; }
endclass