我正在寻找 SystemVerilog 语言的基于 C++ 的替代方案。虽然我怀疑任何东西都可以与 SystemVerilog 约束语言的简单性和灵活性相匹配,但我已经决定使用 Z3 或 Gecode 来完成我的工作,主要是因为它们都在 MIT 许可下。
我正在寻找的是:
- 支持可变大小的位向量和位向量算术逻辑运算。例如:
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,鉴于其文档的详尽程度,它会更加清晰。
一个简单的约束规划模型,接近或类似于 SystemVerilog。例如,我只需要输入 (x == y + z) 而不是 EQ(x, y + z) 之类的语言。据我所知,这两个 API 都提供了如此简单的编程模型。
为了产生随机刺激而执行约束随机化的一种方法。如,我可以提供一些随机种子,根据约束条件,产生的答案可能与之前的答案不同。类似于 SystemVerilog 随机调用可能会产生新的随机结果。Gecode 似乎支持使用随机种子。Z3,不太清楚。
支持加权分布。Gecode 似乎通过加权集支持这一点。我想我可以在某些条件和布尔变量之间建立关系,然后为这些变量添加权重。Z3 似乎更灵活,因为您可以通过优化类为表达式分配权重。
目前,我还没有决定,因为 Z3 缺乏 Gecode 在开箱即用的变量类型中所缺乏的文档。我想知道是否有人有任何使用这两种工具的经验来实现 SystemVerilog 的功能。我也想听听对灵活许可下的任何其他 API 的任何建议。