任意一段代码的逻辑综合

Logic synthesis from an arbitary piece of code

我已经完成了一个制作物理逻辑门的项目,现在正在寻找一种方法将任意程序转换为一系列逻辑门,以便我可以使用它们。

我需要一个程序,可以将一些任意函数(比如 f= x^2 -1)直接带入一些逻辑门系列。这已经存在了吗?

我找到了 Verilog and several other open source options but they do not appear to output circuit diagrams. There is also Quartus II and other programs which will convert VHDL 原理图代码。

我更喜欢直接将 Python/C++ 编译成逻辑门原理图的东西——但实际上任何语言都可以。

谢谢。

编辑:我的意思是物理门 - 他们使用滚珠轴承!

我拥有所有 1-bit-input/1-bit-output 门和所有 2-bit-input/1-bit 输出门。从这些我还可以构建一个 MAJ 门来进行纠错。

在 VHDL 中编写任意代码,将 VHDL 转换为门是综合工具所做的。

并非您编写的所有内容都可以综合;文件处理不能转换为门,传统上使用堆的任何东西(例如 C 中的 malloc 或指针,或 VHDL 中的“new”和访问类型)也不能。可以合成浮点数(使用 VHDL-2008),但它不像 signal A : Real; A <= 2.0 * X * X - 1.0; 那样简单,您必须使用可合成浮点库中的类型。因此,可能会与该工具就您可以使用的编程语言子集进行一些协商。


但我在这里感觉到一个稍微不同的问题:如何将任意代码转换为 MY 逻辑门,实现于(问题中未描述的技术)。这更难回答。

综合工具通常来自供应商,例如 FPGA 供应商,它们将任意代码转换为该供应商的逻辑门,而不是你的.

理想的解决方案是创建一个描述您的逻辑技术的库,将其插入供应商中立的综合工具,例如 Synopsys 的 Synplicity。然后 Synplicity 可以综合到您的技术而不是 FPGA 供应商的技术。

好的,但是创建该库可能是一项与为自定义 CPU 的指令集编写后端并将该后端集成到 gcc 中大致相同的任务。除了 Synplicity 与 gcc 不同,它不是开源的,因此如果没有大量的财务和技术资源,以及来自主要 EDA 工具公司的帮助和内部文档,这几乎是不可能的。 (在这一点上,我很高兴被真正做过的人纠正)

编辑(将近 7 年后!)

GHDL(开源 VHDL 模拟器)可用 from Github has grown a synthesis branch, so this route is now likely to be easier (I'll stop short of saying easy!) or may be a better choice than a proprietary toolset for the route below. It has a tie-in to the YOSYS 开源综合套件。警告:我还没有尝试过,但对于这个问题的未来观众来说可能值得一看。

(结束编辑)


所以我们需要一种不同的方法。

回到 FPGA 合成器工具:我将使用 Xilinx XST 作为示例。它将以某些 Xilinx 封闭内部格式合成 Xilinx 原语。

然而,还有一个选项标记为“写入 post-综合网表”。

使用它,您可以获得一个结构化的 VHDL 文件,表示将您的任意代码转换为从 Simprims 库中提取的 Xilinx 门、触发器和其他元素。

尝试在不使 Simprims 库可见的情况下编译它(例如在模拟器中)(例如将 library Simprims; use Simprims; 语句注释掉,您将得到一些有价值的东西:

编译错误列表

没那么有价值,您可能会想:除了它实际上是实现您的设计所需的门、触发器和其他元素的列表。

如果您能找到(或创建)这些元素与您选择的技术中的元素之间的一对一对应关系,那么您就可以将此网表映射到您的技术。

如果您没有对应的 Simprims 元素,则需要实现它们 - 例如通过从您拥有的 2 输入与非门的网络创建 3 输入与门。

使用您自己的 (VHDL) 库中的相应元素,而不是 Simprims,理论上,您应该有一个可用的编译设计。

(你自己解决布局、布线、时序分析等问题。这不是微不足道的,但为了这个问题,我假设你的“制作物理门的项目”涵盖了这些...... .)

首先,逻辑综合是逻辑电路的基本逻辑优化,或将结构逻辑电路转化为表示逻辑电路的数据结构。有关逻辑综合的资源,请参阅 。

其次,要将计算机程序(例如 Python、C、C++ 或其他语言)转换为逻辑电路,您需要执行高级综合(或行为综合)来转换计算机通过将其解析为控制流图和数据流图(CDFG,或一对控制流图和数据流图)进行编程,优化CDFG,随后将该CDFG转化为逻辑电路进行逻辑综合。一旦你有了逻辑电路,你仍然需要执行物理设计(例如,布局规划、布局和布线)以将该逻辑电路映射到流片布局(基于标准单元的数字集成电路设计)或到现场-可编程门阵列 (FPGA)。

下面的参考文献提供了对我提到的主题的文献综述。

@book{Lavagno2016a,
    Address = {Boca Raton, {FL}},
    Author = {Luciano Lavagno and Igor L. Markov and Grant Martin and Louis K. Scheffer},
    Doi = {https://dx.doi.org/10.1201/b19569},
    Edition = {Second},
    Publisher = {{CRC} Press},
    Series = {Electronic Design Automation for Integrated Circuits Handbook},
    Title = {Electronic Design Automation for {IC} System Design, Verification, and Testing},
    Volume = {1},
    Year = {2016}}

@book{Lavagno2016,
    Address = {Boca Raton, {FL}},
    Author = {Luciano Lavagno and Igor L. Markov and Grant Martin and Louis K. Scheffer},
    Doi = {https://dx.doi.org/10.1201/b19714},
    Edition = {Second},
    Publisher = {{CRC} Press},
    Series = {Electronic Design Automation for Integrated Circuits Handbook},
    Title = {Electronic Design Automation for {IC} Implementation, Circuit Design, and Process Technology},
    Volume = {2},
    Year = {2016}}

请参阅 https://github.com/lsils/lstools-showcase 了解瑞士洛桑 EPFL (Ecole Polytechnique Fédérale de Lausanne) 最先进的逻辑综合库。

您可以使用这些工具进行逻辑综合。它们是程序,商业高级综合软件,将 C 或 C++ 代码转换为 Verilog(或其他一些硬件描述语言,HDL),然后转换为逻辑电路。

您还可以考虑基于 Python 的 HDL(例如 PyMTL、PyRTL 或 MyHDL)、基于 Scala 的 HDL(例如 Chisel HDL)或基于 Haskell 的 HDL(例如, 冲突)。这些 HDL 为您将计算机程序转换为逻辑电路的目标提供了解决方法。