为LLVM创建VHDL后端?

时间:2010-09-08 04:44:29

标签: llvm vhdl

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

只是为了澄清:有没有将LLVM IR翻译成更高级语言而不是汇编语言的例子?例如:您可以使用Clang在C中读取,使用LLVM进行一些优化,然后使用其他语言(如Java或Fortran)编写代码。

7 个答案:

答案 0 :(得分:15)

是的!

有很多LLVM后端针对VHDL / Verilog:

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

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

答案 1 :(得分:3)

LLVM IR没有什么特别之处。它是具有可变arity的标准DAG。反编译LLVM IR就像反编译机器语言一样。

您可能能够利用一些前端优化,例如常量折叠,但与整个任务相比,这听起来很小。

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

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

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

答案 2 :(得分:1)

我不确定我会跟踪你的问题的各个部分是如何相互关联的。

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

然而,VHDL是另一项业务。你认为VHDL是一种高级语言吗?它可能是,但描述硬件/逻辑。确实VHDL有一些你可以用它来实际编程的结构,但它不是一个富有成效的努力。 VHDL描述了硬件,因此将LLVM IR转换为非常困难的问题,除非你设计一个带有VHDL自定义指令集的CPU并将LLVM IR转换成你的指令。

答案 3 :(得分:1)

这个帖子是我在寻找同样的事情时发现的第一件事。

我找到了一个相当远的项目,在llvm 3.5下干净地构建。这真的很酷。它吐出HDL并做各种其他很酷的FPGA相关的事情。虽然它可以与TTA一起使用并为FPGA生成图像(或模拟它们),但它也可以通过c函数进行一些简单的HDL生成。

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

TTA-Based Co-design Environment

我也尝试了接受的答案中列出的东西以及其他几个,并发现它们不适合我或不是很高质量(通常是两者)。 TCE是专业的感觉,但我相信纯粹的学术。非常好看。

答案 4 :(得分:1)

似乎问题得到了部分回答,所以我想试一试:

  • 为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/已回答了问题

答案 5 :(得分:-1)

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

LLVM / LIB /目标/ CBackend / CBackend.cpp

答案 6 :(得分:-1)

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

您正在寻找的是将LLVM代码转换为emscripten为Javascript所做的更高语言的方法。

但是看起来你错过了LLVM的一点,因为它意味着生成静态代码以实现它们为此目的使用特定的中间语言构建。

正如你所看到的,emscripten工作的方式是通过实现一个堆栈,但不使用javascript就像人类会做的那样。

他们是几个尝试实现原始问题的项目,例如将{python转换为VHDL或Verilog的MyHDL