XLS:加速硬件综合
摘要
XLS 是谷歌的一个实验性高层次综合工具链,它从高层次描述生成可综合的硬件设计,旨在加速后摩尔时代的硬件-软件协同设计。
暂无内容
查看缓存全文
缓存时间: 2026/09/15 23:57
# XLS:加速硬件综合
来源:https://google.github.io/xls/
XLS标志
## 什么是XLS?
XLS实现了一个高级综合工具链,可从灵活、高层次的功能描述生成可综合设计(Verilog和SystemVerilog)。该项目采用Apache 2许可证。
XLS(加速硬件综合)旨在成为摩尔定律终结(EoML)时代的软件开发套件(SDK)。在这个"专业化时代",软件和硬件工程师必须跨越领域边界进行更多协同设计——在共享制品上协作,理解彼此的成本模型,并共享工具/方法论。XLS试图利用自动化、软件工程师和机器周期来加速这一整体流程。
XLS能够通过"软件风格"方法论快速开发**硬件IP**,这些IP同时可作为高效的**主机软件**运行。XLS设计能以原生速度运行,可用于主机软件或仿真器,但该设计也能生成硬件模块输出——XLS工具的正确性确保(并提供工具辅助形式化验证)它们功能相同。
XLS支持带有纯线I/O接口的函数(可选择性流水线化)和**并发进程**(https://google.github.io/xls/tutorials/what_is_a_proc/)(或称`proc`)。Proc是具有状态的,允许随时间推演,并包含更通用的通信接口。
## 项目现状
XLS处于实验阶段,正在快速发展,并非Google官方支持的产品。可能会遇到错误和未完善之处。请通过试用、运行部分教程(https://google.github.io/xls/tutorials/)、报告错误(https://github.com/google/xls/issues)来帮助我们。
我们处于早期阶段,这带来一些实际影响:
- 我们欢迎提交问题和PR。请尽量先提issue。如希望提交上游变更,请通过issue与我们沟通。未经issue讨论直接提交PR可能导致成功路径更长。若认为PR已就绪且两个工作日内未收到回复,请在issue中提醒并说明您认为的下一步操作。
- 目前发展阶段中,我们定期改进DSLX时不考虑向后兼容性。若使用XLS构建硬件资产,请谨慎考虑引入新编译器版本的流程。
## Colab笔记本
若想尝试更易设置且环境无关的XLS,请参阅我们的colab笔记本:
- bit.ly/learn-xls (https://bit.ly/learn-xls):通过DSLX(我们受Rust启发的领域特定语言)进行的"Y分钟学习XLS"式指南。
- bit.ly/xls-playground (https://bit.ly/xls-playground):XLS评估环境,可交互运行以下内容:
- XLS测试
- XLS→IR转换
- IR→Verilog代码生成
- 通过Yosys进行Verilog综合(使用开源PDK:ASAP7和SKY130)
- 通过OpenROAD进行布局布线(P&R)
- 收集功耗/性能/面积(PPA)指标
## 安装最新版本
以下命令用于下载适用于x64 Linux机器的最新github仓库发布二进制文件:
```
# 确定最新发行版tarball的URL。
LATEST_XLS_RELEASE_TARBALL_URL=$(curl -s -L \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/google/xls/releases | \
grep -m 1 -o 'https://.*/releases/download/.*\.tar\.gz')
# 下载tarball并解压,查看每个包含工具的版本号。
curl -O -L ${LATEST_XLS_RELEASE_TARBALL_URL}
tar -xzvvf xls-*.tar.gz
cd xls-*/
./interpreter_main --version
./ir_converter_main --version
./opt_main --version
./codegen_main --version
./proto_to_dslx_main --version
```
## 从源代码构建
除二进制发布(如上所述适用于x64 Linux)和colab笔记本外,XLS必须使用Bazel构建系统从源代码构建。
以下说明针对Ubuntu 22.04(Jammy Jellyfish)Linux发行版。
在普通8核虚拟机上:
- **不包含C++前端(如"仅DSLX")的完整初始构建可能约需2小时**
- **包含C++前端可能需时长达6小时**
请参阅下面对应的两条命令——我们首先假设已安装Bazel(https://bazel.build/install/ubuntu):
```
~$ git clone https://github.com/google/xls.git
~$ cd xls
~/xls$ # 按照bazel安装说明安装bazel 7
~/xls$ # https://bazel.build/install/ubuntu
~/xls$ # 注意我们将告知Ubuntu `/usr/bin/env python`实际上是python3
~/xls$ # 因为过去Ubuntu默认并非如此。
~/xls$ # 这很重要。不执行此步骤可能导致晦涩的错误信息:
~/xls$ sudo apt install python3-dev libtinfo6 python-is-python3
~/xls$ # 现在在优化构建模式下进行构建/测试。
~/xls$ # 如果不计划使用C++前端(非必需,即仅DSLX前端),
~/xls$ # 请使用此命令行:
~/xls$ bazel test -c opt -- //xls/... -//xls/contrib/xlscc/...
~/xls$ # 构建所有内容,包括C++前端:
~/xls$ bazel test -c opt -- //xls/...
```
### Docker构建
如果在您的环境中设置(有限集的)依赖项有困难,也可通过`Dockerfile`提供参考构建/测试环境设置:
```
~$ git clone https://github.com/google/xls.git
~$ cd xls
~/xls$ # 构建并运行xls测试。
~/xls$ docker build . -f Dockerfile-ubuntu-22.04
~/xls$ # 设置xls构建环境并允许手动测试/构建
~/xls$ docker build . -f Dockerfile-ubuntu-22.04 \
-t xls-build-docker \
--build-arg SKIP_TESTS=1
...
~/xls$ docker run -it --rm xls-build-docker /bin/bash
...
xls-developer@de12154edf52:~/xls$ bazel build --verbose_failures -c opt //xls/jit:jit_channel_queue_test
...
```
### 添加额外构建缓存
许多程序员习惯使用`ccache`等程序改进构建缓存,但Bazel实际内置了高质量缓存层。特别是,增量构建更安全。
然而在某些情况下,Bazel可能决定重新编译本可本地缓存的文件——或在执行`bazel clean`后仍可安全重用某些中间结果。为改善此问题,您可以告知Bazel使用共享"磁盘缓存",将文件持久化存储在磁盘其他位置;只需在某处创建目录(如`~/.bazel_disk_cache/`),然后运行:
```
echo "build --disk_cache=$(realpath ~/.bazel_disk_cache)" >> ~/.bazelrc
echo "test --disk_cache=$(realpath ~/.bazel_disk_cache)" >> ~/.bazelrc
```
警告
Bazel不会自动清理此目录,因此它会无限增长。您需要定期手动或通过自动化脚本清理。
或者,您可以添加远程缓存(https://bazel.build/remote/caching),由它为您处理垃圾回收。这可托管在个人服务器甚至本地机器上。我们曾使用localhost实例的bazel-remote(https://github.com/buchgr/bazel-remote/)取得良好效果。
### 获取Clangd补全
有两种方式获取Clangd补全及相关功能:
运行`xls/dev_tools/make-compilation-db.sh`可创建与Clangd及类似工具兼容的`compile_flags.txt`文件。此方法更快,但未考虑各个目标构建方式的差异。
或者,可使用hedronvision/bazel-compile-commands-extractor(https://github.com/hedronvision/bazel-compile-commands-extractor)生成Clangd可处理的`compile_commands.json`文件。此方法设置较慢,但编译器标志针对每个目标定制。可通过以下命令构建`compile_commands.json`文件:
```
bazel build -c opt //xls/... -k
bazel run //:refresh_compile_commands
```
更多详情请参阅顶级BUILD文件(https://github.com/google/xls/blob/main/BUILD)中的注释。
## 架构图和项目布局
导航新代码库可能令人望而生畏;以下描述提供了重要目录及其预期组织/目的的高层视图,对应于XLS架构图中的组件:
XLS架构图
- `dependency_support`(https://github.com/google/xls/tree/main/dependency_support):加载、构建并暴露XLS**外部**依赖Bazel目标的配置文件。
- `docs_src`(https://github.com/google/xls/tree/main/docs_src):Markdown文件源,通过mkdocs(https://google.github.io/xls/contributing/#rendering-documentation)渲染为`docs`。
- `xls`(https://github.com/google/xls/tree/main/xls):仓库中具有项目名的子目录,遵循通用Bazel项目风格。
- `build`(https://github.com/google/xls/tree/main/xls/BUILD):创建XLS构件的构建宏;例如将DSL转换为IR、为DSL代码创建测试目标等。
- `codegen`(https://github.com/google/xls/tree/main/xls/codegen):Verilog AST(VAST)支持,用于生成Verilog/SystemVerilog操作和FSM。VAST由我们称为**生成器**(如PipelineGenerator、用于FSM的SequentialGenerator)的组件在从XLS IR翻译过程中构建。
- `common`(https://github.com/google/xls/tree/main/xls/common):基于标准库使用的"基础"功能。通常我们尽可能使用Abseil(https://abseil.io/)的基础构建块版本。
- `contrib/xlscc`(https://github.com/google/xls/tree/main/xls/contrib/xlscc):实验性C++语法支持,可面向XLS IR(DSLX的替代路径),由Google姊妹团队开发,与XLS项目其他部分共享相同的开源/测试流程。对拥有现有C++ HLS代码库的团队可能特别有用。
- `data_structures`(https://github.com/google/xls/tree/main/xls/data_structures):XLS中使用的泛型数据结构,对标准库进行扩充;如BDD、并集查找、最小割等。
- `delay_model`(https://github.com/google/xls/tree/main/xls/estimators/delay_model):用于表征、描述和插值XLS IR操作在目标后端工艺上数据延迟的功能。已表征的描述置于`xls/estimators/delay_model/models`,可通过命令行标志引用。
- `dslx`(https://github.com/google/xls/tree/main/xls/dslx):一种模仿Rust的DSL(称为"DSLX"),同时是面向硬件的不可变表达式语言数据流DSL;例如任意位宽、完全固定大小对象、完全可分析的调用图。XLS团队发现数据流DSL相比为冯·诺依曼计算设计的语言更适合描述硬件。
- `fuzzer`(https://github.com/google/xls/tree/main/xls/fuzzer):全栈多进程模糊测试器,在DSL层生成程序并交叉比较不同执行引擎(DSL解释器、IR解释器、IR JIT、代码生成Verilog仿真器)。设计为可在集群不同节点同时运行并积累共享发现。
- `examples`(https://github.com/google/xls/tree/main/xls/examples):经过测试且可通过XLS栈执行的示例计算。
- `experimental`(https://github.com/google/xls/tree/main/xls/experimental):从实验探索中捕获的构件。
- `interpreter`(https://github.com/google/xls/tree/main/xls/interpreter):XLS IR的解释器——对调试和探索有用。对于需要吞吐量的场景,请考虑使用JIT(如下)。
- `ir`(https://github.com/google/xls/tree/main/xls/ir):XLS IR定义、文本解析器/格式化器以及用于抽象求值的工具。
- `jit`(https://github.com/google/xls/tree/main/xls/jit):基于LLVM的XLS IR JIT。支持DSLX和XLS IR程序的原生速度执行。
- `modules`(https://github.com/google/xls/tree/main/xls/modules):可轻松在更广泛设计中重用或实例化的硬件构建块DSLX"库"(DSLX标准库之外)。
- `netlist`(https://github.com/google/xls/tree/main/xls/netlist):解析/分析/解释网表级描述的库,通常以简单结构Verilog形式并关联单元库提供。
- `passes`(https://github.com/google/xls/tree/main/xls/passes):作为优化一部分在调度/代码生成前运行在XLS IR上的遍。
- `scheduling`(https://github.com/google/xls/tree/main/xls/scheduling):调度算法,确定时钟设计中操作执行时机(例如哪个流水线阶段)。
- `simulation`(https://github.com/google/xls/tree/main/xls/simulation):封装Verilog仿真器并为XLS计算生成Verilog测试平台的代码。当前使用iverilog(https://github.com/steveicarus/iverilog)进行仿真,因其支持不可综合的测试平台构造。
- `solvers`(https://github.com/google/xls/tree/main/xls/solvers):从XLS IR到SMT求解器输入的转换器,以便在XLS计算上运行形式化证明;例如XLS IR与网表描述之间的逻辑等价检查。使用Z3(https://github.com/Z3Prover/z3)作为求解引擎。
- `synthesis`(https://github.com/google/xls/tree/main/xls/synthesis):封装后端综合流程的接口,使工具可重新定向(例如在ASIC和FPGA流程间切换)。
- `tests`(https://github.com/google/xls/tree/main/xls/tests):跨越XLS项目各个顶层组件的集成测试。
- `tools`(https://github.com/google/xls/tree/main/xls/tools):许多工具(https://google.github.io/xls/tools/)通过命令行接口以解耦方式使用XLS系统及其库。
- `visualization`(https://github.com/google/xls/tree/main/xls/visualization):用于交互式检查XLS编译器/系统的可视化工具。参见IR可视化(https://google.github.io/xls/ir_visualization/)。
关于XLS的讨论——开发、调试、使用等:
- 理想情况下在XLS仓库GitHub讨论(https://github.com/google/xls/discussions)中进行
- 但如果认为邮件更适合讨论,也有xls-dev邮件列表(https://groups.google.com/g/xls-dev)——如有可能请优先使用GitHub讨论,因其可搜索且易于交叉引用并转化为issue跟踪器中的issue
## 贡献者
以下是XLS项目的贡献者(https://github.com/google/xls/graphs/contributors);如您有兴趣贡献,请参阅贡献文档(https://google.github.io/xls/contributing/)和新手任务(https://github.com/google/xls/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22),或通过GitHub讨论(https://github.com/google/xls/discussions)联系!
- Aidan Kirk (https://github.com/aidankirk12)
- Albert Magyar (https://github.com/albert-magyar)
- Alex Light (https://github.com/allight)
- Amin Kalantar (https://github.com/aminiok1)
- Angelo Matni (https://github.com/angelomatni1)
- Balint Christian (https://github.com/cbalint13)
- Blaok (https://github.com/Blaok)
- Brandon Jiang (https://github.com/brajiang)
- Brian Searls (https://github.com/briansrls)
- Chen-hao Chang (https://github.com/cchao)
- Chris Drake (https://github.com/cjdrake)
- Chris Leary (https://github.com/cdleary)
- Conor McCullough (https://github.com/crmymh)
- David Plass (https://github.com/dplassgit)
- Dan Killebrew (https://github.com/dkillebrew-g)
- Derek Lockhart (https://github.com/dmlockhart)
- Eric Astor (https://github.com/ericastor)
相似文章
Show HN: 在浏览器中编写、仿真和综合 VHDL/Verilog
RisingEdge.pro 是一个基于浏览器的平台,用于通过编写、仿真和综合 VHDL 和 SystemVerilog 代码来学习和练习硬件设计,使用真实的 EDA 工具(如 GHDL、Icarus 和 Yosys),并提供交互式波形和引导式课程。
XS: 一种编程语言。随时随地,人人可用。
XS是一种新的编程语言,以单个静态链接的二进制文件形式分发,其中包含编译器、语言服务器、调试器、格式化器、代码检查器、测试运行器、性能分析器和包管理器。它可以在多个平台上无需修改地运行,包括Linux、macOS、Windows、WASI、iOS、Android、ESP32和Raspberry Pi,并提供多种后端,包括JIT、虚拟机以及到C和JavaScript的转译器。
代码合成大语言模型的危害分析框架
OpenAI 提出了一套危害分析框架,用于评估 Codex 等代码合成 LLM 相关的安全风险,通过创新的代码生成能力评估方法论来审视技术、社会、政治和经济影响。
智能体能否通过更高层次的抽象设计更好的芯片?
本文探索使用LLM智能体进行芯片设计,采用更高层次的抽象,引入名为AHRR的工作流,该工作流结合了基于智能体的HLS设计与RTL细化,在基准测试中实现了比直接RTL设计快2.6倍的加速。
MorphoHDL:用于生长电路的极简语言
MorphoHDL 是一种用于设计和生长电路的极简领域特定语言,提供简单的语法来描述硬件。