用于约束随机化的 Gecode 与 Z3

Gecode vs. Z3 for Constrained Randomization

我正在寻找基于 C++ 的 SystemVerilog 语言的替代品。 虽然我怀疑任何东西都可以与 SystemVerilog 约束语言的简单性和灵活性相媲美,但我已经决定使用 Z3 或 Gecode 来完成我正在做的事情,主要是因为它们都在 MIT 许可下。

我要找的是:

  1. 支持可变大小的位向量和位向量算术逻辑运算。例如:
bit_vector a<30>;
bit_vector b<30>;
constraint { 
    a == (b << 2);
    a == (b * 2);
    b < a;
}

据我所知,Gecode 的问题在于它不提供开箱即用的位向量。然而,它的编程模型似乎有点简单,而且它确实提供了一种方法来创建自己的变量类型。所以我也许可以围绕 C++ 位集创建某种包装器,类似于 IntVar 包装 32 位整数的方式。但是,这将缺乏执行基于乘法约束的能力,因为 C++ 位集不支持此类操作。

Z3 确实提供开箱即用的位向量,但我不确定它如何处理尝试设置约束,例如 128 位向量。我也不确定如何指定我想要生成各种尽可能满足约束的随机变量。使用 Gecode,由于其文档的详尽程度,它会更加清晰。

  1. 一个简单的约束编程模型,接近或类似于SystemVerilog。例如,我只需要键入 (x == y + z) 而不是 EQ(x, y + z) 之类的语言。据我所知,API都提供了这样一个简单的编程模型。

  2. 为了产生随机刺激而执行约束随机化的方法。比如,我可以提供一些随机种子,根据约束条件,产生的答案可能与之前的答案不同。类似于 SystemVerilog 随机化调用可能产生新随机结果的方式。 Gecode 似乎支持使用随机种子。 Z3,就不太清楚了

  3. 支持加权分布。 Gecode 似乎通过加权集来支持这一点。我想我可以在某些条件和布尔变量之间建立关系,然后为这些变量添加权重。 Z3 似乎更灵活,因为您可以通过优化 class.

  4. 为表达式分配权重

目前,我还没有决定,因为 Z3 缺少文档,而 Gecode 缺少开箱即用的变量类型。我想知道是否有人以前有过使用这两种工具来实现 SystemVerilog 功能的经验。我也想听听关于灵活许可下任何其他 API 的建议。

虽然 z3(或任何 SMT 求解器)可以处理所有这些,但很难控制对满意分配的良好抽样。 SMT 求解器经过优化,只为您提供一个模型,它们在您希望如何对解决方案进行采样方面没有太多帮助 space。

顺便说一下,这是 SMT 解决方案中的一个活跃研究领域。这是 6 周前发表的一篇关于这个主题的论文:https://ieeexplore.ieee.org/document/8894251

所以,如果支持 "good sampling" 是您的主要动机,那么使用 SMT 求解器可能不是最佳选择。如果您的目标是为方便表达的位向量找到令人满意的假设(现在有您可以想象的任何语言的高级 API),那么 z3 将是一个非常好的选择。

从您的描述来看,良好的采样听起来像是主要动机,为此 SMT 求解器可能不是那么好。至少暂时不会。