CIRCT项目简介
CIRCT(Circuit IR Compilers and Tools)是一个开源的电路中间表示(IR)编译器和工具项目。该项目致力于将MLIR(Multi-Level Intermediate Representation)和LLVM开发方法论应用于硬件设计工具领域,旨在构建一个更加一致、模块化和可重用的基础设施。
CIRCT的名称可以递归地解释为"CIRCT IR Compiler and Tools"。项目名称中的"T"可以灵活地扩展为Tool(工具)、Translator(转换器)、Team(团队)、Technology(技术)、Target(目标)、Tree(树)、Type(类型)等,项目组对这种模糊性持开放态度。
项目动机
电子设计自动化(EDA)行业拥有众多广泛使用的专有和开源工具。然而,这些工具往往存在以下问题:
- 工具之间不一致
- 可用性存在问题
- 工具设计时并未考虑作为一个统一平台
- 大多数工具使用Verilog作为交换的中间表示,而Verilog存在一些已知的设计问题和局限性,例如位置跟踪支持不足
CIRCT项目是一项实验性努力,旨在将MLIR和LLVM的开发方法应用于硬件设计工具领域。项目的目标是构建一个可重用的基础设施,具有以下特点:
- 模块化设计
- 采用基于库的设计技术
- 更加一致
- 基于编译器基础设施和编译器设计技术的最佳实践
通过共同努力,CIRCT希望能够形成一个新的重心,吸引开源硬件工具领域的贡献者。这将推动开源工具的发展,实现硬件设计的新的高级抽象,并有可能被专有工具采用部分技术。
社区参与
CIRCT是一个开放和欢迎新成员的社区。如果你有兴趣参与,可以通过以下方式:
-
加入LLVM Discourse服务器上的CIRCT论坛。要获得类似邮件列表的体验,可以点击右上角的铃铛图标并切换到"Watching"。
-
加入LLVM discord服务器的CIRCT频道进行实时讨论。
-
参加每周的视频会议。详细信息请查看会议记录文档。
-
贡献代码。CIRCT遵循所有LLVM政策:你可以为CIRCT仓库创建pull request,并按照标准LLVM政策获得提交权限。
CIRCT架构
CIRCT项目包含多个方言(Dialect),用于表示不同抽象级别的硬件设计。下图展示了当前的方言及其相互关系:
主要方言包括:
- FIRRTL: 用于表示RTL级硬件设计
- HW: 表示硬件模块和接口
- SV: 表示SystemVerilog结构
- Comb: 表示组合逻辑
- Seq: 表示时序逻辑
- FSM: 表示有限状态机
- Handshake: 表示数据流图
- LLHD: 表示逻辑级硬件描述
这些方言之间可以进行转换和优化,形成一个完整的编译流程。
项目设置
要设置CIRCT项目,可以按照以下步骤操作:
-
安装LLVM/MLIR的依赖项,包括cmake和ninja。
-
克隆CIRCT仓库及其LLVM子模块:
git clone git@github.com:llvm/circt.git
cd circt
git submodule init
git submodule update
- 构建并测试LLVM/MLIR:
cd circt
mkdir llvm/build
cd llvm/build
cmake -G Ninja ../llvm \
-DLLVM_ENABLE_PROJECTS="mlir" \
-DLLVM_TARGETS_TO_BUILD="host" \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DCMAKE_BUILD_TYPE=DEBUG
ninja
ninja check-mlir
- 构建并测试CIRCT:
cd circt
mkdir build
cd build
cmake -G Ninja .. \
-DMLIR_DIR=$PWD/../llvm/build/lib/cmake/mlir \
-DLLVM_DIR=$PWD/../llvm/build/lib/cmake/llvm \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DCMAKE_BUILD_TYPE=DEBUG
ninja
ninja check-circt
ninja check-circt-integration # 运行集成测试
这将编译CIRCT及其所有依赖项,并运行测试套件以确保一切正常工作。
使用CIRCT
CIRCT提供了多个工具和库,可以用于硬件设计和验证:
- circt-opt: 用于应用CIRCT优化和转换的命令行工具
- circt-translate: 用于在不同IR表示之间进行转换的工具
- firtool: 用于编译和优化FIRRTL设计的工具
- Verilator集成: 可以使用Verilator进行SystemVerilog代码检查
此外,CIRCT还提供了Python绑定,允许在Python脚本中使用CIRCT的功能。
未来发展
作为一个实验性项目,CIRCT正在快速发展中。未来的发展方向包括:
- 改进现有方言和转换
- 添加新的高级硬件描述语言前端
- 增强与其他EDA工具的集成
- 探索新的硬件设计和验证方法
CIRCT项目欢迎来自学术界和工业界的贡献,共同推动开源硬件设计工具的发展。
结论
CIRCT项目为硬件设计工具带来了现代编译器基础设施的优势。通过应用MLIR和LLVM的开发方法,CIRCT旨在构建一个更加一致、模块化和可扩展的硬件设计生态系统。尽管仍处于实验阶段,但CIRCT已经展现出了巨大的潜力,有望为硬件设计领域带来革命性的变化。
无论你是硬件设计工程师、编译器开发者,还是对开源硬件工具感兴趣的爱好者,CIRCT项目都为你提供了一个参与和贡献的机会。通过共同努力,我们可以推动硬件设计工具的创新,为未来的硬件设计带来更多可能性。