XLS:加速硬件综合

Hacker News Top 工具

摘要

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

Hacker News Top

RisingEdge.pro 是一个基于浏览器的平台,用于通过编写、仿真和综合 VHDL 和 SystemVerilog 代码来学习和练习硬件设计,使用真实的 EDA 工具(如 GHDL、Icarus 和 Yosys),并提供交互式波形和引导式课程。

XS: 一种编程语言。随时随地,人人可用。

Hacker News Top

XS是一种新的编程语言,以单个静态链接的二进制文件形式分发,其中包含编译器、语言服务器、调试器、格式化器、代码检查器、测试运行器、性能分析器和包管理器。它可以在多个平台上无需修改地运行,包括Linux、macOS、Windows、WASI、iOS、Android、ESP32和Raspberry Pi,并提供多种后端,包括JIT、虚拟机以及到C和JavaScript的转译器。

代码合成大语言模型的危害分析框架

OpenAI Blog

OpenAI 提出了一套危害分析框架,用于评估 Codex 等代码合成 LLM 相关的安全风险,通过创新的代码生成能力评估方法论来审视技术、社会、政治和经济影响。