ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Yosys入门:开源Verilog综合工具与OSS CAD Suite使用指南

Yosys入门:开源Verilog综合工具与OSS CAD Suite使用指南 第一次接触 Yosys 的人大概率不是从“我应该选一款综合工具”这个念头开始的而是因为手里已经有一块 FPGA、一条 Verilog 代码、一个 Vivado 或 Quartus 工程然后突然遇到了一个很具体的场景想在命令行里跑一次综合想批量处理几十个设计文件想在教学里让学生看清单条网表或者想把一个开源处理器核拆开、看清它每一级的逻辑结构。Yosys 就是在这一瞬间登场的东西一个开源的、可脚本化的 Verilog 综合工具也是一整套可复现数字 IC 设计流程的入口。但很多人第一次打开 YosysHQ OSS CAD Suite 的下载页面时会先被一堆组件名弄懵yosys、nextpnr、iverilog、gtkwave、edapack、olof……它们到底是同一个工具的不同界面还是互相独立的软件安装包里应该装哪个版本为什么综合完会生成一个不认识的文件里面一堆$and、$add之类的名字这些问题如果没人提前讲清楚很容易在安装那一步就耗尽耐心。这篇内容是一篇比较完整的入门序言我会先把 Yosys 在数字 IC 工具链里的位置讲清楚再带你把 OSS CAD Suite 装好跑通第一个最小综合流程最后重点说说这套开源工具链适合干什么、不应该被误解成什么。1. 为什么数字 IC 入门绕不开 Yosys先回到一个更基本的问题综合工具到底是干什么的。数字芯片设计里你写的是 RTL 代码比如 Verilog 里的module、always、assign芯片真正运行的物理世界是晶体管、逻辑门、触发器、查找表。综合就是把前者翻译成后者的过程它会做语法解析、逻辑推断、优化、映射到具体工艺或者 FPGA 的查找表结构然后输出网表。网表是什么你可以把它理解成一张清单上面列出了用的逻辑单元和它们之间的连接关系。这就是 Yosys 的核心位置。它是一个开源的综合工具读入 Verilog 后可以输出门级网表。这听起来很简单但在这个位置上它其实是整条开源 FPGA/ASIC 流程里最硬的一块拼图。1.1 先清楚它真正解决的是哪一类问题Yosys 解决的不是“你平时写 RTL 代码那一步”而是“写完 RTL 之后你想脱离某个特定厂商的集成环境把它变成网表和布局布线结构”那一步。如果你平时已经在用 Vivado 或 Quartus你其实已经在用商业综合工具了只是它们被包装在集成开发环境里你点一下综合按钮背后发生的事情被隐藏了起来。Yosys 的价值在于把这些内部步骤摊开给你看让你能通过命令脚本逐步控制综合流程。这一点对学习、教学、自动化流程和开源硬件项目尤其重要。常见场景有三类你写了一个小模块想快速看一下逻辑综合后的单元数量对比不同写法的资源消耗。你在跑开源 FPGA 流程比如想让代码跑到一个开源社区支持的开发板上综合器就是 Yosys。你在做 ASIC 方向的学习实验需要先用 Yosys 生成网表再接后续的开源布局布线工具链。这三类需求有个共同点都不需要启动一个巨大的图形化工程工具只想要一个能在脚本里稳定执行、输出可分析的中间结果。Yosys 就是这个角色。1.2 三个核心词综合、网表、工艺映射入门时最容易混淆的三个概念是综合、网表和工艺映射。综合一般指从高层次描述到逻辑门级结构的转换过程。网表转换输出的“图纸”记录单元实例和节点连接。工艺映射综合最后阶段做的事把通用逻辑门变成目标器件支持的基本单元比如 FPGA 的 LUT、ASIC 的标准单元库。Yosys 的默认流程通常包含逻辑综合和工艺映射两个阶段先用proc处理 always 块、opt做逻辑优化然后用techmap和abc做工艺映射最后用write_verilog输出网表。第一步得到的网表是逻辑层面的第二步才是跟你目标器件相关的结构。所以如果你最终目标是某个 FPGA 开发板需要确定自己使用的不仅仅是 Yosys还要有对应的nextpnr等布局布线工具链如果你只是想学习综合过程逻辑层面的网表已经足够分析。1.3 什么阶段值得学什么阶段不用急我给不同人群一个相对清晰的判断如果是 FPGA 初学者还没写满十个模块暂时不需要单独接触 Yosys可以先在厂商工具里积累功能直觉。如果已经开始做小项目但对综合吃什么代码、生成的网表结构是什么样子好奇Yosys 值得装一个成本很低。如果想跑开源硬件项目、RISC-V SoC 学习、开源 FPGA 流程、ASIC 前端实验Yosys 基本是必需品。换句话说它不是替代 Vivado 和 Quartus 的“低价版”而是另一套完全不同的使用方式更透明、更轻量、更有利于理解流程本身。这里先给一个重要提醒Yosys 能综合的 Verilog 语法范围是有限的。可以把它理解为一个功能很实用的 Verilog 综合器但它不会一开始就支持所有仿真库写法。入门阶段尽量使用最经典的 RTL 子集避免引入不可综合的复杂语法。2. 别只盯着 Yosys真正有价值的是整套 OSS CAD Suite很多教程直接把 Yosys 和 OSS CAD Suite 混用但这两个概念有区别。Yosys 是综合器OSS CAD Suite 是 YosysHQ 维护的一整套开源数字 IC 工具链发行包。装好后你会在目录里看到一整个生态工具集合它们彼此配合覆盖从编码到布局布线再到仿真分析的流程。应该先建立这种认识你不是在安装一个工具而是在安装一条“数字 IC 金矿”的开源版本。掌握关键环节如何配套比单独背下某个工具的命令要重要得多。2.1 整套工具链里都有什么一个典型的 OSS CAD Suite 发行包会包含下面这些常用组件组件主要用途在流程中的位置YosysVerilog 综合输出网表RTL 代码 → 逻辑网表 / 工艺网表nextpnrFPGA 布局布线支持多款芯片族是开源的 PnR 代表实现网表 → 位流iverilog / Verilator仿真与验证Verilator 会编译成 C / SystemVerilog 模型以增快仿真设计验证环节GTKWave查看 VCD / FST 波形文件调试环节分析仿真和时序yosys-plugin 相关库各种 FPGA 芯片族支持、单元库支持工艺映射与实现edapack 等工具一些协作工具与库封装按版本分发流程补全这个列表和商业集成工具不太一样它没有把所有步骤整合在同一个图形界面上更像一条命令行管道。你需要在流程的每一段显式地把数据从一个环节交给下一个环节。初看会觉得碎但长期用起来有个优点每一步输入输出都明确出错能定位流程能自动化。2.2 工具链流程化使用比单个工具更容易理解芯片设计我倾向于将 OSS CAD Suite 看作一条完整的“流水线”而不仅是几个软件的合集用 iverilog 或 Verilator 验证 RTL 行为是否符合预期。用 Yosys 综合成逻辑网表或工艺网表。用 nextpnr 完成布局布线。用 GTKWave 查看仿真波形确认功能。这种流程化使用方式适合两种人一种是还在理解芯片设计整体流程的学生另一种是做开源硬件开发、想把代码从一个方案迁移到另一个方案的工程师。商业工具中的许多工厂默认动作在这个环境里变成了显式步骤你被迫理解了自己的设计在到达物理实现前经过了哪些阶段。如果只使用 Yosys 而忽略其他组件你很容易觉得综合输出网表之后没有新鲜产出然后过早判断“这东西太原始”。实际上你需要和后端的 nextpnr 配合才能观察对应的 FPGA 内部资源映射。2.3 从学习角度建议先接触哪几个组件如果时间有限不支持把整套工具链全部拆开我建议按这个顺序接触先装好 Yosys 并用它跑通综合流程这样你能看到网表。再用 iverilog GTKWave 跑一个仿真流程做 RTL 行为验证。第三步按需接触 nextpnr等你的综合网表要落到具体开发板时再学。这个顺序遵循“先看中间产物再看行为验证最后看物理实现”的主线比较顺畅。3. 安装三种思路但有一条最省事的路径安装 OSS CAD Suite 是很多人第一次停下来的地方。不是因为安装本身复杂而是因为“该下载哪个、下载下来怎么用、是不是要编译”信息在页面上不够直白。下面把三种安装思路拆开讲。3.1 预编译发行包大多数人的首选OSS CAD Suite 最常见的分发方式是预编译发行包通常放在 YosysHQ 的官方仓库 Releases 页面会有针对 Windows、Linux、macOS 等常见平台的构建产物。这是多数人的首选路径步骤比较简单根据自己的操作系统下载对应平台的压缩包。解压到固定目录注意路径尽量不含空格、不含中文。将解压目录下的 bin 路径加入系统的 PATH 环境变量或者使用时直接通过完整路径调用。打开终端/命令行运行yosys -V检查版本信息。这样装好的工具链里包含多个可执行文件统一都在 bin 目录下。因为发行包会把依赖库一起打包通常不需要额外手动安装一堆前置依赖这也是预编译包最大的优势稳定、可复现、开箱即用的可能性高。Windows 用户需要注意下载包解压目录的路径尽量不要选“C:\Program Files...这种天然带空格的目录。GCC 编译出的命令行工具对空格路径兼容性整体不错但部分脚本拼接路径时空格依然容易变成意外断点。而 Linux/macOS 用户通常直接放在用户目录下路径管理简单一些。有几个小判断也值得说如果只是学习选择官方仓库里最新的稳定发布版即可不用追更。不要默认“最新版一定是最适合初学者的”有时候刚发布的构建会引入工具链新特性但配套文档和例子反而还没跟上。尽量选择和当前教程、示例项目接近的版本避免因为版本差异导致命令行为不一致。3.2 包管理器与源码构建什么时候才需要考虑除了预编译包还存在通过包管理器安装的方式比如 Linux 的 apt/pacman 或 macOS 的 Homebrew。这种安装方式胜在命令简单但有一个真实风险仓库里的版本历史上表现为通常不是最新版不同发行渠道之间的组件版本组合也可能不一致。它的优点是系统更新时能一起管理更符合系统原生习惯。如果你只是想尽快跑通一个最小流程包管理器版本通常够用但如果要做更复杂的开源 FPGA 流程或 ASIC 实验我建议使用预编译包这样你和 YosysHQ 持续更新的一致性更强。源码构建则更少用于入门阶段。它适合有定制需求的场景比如想修改 Yosys 源码逻辑或接入自定义的工艺库。构建 Yosys 依赖不少开发库和编译器工具链初次配置时间可能比实际使用时间还长。入门阶段不建议只为了“用”就去构建源码。3.3 装完怎么验证版本、帮助信息、最小综合安装完成后不要急着打开大型工程先做三个验证步骤yosys -V yosys -help第一条命令应当打印版本号第二条命令能看到 Yosys 的命令列表表示核心可执行文件已经正常工作。再写一个最小 Verilog 文件做综合测试module top(input a, input b, output y); assign y a b; endmoduleyosys -p read_verilog min.v; hierarchy -check; proc; opt; techmap; opt; write_verilog synth.v命令中的-p表示直接用命令行传入综合脚本不需要进入交互模式。最后能生成synth.v网表文件说明安装链路基本正常。如果这里出现“command not found”说明 PATH 没配好或解压路径不对。先处理路径再考虑其他问题。这也引出下面的排查顺序。注意综合脚本里hierarchy -check会检查模块引用是否完整。示例里的min.v没有额外子模块不会报错如果你读入的设计引用了未提供的子模块这一步会明确提示缺失和目标名称是很常见的入口排查方式。3.4 安装出问题时按这个顺序排查OSS CAD Suite 的安装问题通常不是工具本身坏了而是环境和路径问题。遇到问题时按下面顺序排查会更快先检查可执行文件是否真的在解压目录的 bin 下。有时候压缩包解压会生成多级目录导致实际路径比预期深一层。再看 PATH 配置是否生效。Windows 可以在新开的 PowerShell 窗口里用where yosys判断Linux/macOS 用which yosys。如果命令输出为空就是 PATH 还没找到。检查依赖库。如果你用的是预编译包一般不需要这一步但如果程序提示缺.so文件或者 Windows 下提示缺少 DLL就检查运行库是否正常。最后检查变量冲突。如果系统里已经装过旧版开源工具链可能与新版的 PATH 顺序发生冲突可以用绝对路径调用新版来确认。大部分安装问题都会在这一层解决。只有极少情况需要看 Yosys 运行时的 backtrace 输出但那已经深入到程序自身层面不属于入门阶段主流问题。4. 第一次综合从模块代码到门级网表我建议把第一次综合的目标定得很小不追求优化效果只求完整走完“读入代码、处理逻辑、输出网表”这条链路。然后在这个小闭环里理解每一步在干什么。4.1 准备一个最小 Verilog 示例下面这个模块比“与门”稍微复杂一点包含组合逻辑和非阻塞赋值比较能体现综合的常见处理module example( input wire clk, input wire rst_n, input wire [3:0] a, input wire [3:0] b, output reg [4:0] sum ); always (posedge clk or negedge rst_n) begin if (!rst_n) sum 5d0; else sum a b; end endmodule这个模块的行为很清楚复位时清零否则每个时钟上升沿把a b的结果锁存到sum。用这个作为示例比纯组合逻辑更能让你看清楚 Yosys 如何处理触发器和寄存器推断。将文件保存为example.v然后进入下一步。4.2 理解综合脚本里的每一步这里用一条命令做完整综合yosys -p read_verilog example.v; hierarchy -check; proc; opt; techmap; abc -g AND,OR,XOR; opt; write_verilog mapped.v这条命令里每个关键词都对应一个 Yosys 的 pass不理解它们的话综合脚本读起来就是天书。我们逐个拆命令作用read_verilog读取 Verilog 文件解析成内部 AST 结构hierarchy构建模块层级-check检查未定义子模块是一个正向检查步骤proc把 always 块等过程描述转换成逻辑表达式和触发器单元类似从行为级转换到结构级opt做布尔优化、常量传播、死逻辑消除techmap把通用逻辑单元映射到工艺库支持的基础单元是连接 RTL 和具体器件的关键中间步骤abc调用 ABC 工具完成逻辑综合和优化-g AND,OR,XOR指定使用的基础门集合write_verilog把当前设计以 Verilog 网表格式写出看到这些步骤的输出后你应该能理解综合不是一次性魔法而是把行为描述逐步“翻译”成越来越接近物理结构的表示。4.3 输出网表里能看到什么打开mapped.v会看到这样一类内容模块名变成了example内部出现了类似$add、$logic_not等通用逻辑单元还会出现由abc优化的布尔表达式组合。如果上一步没有接具体工艺库输出主要是逻辑网表如果你加载了 FPGA 供应商库输出会更贴近 LUT 和触发器实例。这里最容易让新手困惑的是为什么我写的是a b输出里却是一堆门电路这正是综合的意义。sum a b是行为描述加法器是抽象逻辑硬件里必须用加法器单元、进位链、寄存器把这些意图具体化。行业也是从这种“看起来很朴素”的网表开始结合布局布线工具最终变成物理实现。综合输出的网表不是用来给人“读代码”的更多是用来供给后续工具使用。初学阶段需要做的是通过网表对比不同 RTL 写法带来的结构差异而不是逐行阅读所有逻辑单元。4.4 先跑通再换参数再批量使用第一次综合的目标只有一个命令能执行完输出文件存在并且文件里能看到你的模块名和一组逻辑单元。做到这一步就可以认为主流程已通。之后可以逐步加复杂度改变abc的门集合观察网表单元类型变化。用自己的一个稍微复杂的模块替换示例观察寄存器数量。把脚本里的步骤存成.ys文件Yosys 脚本格式实现可复用。等到你已经能把多个设计文件读入并综合成对应网表再考虑下一步和 nextpnr 联动。这里有非常直接的循证框架一个 Yosys 综合流程是否成熟的判断标准就是——同样的输入、同样的脚本换到另一台机器上结果是否一致。如果一致说明流程可复现可以扩大使用范围如果不一致优先检查版本和路径。5. 开源工具链的价值与边界聊完安装和跑通流程最后想认真讲讲边界。因为 Yosys 这类开源工具链有一个明显的风险入门时觉得它很强大遇到复杂工程后又觉得它“怎么什么都不行”然后要么过度神化要么全盘否定。5.1 它真正适合的使用场景从我接触到的实践看Yosys OSS CAD Suite 在以下几类场景里特别有价值数字 IC / FPGA 教学。学生可以直接观察综合过程不用依赖厂商图形界面能更清晰理解 RTL 到网表的转换。开源硬件和开源 FPGA 流程。如果一个项目希望你的 RTL 能在多个开源流程中灵活流转Yosys 是天然支点。自动化分析。当你需要批量综合多个配置、对比资源或逻辑级数或者要把综合集成到 CI 里用命令行可调用组件就容易得多。学习综合细节。RTL 综合比赛、网表分析、静态时序分析入门等场景都需要一个可修改的黑盒。在这些场景里Yosys 的核心价值不是“免费”而是“可读、可改、可脚本化”。这决定了它与商业工具竞争时走的是完全不同的路线不是比谁更省心而是比谁更透明、更易嵌入流程。5.2 别把它当成商业 signoff 流程的替代品有一点必须讲清楚大型商业数字 IC 设计最后要做 signoff也就是用一整套经过验证的方法论确认设计在目标的工艺库和时序约束下能够流片。这个过程涉及大量工艺库、库单元时延信息、布局布线约束、时钟树综合、功耗与信号完整性的分析工作。Yosys 可以在教育和小规模实验场景中完成逻辑综合、网表生成甚至配合其他开源后端工具做出一个可上版的原型但它目前不是商业 signoff 流程的等价替代品。要让它用于更接近流片或复杂工业级设计的方向需要使用者已经具备相当多的后端经验和库数据并且要对时序、库单元加约束等环节做大量定制。这需要额外的学习曲线和资源不应低估。所以我对 Yosys 的判断是它是极好的学习工具、流程原型工具、部分小规模工程工具但对中等以上复杂度的商业数字后端流程来说商业 EDA 工具链目前仍是主流选择。两者不是非此即彼的关系。你完全可以先用 Yosys 做早期 RTL 逻辑综合探索然后把设计迁移到商业工具里继续后端实现。5.3 长期使用的几个非功能项要求如果决定把 Yosys 加入长期工作流有几个容易忽略但长期会影响使用体验的点版本管理建议固定某一个发布版本用于项目不要频繁跟着最新版跑。因为综合结果、优化策略、单元命名会随着版本演进变化流水线里不同环节的版本组合也会影响可复现性。流程脚本化不要总在交互式命令行里敲命令把综合流程写成.ys脚本并用参数化方式管理例如对不同顶层模块动态传递参数。这样更接近工程化使用也方便回溯。保存日志和产物综合时建议保留yosys.log和网表输出方便后续分析这次综合时用了哪些指令、消耗了多少资源、映射到了什么单元。外部依赖谨慎OSS CAD Suite 包含了很多组件如果你只用了 Yosys 和 nextpnr就没有必要把整套工具全部加到公共路径里避免不同工具集的版本冲突。这几条虽然不是功能特性但对长期稳定使用的影响往往比“某个命令记没记住”更大。5.4 最后的判断它改变的不是成本是工作方式往回看Yosys 打动人的地方并不只是“免费”。真正有价值的是它把综合这个环节从厂商工具的黑盒里拿出来变成一个可检查、可修改、可整合到自动化流程里的环节。你可以在实验室里用脚本把 100 个 RTL 配置综合成 100 份网表对比资源增长可以把网表导出后自己写一个静态分析脚本可以给学生展示proc前后设计结构的变化。这些在传统厂商工具里不是完全做不到但通常需要更重的流程和更复杂的工程环境。Yosys 把这个门槛降了下来。所以我的建议是先安一个 OSS CAD Suite不急着做复杂工程先用一个几十行的模块跑通综合再把脚本保存下来留作模板。等下一次你要批量处理设计、要分析综合结果、或者想搞清楚厂商工具背后到底在做什么时你已经有一双能“看见内部结构”的眼睛了。这套开源工具链值得长期关注的原因正是因为它把数字 IC 设计从一个需要昂贵授权和封闭流程的领域带到了每个普通工程师都能亲手触达的位置。
返回列表