【问题标题】:Creating a VHDL backend for LLVM?为 LLVM 创建 VHDL 后端?
【发布时间】:2011-04-09 13:05:37
【问题描述】:

LLVM 非常模块化,允许您相当轻松地定义新的后端。然而,大多数关于创建 LLVM 后端的文档/教程都侧重于添加新的处理器指令集和寄存器。我想知道为 LLVM 创建 VHDL 后端需要什么?是否有使用 LLVM 从一种高级语言转换到另一种语言的示例?

澄清一下:是否有将 LLVM IR 转换为高级语言而不是汇编语言的示例?例如:您可以使用 Clang 读入 C 语言,使用 LLVM 进行一些优化,然后用另一种语言(如 Java 或 Fortran)编写代码。

【问题讨论】:

  • 哎哟!我知道SystemC。从命令式代码生成“Silicium”代码非常具有挑战性!祝你好运,我会继续关注,看看会有什么样的提示:-)
  • 是的,VHDL 可能很棘手。也许我应该说我想弄清楚如何让 LLVM 的后端代码生成输出高级语言而不是处理器的汇编代码?例如,如果我想使用 LLVM 将 C 转换为 Java 或 Fortran,该怎么办?

标签: llvm vhdl


【解决方案1】:

是的!

周围有许多针对 VHDL/Verilog 的 LLVM 后端:

我知道还有很多其他人......

LLVM 或 GIMPLE(顺便说一下也称为 RTL)这样的低级表示的有趣之处在于它们公开了静态单一分配 (SSA) 形式:这可以直接转换为硬件,因为 SSA 可以被视为多路复用器的树...

【讨论】:

  • 我认为 C-to-Verilog 已经死了。但是,C-to-HDL Wikipedia 页面上提到了一些相关工具。
【解决方案2】:

看来这个问题已经部分回答了,所以我想试一试:

  • 为 LLVM 创建 VHDL 后端需要什么?

  • 如何将 LLVM IR 翻译成更高级的语言(大概是为了在高级语言之间进行转换)?

我会给你一些关于 2 的背景知识。稍后会在 1 上展开。

如果您想将 LLVM IR 转换为高级语言,例如 C 或 Java:

您必须采用 LLVM 指令,并将其抽象为等效的 C 代码。然后,您需要获取 LLVM 没有等效的其余功能(例如 C++ 的类和抽象)并编写一个例程,在 LLVM 中找到这些模式(例如重用的块)并编写 C。对于基本的东西,它非常简单。但是,只要顺着思路,你很快就会发现问题的真正难度,毕竟不是每个人都写简单的 C。更复杂的是,在编译生成的 C 时,你可能不会得到相同的 LLVM IR! (考虑由此产生的反馈循环)

对于 Java,直接从 LLVM IR 开始,您将面临一场更加艰难的战斗,无论哪种情况,您都可能无法将相同的代码编译到 LLVM IR,如果有人甚至可以做到的话。相反,您会将 LLVM IR 转换为 JVM 字节码。然后你可以使用反向编译器来获取你的 Java。

一群中国学生显然能够做到这一点,但他们想知道为什么对他们的研究兴趣如此之小。我想说的是,他们并不完全理解 LLVM 人所做的事情,以及它比 JVM 更好的地方。 (事实上​​,LLVM 可以说让 JVM 过时了;)

尽管这看起来很有用,因为可以使用 LLVM 作为 C 和 Java 之间的中介来进行双向转换,但这种解决方案实际上用处不大,因为我们问错了问题。看,出于实际目的,您想要这样做的全部原因是拥有一个通用代码库并提高性能。

但真正的问题是,我们需要一种抽象现代语言的共同特征的语言,并为您提供可以构建的中心语言。 http://julialang.org/已回答问题?

【讨论】:

  • 是的,Julia->HDL 会很棒。鉴于 Julia 已经使用了 LLVM 后端并且 Julia 有宏(这意味着您可以直接操作 AST)并且它针对的是 HPC,它似乎非常适合这个领域。
【解决方案3】:

这个话题是我在寻找同样的东西时发现的第一件事。

