近日,YosysHQ 发布 Yosys 0.70。更新清单里,mcm 将常数乘法器改写成共享加法器图;实验性的 optbarriers 则插入优化屏障,flatten 和 prep 也新增了相关选项。
综合工程师可以把这两项功能放在一起看。一项寻找可以复用的算术结构,另一项让部分结构在优化过程中保留下来。综合流程由此多了两种更明确的控制手段:哪里尝试合并,哪里暂时保留边界。
对使用开源 EDA 的团队,这次更新最实用的问题是:同一份 RTL,如何在功能一致的前提下,比较不同综合策略?答案需要沿着算法结构、目标映射和验证准备三个环节展开。少几个运算节点,只是评估的起点。
![]()
常数乘法,共享的是什么
mcm 的命令帮助把处理对象写得很清楚:带常数操作数的 $mul 单元。它将这些单元改写为由移位、加法和减法组成的共享图。源码按共同的输入操作数等条件组织乘法组,再为组内系数寻找实现方式。
常数乘法具有可以利用的算术关系。例如,乘以 3 可以写成输入与左移一位后的输入相加;乘以 21 可以继续利用乘以 3 的中间结果。若令 t=3x,那么 21x=8t−t。这个代数示意揭示了共享的对象:同一输入产生的中间倍数。
在足够的位宽下,3x 和 21x 可以由两次加减运算连接起来。分别实现两个系数时,也能用移位加减,但共同的中间结果未必得到同样利用。mcm 将这类复用机会作为一组问题处理,视野超过单个乘法单元。
仓库中的测试恰好包含同一输入乘以 3 和 21 的情形。测试脚本要求变换后没有 $mul,并检查加减单元总数为两个,同时调用等价性检查。这是一个能读懂、能定位的结构案例,读者可以从输入系数一路追到输出图。
不过,RTL 的乘法语义还包含有符号性、输入输出位宽和截断规则。代数恒等式落到有限位宽的电路里,需要正确处理扩展和输出取位。官方测试还覆盖不同宽度的截断输出、负系数和不支持的宽系数;宽系数案例要求保留原乘法单元。
因此,观察 mcm 的效果时,先看它实际处理了哪些乘法组,再看输出结构。把“所有乘法都能合并”当作预期,很容易误读日志。不同输入、不同语义或超出处理范围的对象,应分别判断。
少几个加法器,时序可能怎样变化
共享中间结果可以减少重复计算,也会改变数据依赖。原本分别计算的两条支路,可能共同依赖一个中间节点。沿关键路径串联的运算层数、共享节点的扇出以及后续布线,都需要重新观察。
Yosys 0.70 的 mcm 提供了 -depth 参数,用来限制加法器图的最大深度,默认值为 3。命令帮助也说明,较低的深度限制可以约束延迟,但可能需要更多加法器。参数本身就表达了面积与逻辑深度之间的取舍。
这里的“深度”是图结构中的运算层数。它不能直接换算成纳秒,也不能作为完成时序收敛的证明。同样一层加法,在不同位宽、单元库和布线条件下,会有不同代价。具体频率目标仍要交给映射和时序分析检验。
另一个值得关注的参数是 -min_gain。它要求共享方案相对独立的有符号数字表示实现,达到一定的估算单比特加法器成本节省比例。这个成本模型用于筛选方案,衡量的是算法内部的估算收益。
这个比例不能直接换算成芯片面积或功耗的降幅。实际实现还会受到单元选择、缓冲、连线和切换活动影响。即使共享图在结构上更省,关键路径也可能成为新的限制。面积、时序和功耗需要各自对应测量口径。
目标器件同样会改变选择。在 FPGA 上,专用 DSP 资源与逻辑资源之间存在映射取舍;在 ASIC 上,加减网络要映射到目标库。工程评估应固定器件或单元库,再比较资源占用和约束下的结果,避免把某一种实现偏好推广到所有目标。
mcm 还提供搜索预算、最大节点数和最大移位范围等控制。团队可以用这些参数限定探索成本。-force 会跳过收益检查,适合有意识地查看候选结构;把它写进默认脚本前,应确认为什么要接受这类方案。
为什么综合还需要优化屏障
综合优化会折叠常数、合并等价结构、整理连接。面向最终实现,这些动作通常有助于缩减逻辑;面向结构检查和验证准备,工程师有时需要保留特定信号及其连接关系,方便分析设计。
optbarriers 默认向所选公开命名线网的驱动侧插入优化屏障。这里的“公开”是 Yosys 内部命名分类,不涉及访问权限,也不限于顶层端口。命令允许按单元、过程和直接连接选择插入范围,还能扩展到部分私有线网。
官方测试给出了一个直观对照:几个常数相加,不带屏障的 prep 会折叠加法;使用 prep -barriers 后,测试要求保留两个加法单元。另一个案例检查两路相同加法的连接关系,比较加入屏障前后的合并行为。
工程师可以在准备阶段保留需要观察的结构。分析中间信号、追踪连接来源或检查局部表达式时,这种可控性有实际用途。它同时限制了优化空间,是否保留、保留到哪一步,需要跟任务目标一致。
flatten -barriers 与保留模块层级也要分清。flatten 会展开层级;新增选项在被展开模块驱动公开线网时引入屏障。keep_hierarchy 则让带相应属性的模块或实例不被展开。展开后保留优化边界,与保留原模块层级,是两个操作。
prep 的定位是保守的 RTL 综合,常用于验证流程的准备阶段。-barriers 将保留结构的选项接入这条流程。官方把屏障相关功能标为实验性,导入时应检查所用 pass 和后续工具如何处理屏障单元。
optbarriers -remove 可以把所选屏障替换回连接。移除后,后续流程的优化空间也会变化。因此,屏障的生命周期需要写进脚本:在哪个阶段插入,哪个检查依赖它,何时移除,移除后保存哪份结果。
把更新变成一组可比较的实验
对已有综合流程,最有用的起点是一组受控对照。保留当前稳定脚本作为基线,在同一版本、同一 RTL 和相同目标约束下,增加 mcm 分支;如果需要结构分析,再单独设置屏障分支。先分别观察,才能知道结果变化来自哪一步。
结构层面,应记录乘法组数量、被替换的单元、加减图规模和深度。日志能回答变换是否发生、发生在哪里;保存变换前后的中间网表,则能帮助定位未被处理的对象及意外变化。
功能层面,要检查有符号性、截断和位宽处理。官方测试使用等价性检查,为复现提供了入口,但具体设计仍应使用自己的验证设置。验证条件、黑盒假设和状态初始化需要固定,检查通过才能继续比较实现结果。
实现层面,再看目标映射后的资源、关键路径和必要的功耗评估。若最终目标是 ASIC 布局布线,应继续看物理结果;若目标是 FPGA,则检查 DSP、逻辑资源及器件时序。用中间单元计数替代最终验收,会把优化链条停得太早。
这套顺序也适用于 AI 辅助的流程探索。把专业知识、工具执行和验证记录接入研发流程,正是 AI+EDA 工程化落地需要解决的问题。让 AI 提议参数或生成脚本时,应把工具版本、运行日志、验证记录和人工 review 放进同一次实验。脚本能运行、功能检查通过、实现满足约束,各自有独立的验收条件。
研发团队可以按职责收集证据:设计工程师确认算术语义和关键路径变化,验证工程师确认比较条件与等价性结果,CAD 负责人维护参数、脚本和版本记录。这样,一个偶然表现更好的结果才有机会成为可复用的流程配置。
版本升级本身也要与新增 pass 的收益分开比较。先观察旧流程在 0.70 下的表现,再打开新功能,能减少把其他版本变化归到 mcm 身上的误判。对实验性屏障,优先在可回退的验证准备分支导入。
Yosys 0.70 给开源综合增加了更细的操作入口。mcm 让常数乘法的共同结构进入显式优化,屏障让结构保留成为可以安排的流程步骤。两者服务于不同任务,组合方式应由设计目标决定。
判断这类更新,可以沿着三层证据走:变换了什么结构,是否保持目标功能,映射后是否满足工程约束。每一层都有自己的输出,前一层通过才能继续评价下一层。
对团队来说,值得沉淀的是一份能说明取舍、能复现结果、能随时回退的综合配置。加法器少了多少,可以成为实验的第一行;设计最终能否用,必须由后面的验证和实现结果回答。
作者:麒芯
本文基于公开资料作技术分析,具体设计效果请按目标器件、约束及验证结果评估。
参考资料:YosysHQ — Yosys 0.70;mcm / optbarriers / flatten / prep 源码;mcm 与 optbarriers 回归测试。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.