我发现了一个在 llvm 3.5 下/使用 llvm 3.5 干净构建的项目。这真是太酷了。它吐出 HDL 并做各种其他很酷的 FPGA 相关的事情。虽然它被设计为与 TTA 一起工作并为 FPGA 生成图像(或模拟它们),但它也可能被用于从 c 函数生成一些简单的 HDL。

它非常适合我的目的,因为我想上传到 Altera FPGA,而 fpga_stdout 示例甚至可以输出 Quartus 构建脚本和项目文件。

TTA-Based Co-design Environment

我还尝试了已接受答案中列出的内容以及其他一些内容,发现它们对我不起作用或质量不是很高(通常两者兼而有之)。 TCE 是专业的感觉,但我相信纯粹是学术性的。一路都很不错。

【讨论】:

    【解决方案4】:

    tl,dr:我不认为 LLVM 是正确的工具

    您正在寻找的是将 LLVM 代码翻译成高级语言的方法,这就是 emscripten 为 Javascript 所做的。

    但您似乎忽略了 LLVM 的一点,因为它旨在生成静态代码,以实现他们为此目的使用特定的中间语言构建。

    正如您所见,emscripten 的工作方式是实现一个堆栈,但无需像人类那样使用 javascript。

    它们是几个试图实现您最初的问题的项目,例如将 python 转换为 VHDL 或 Verilog 的 MyHDL

    【讨论】:

    • 实际上,这个想法是能够使用clang作为前端和LLVM中的各种优化步骤​​来提取并行性,从而能够从C++到VHDL。
    【解决方案5】:

    我不确定我是否遵循您的问题的各个部分如何相互关联。

    将 LLVM 定位为像 C 这样的高级语言是非常有可能的,而且您似乎找到了一个参考点。

    然而,VHDL 完全是另一回事。您认为 VHDL 是一种高级语言吗?它可能是,但描述了硬件/逻辑。当然,VHDL 有一些可以用来在其中实际编程的结构,但这并不是一项富有成效的努力。 VHDL 描述了硬件,因此将 LLVM IR 翻译成它是一个非常困难的问题,当然除非您使用 VHDL 中的自定义指令集设计 CPU 并将 LLVM IR 翻译成您的指令。

    【讨论】:

    • 是的,翻译成 VHDL 是一个难题,因为您正在创建硬件。您提到的 CPU 方法是执行此操作的一种方法。其他方法可能更适合使用声明性(功能性)输入语言并为其生成硬件(Bluespec 和 Atom 采用这种方法)——例如,这适用于 DSP 算法。然而,使用这种方法可能与使用 LLVM 不兼容。
    • 您必须定义要为其创建 vhdl 的应用程序域。如果它们不是令人尴尬的并行,那么它们中的顺序部分必须在 CPU 上工作,并且您必须进行 hw-sw 协同设计。并行部分将放在 FPGA 上,其余部分放在 CPU 上。如果您想使用 LLVM 实现类似的功能,请考虑将 IR 移至 bgl boost 库,因为您将处理大量图形和对设计进行适当的分区。一旦你找到合适的并行部分,你就可以为此重写 IR。我会说从 CB 开始没有意义。
    【解决方案6】:

    看起来最好的起点是 LLVM 源代码中的 CBackend:

    llvm/lib/Target/CBackend/CBackend.cpp

    【讨论】:

      【解决方案7】:

      LLVM IR 并没有什么特别之处。这是一个具有可变参数的标准 DAG。反编译 LLVM IR 很像反编译机器语言。

      您也许可以利用一些前端优化,例如常量折叠,但与整个任务相比,这听起来微不足道。

      我对 LLVM 的唯一经验是为一个类项目编写二进制翻译器,从玩具 CISC 到自定义 RISC。

      我想说,因为它是最接近标准 IR 的东西(好吧,GCC GIMPLE 紧随其后),看看它是否符合您的算法和风格,并将其作为一种替代方案进行评估。

      请注意,GCC 也开始优先考虑可移植性,并且也取得了很多成就。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 1970-01-01
        • 2020-12-22
        • 1970-01-01
        相关资源
        最近更新 更多