FPGA 专家 35:异步设计在 FPGA 上——理解原理,克制使用
本文是
fpga/专家层第 38 篇。CDC/亚稳态工程实践见 进阶 07 与 异步 FIFO,复位纪律见 进阶 09。
一、三个层次,先别混淆
| 层次 | 机制 | FPGA 态度 |
|---|---|---|
| CDC | 同步逻辑跨时钟边界 | 必须掌握,工具支持 |
| GALS | 多个同步时钟岛 + 岛间握手 | 推荐的"异步风格"上限 |
| 自定时/无时钟 | dual-rail、C 元件、微流水线 | 仅学术/ASIC,FPGA 上慎做 |
二、真异步为什么在 FPGA 上失效

异步成立的前提 FPGA 的现实
matched delay 精确插入 × LUT/布线延迟离散且每次编译变化
无冒险定制单元(C-element) × 只能用 LUT 拼,毛刺被路由放大
时钟树昂贵值得省掉 × 全局时钟树+MMCM 本就低偏斜低功耗
延迟不敏感形式验证 × STA/约束/DFT 全部围绕时钟沿三、GALS:工程化的"异步收益"

采集岛(clk_a) ──req/data──► [握手FIFO/CDC] ──► 处理岛(clk_b, 空闲时钟使能)
▲ │
└────────────── ack ◄────────────────────────────┘
岛内部全部同步;岛间全部走规范化握手;功耗靠使能/降频/电源域- 数据驱动:无任务时 CE 停拍、BRAM 不使能、甚至 MMCM 降频;
- 可正常写 SDC、做 STA 与 CDC 检查——这是和真异步的本质区别。
四、异步理论速览(知其然即可)
四相捆绑数据握手、dual-rail 有效性编码、微流水线、QDI 用"本地延迟假设"替代全局时序——思想优雅,但落地工具链几乎只存在于标准单元 ASIC 流程。
五、必须面对的少量真异步边界

同步器/仲裁器(亚稳态不可消灭只能压低概率)、异步断言同步释放、POR/配置完成、跨电源域、异步管脚输入——统一纪律:压缩到最小边界、进入即同步、约束写全。
六、GALS 架构的工程实现:封装岛、暂停时钟与安全跨域
GALS(全局异步、局部同步)是 FPGA 上获取异步设计大部分收益、又不触碰无时钟逻辑雷区的现实方法:把系统划分为若干时钟岛(clock domain / island),岛内是完全常规的同步设计(一个时钟、标准时序收敛),岛与岛之间用可靠的异步通信结构解耦。这样每个岛可以独立选择频率(按负载调频)、独立收敛时序、在物理上隔离噪声和毛刺,而系统不会因为“所有东西一个全局时钟”而被迫按最慢模块的节奏跑、或把高频时钟分布到整片芯片。难点从“设计异步门”转成了“划岛、跨域接口、复位与性能建模”这些可工程化的问题。
划岛原则要兼顾解耦收益与跨域成本。天然的岛边界是:速率不同的功能块(100M 控制面 vs 322M 数据面)、来自不同 IP/厂商的黑盒(各自带时钟,干脆作为独立岛)、需要独立门控/调频的功耗区、物理上相距远且松耦合的模块、以及噪声敏感模块(让低抖动时钟逻辑远离高速翻转的数字大岛)。反过来,宽总线、逐周期紧握手、反馈环绝不能跨岛——每跨一次域就要 FIFO/同步器,延迟几拍、消耗资源、带来不确定性,这类接口必须包在同一岛内。划岛的迭代方法是先画“模块交互频率图”,把高频、宽、紧的连线包在一起,把稀疏、窄、天然按消息/流交互的接口作为岛界,这和多 FPGA/多引擎分割的思路一致。

岛间通信的标准件要参数化、可复用、全团队统一。三种基本结构:①单 bit 电平/脉冲事件用双触发器同步器(或标准脉冲同步器,注意脉冲宽度要够、快到慢域要握手);②并行数据用异步 FIFO(各自读写时钟、格雷码指针跨域、空满标志分域产生),是流式数据和突发的主力;③寄存器式请求/应答用四相握手(req/ack)通道,适合低频控制事务和“读对侧寄存器”。这些结构最好直接用经过验证的参数化 IP/库模块,禁止每个工程师自造(自造 CDC 电路的错误率极高)。岛界模块还要把“跨域延迟不确定”显式化:岛内代码假设对侧几拍后才有响应,用 valid/ready 或 req/ack 事件驱动,而不是固定周期。

暂停时钟、门控与噪声隔离是 GALS 常被寄予的收益,但 FPGA 上要落到可行手段。时钟门控在 FPGA 里一般不让用逻辑与门(会产生毛刺、不走专用时钟资源),正确手段是用原语时钟使能(BUFGCE)让整个区域的寄存器保持而不翻转,或用 MMCM/PLL 动态重配改变频率;空闲岛可以停时钟(配合 FIFO 缓存突发、用握手唤醒),忙岛超频、闲岛降频。电压岛在 FPGA 上基本不可自定义(核电压是整片的),所以“每岛独立电压”更多是 ASIC GALS 的红利,FPGA 侧主要靠频率/门控。噪声隔离则真实可得:把低抖动收发器参考时钟、敏感采样逻辑和高速大翻转岛分到不同时钟域和物理区域,减少电源耦合,是数模混合 FPGA 设计常用技巧。
复位在 GALS 里必须分域处理:每个域有自己本地复位的同步释放,跨域信号在两侧都未退出复位期间不能被当作有效;系统启动要有“所有岛就绪”的汇合。性能建模也要更新:系统吞吐不再是一个全局频率决定,而取决于各岛速率、岛界 FIFO 深度和突发模式;要按稳态吞吐(确保慢岛不堵死快岛)和最坏延迟(跨域次数 × 同步延迟 + 排队)分别核算,FIFO 深度按生产/消费速率差和最大突发计算。把 GALS 当成“用一套明确的边界协议把若干独立收敛的同步模块粘起来”的工程,而不是神秘的异步艺术,它在 FPGA 上才真正可交付、可验证。
七、CDC 全面检查清单:从结构检查到形式验证与复位

CDC(clock domain crossing)问题是 GALS/多时钟设计里最危险的一类:它在仿真里可能从不出现(仿真模型没有真实亚稳态、时间太理想),却在温度/电压/批次变化时以间歇性故障出现,极难复现。因此 CDC 不能靠“仿真过了”,必须靠结构化规则 + 专用工具 + 形式验证的组合系统地防。
单 bit 跨域规则:每个跨域的单 bit 信号必须能被识别为“电平稳定型”(经至少两级同步触发器,且信号在目标域保持足够多个周期)或“脉冲/事件型”(经标准的握手/脉冲同步器,不能直接把窄脉冲打两拍——脉冲可能落在采样间隙丢失)。控制标志(如 valid、req、ack)必须和它对应的数据走一致的同步方案,禁止“数据先到、同步后的 valid 后到/早到”的时序巧合。多 bit 跨域规则:绝不能把多位总线每位打两拍(各位独立同步会撕毁数据),只能走三条合法路径——异步 FIFO、req/ack 握手(数据在握手期间保持稳定,目标域锁存后回 ack)、格雷码计数器(每次只变一位,可安全多级同步)。常见违规还包括:跨域信号进入组合逻辑后再被采样(产生更糟的毛刺窗口)、一个信号同步后扇出到多处且时序不同、用同步后的信号直接做时钟/复位(绝不行)。
结构(lint)检查是第一道网,应在编译流程里强制跑专用 CDC 工具(厂商工具或第三方 Spyglass 类),它不需要激励就能扫描网表,报出未同步的跨域、多位总线裸跨、同步器数量/级数不足、跨域复位、重汇聚与扇出问题。关键是消除告警而不是压制告警:每条 CDC 路径要么符合标准模式被工具识别(给同步器加库标记/属性,让工具知道这是有意为之),要么被判定为真 bug 修复;大量 waiver(豁免)必须逐条评审、记录原因,不能图省事整类屏蔽。结构检查应进入 CI(见 专家 46),每次提交都跑,CDC 违规作为硬红线。
形式验证补上结构检查看不出的协议正确性。“接了同步器”不代表协议正确:握手可能死锁、ack 可能漏、数据保持时间可能不足、FIFO 指针逻辑在所有相对相位下可能出错。CDC 形式工具用数学方法穷举两个时钟的所有相对相位和亚稳态注入位置,证明跨域协议在任意相位下最终收敛且不丢数/不重数;异步 FIFO 的格雷码指针、空满逻辑尤其值得形式证明。断言(SVA)也应覆盖跨域协议:req 后数据稳定直到 ack、FIFO 永不溢出/下溢、同步序列上无组合毛刺。把“结构 lint + 形式证明 + 仿真随机相位”三层叠起来,CDC 才能接近可信——单靠任何一层都不够。
复位(reset)CDC 是高发盲区。异步复位必须异步断言、同步解断言:每个时钟域内用复位同步器(本地时钟打两拍后释放),保证释放沿不违反恢复/移除时间;不同域的复位释放时刻天然不同,跨域通信要等双方都退出复位后才使能(用各域 ready 汇合)。跨域的复位信号本身也要按域同步,不能一个全局异步复位直接连所有域然后期待同时释放。低功耗/时钟停止场景还要处理“对端时钟停了时 req 永远等不到 ack”,需要超时或时钟启停握手。
物理与收敛层面:同步器第一级必须用器件原语库中的专用触发器(厂商通常有标注为同步器的单元,工具对其放宽亚稳态相关检查且做匹配放置),两级触发器要放近、之间不加逻辑;MTBF 要用真实时钟频率、数据跳变率和器件参数估算,频率极高或要求极高可靠时增加级数;跨域信号不要在中途经过组合逻辑。最后保留一份时钟域图和 CDC 清单(哪些信号、什么类型、经什么结构、waiver 理由),作为评审文档。CDC 纪律的本质是:承认亚稳态不可消灭、只能隔离,用穷尽的结构规则和证明保证它永远不会传播成功能性错误。
八、真异步边界:握手以外的接口、亚稳态 MTBF 与数模混合
大部分 FPGA 工程里的“异步问题”其实是多时钟域问题,可以用 FIFO/同步器规范解决;但有少数边界是真正没有共同时间基准的异步接口,需要回到更底层的物理和时序概率来理解和处理。
亚稳态与 MTBF 的定量观。当一个触发器在建立/保持窗口内采样正在变化的输入,输出会进入亚稳态,需要一段分辨时间(resolution time)才能随机落到 0 或 1。两级同步器的原理不是“消除”亚稳态,而是给第一级一个完整时钟周期去分辨,第二级再采样一个(以高概率)已稳定的值。MTBF(平均故障间隔时间)有经典模型,与时钟频率、数据变化率、触发器分辨时间常数有关:频率越高、数据越活跃,MTBF 越短。工程含义是:两级不是信仰,在高速/高可靠场景要按器件手册参数实算 MTBF,不够就加第三级、降频或用专用同步器原语;同步器输入端的数据变化率也要评估(一个持续翻转的使能比偶尔变的状态位风险高得多)。理解概率性,才能解释为什么 CDC bug 表现为“几个月一次的神秘故障”而不是稳定错误。
真正的异步输入接口包括:来自按钮/开关等完全异步外部世界的信号(要做同步 + 消抖,且同步后按电平而非沿使用,避免漏脉冲)、没有相位关系的外部数据总线(老式异步 SRAM/外设,要用控制器按其数据手册建立读写窗口、把读入数据在安全窗口锁存)、以及跨板/跨芯片但不共用恢复时钟的信号(最稳妥仍是先进入带时钟恢复的 SerDes,或用异步 FIFO + 握手)。对这类接口,原则是尽量在物理层把异步变同步:能用握手确认就不盲采样,能用带恢复时钟的串行链路就不用裸露并行线,能把慢输入先电平化/锁存再同步就不直接喂核心逻辑。
数模混合边界是 FPGA 上另一类“真异步/模拟”问题。当 FPGA 驱动 ADC/DAC、PLL/VCO、比较器、电源管理或精密时序电路时,数字侧的同步逻辑管不到模拟世界:采样时钟抖动直接变成 SNR 损失,数字大岛的电源噪声耦合进参考电压,异步比较器输出要经同步器且要防振荡(施密特/滤波)。这里的工程纪律是:给敏感模拟通道独立的低抖动时钟和物理分区、数字翻转大岛远离、用同步器隔离比较器等可能亚稳的输入、必要时在数字与模拟之间加“我已稳定/可以采样”的握手。GALS 的物理隔离思想在此有用,但根本问题是模拟的,需要与硬件团队联合设计。
启停时钟、单比特事件的少量残留:即使整体同步,系统里仍可能有需要停/启时钟的低功耗逻辑(启停必须用时钟控制器原语、保证无毛刺,并在停时让跨域握手有超时)、需要从异步事件产生单周期脉冲的电路(用边沿检测 + 握手,不能组合产生脉冲直接跨域)。这些“少量真异步边界”应当在设计中被显式枚举和隔离:一张表列出所有非同步来源、各自的同步/握手方案、MTBF 假设,评审时逐项确认。把异步边界限制在少数几个、经过证明的适配器模块内,核心设计保持纯同步,是 FPGA 上最可靠的总体策略——你无法让整个芯片异步,但可以把异步关进笼子。
九、异步理论速览与工程边界判断
无时钟(quasi-delay-insensitive、micropipeline 等)异步设计有完整的学术体系和少量成功商用案例(某些低功耗微控制器、网络芯片),理解其核心概念有助于判断“什么时候该认真考虑、什么时候坚决别碰”。
基本思想:不用全局时钟,模块之间靠握手协议(两相/四相 req-ack)显式通知数据有效和已接收;组合逻辑的完成由实际延迟(匹配延迟或完成检测)决定,因此电路天然按实际速度运行、空闲时不翻转(低功耗、无时钟网络功耗)、对工艺/电压/温度变化自适应(快时快、慢时也正确),并且不存在时钟偏斜和大部分 CDC 问题(每个接口本来就是异步安全的)。这些特性在理论上很诱人:潜在的平均性能(不必按最坏路径定频)、更低电磁峰值(电流分散而非时钟沿齐翻转)、天然的模块组合性。
为什么 FPGA 上基本失效:①FPGA 的逻辑单元、布线、触发器是为同步设计高度优化的,握手需要的大量因果链(C-element、完成检测、延迟匹配)映射上去又慢又大,缺乏细粒度时钟控制和标准异步单元库;②工具链不支持——综合、静态时序分析、功耗分析都建立在同步时钟假设上,异步电路的时序依赖(相对时序约束、isochronic fork)无法用常规 SDC 表达和收敛,验证和签核没有成熟流程;③调试极难——没有时钟沿,常规逻辑分析仪/ILA 的采样范式失效,波形是非因果事件序列;④团队知识稀缺、可维护性差,异步代码几乎无法交给普通团队接手。理论优点因此在 FPGA 的硅结构和 EDA 现实面前被工程代价吞没。
工程边界判断。值得引入异步/握手思想的情形(但仍用同步实现):跨时钟域(用异步 FIFO/握手,这是异步理论的安全子集)、低功耗空闲模块(时钟门控/停时钟 + 握手唤醒)、独立 IP 的松耦合集成(消息/流接口本身就是异步安全的)、多速率系统的架构(GALS)。真正值得考虑无时钟电路的,通常是 ASIC 且有明确异步专家团队和定制单元库、目标是极端低功耗/低噪声/抗时钟故障的小众场景。对 FPGA 工程师,正确态度是“知其然以正确使用握手和 GALS,知其所以然而不试图在 FPGA 里造无时钟流水线”。
与异步相关的可靠性概念也值得纳入同步设计:异步设计强调的“完成才推进”思想可以转译成同步设计里的 valid/ready 反压(不假设下游永远就绪);“局部延迟自适应”转译为流水线允许各站不同延迟;握手协议的形式化(无死锁、无孤儿、事件交替)同样适用于你写的 req/ack 跨域通道,应被断言和形式检查。换句话说,异步理论在 FPGA 上的最大价值不是替代时钟,而是提供了一套关于并发、完成和物理延迟的严谨词汇,帮助工程师把 GALS 和 CDC 接口设计得更正确。
十、典型坑与异步/CDC 评审清单
汇总多时钟与异步相关的高频失败模式及评审关口。
裸跨多位总线:各位独立打两拍导致数据撕毁。正解:异步 FIFO / 握手保持 / 格雷码,三选一,无例外。
窄脉冲直接同步:快域脉冲在慢域采样间隙丢失。正解:脉冲转电平 + 握手或标准脉冲同步器,保证最小宽度。
同步后当时钟/组合再跨域:用同步信号做门控时钟产生毛刺,或同步后经组合逻辑再被采样扩大亚稳窗口。正解:只走专用时钟控制原语;跨域信号直接进触发器,中间无组合。
复位不同步释放:全局异步复位同时撤,违反恢复时间,部分触发器亚稳且不同域不一致。正解:每域异步断言同步释放,ready 汇合后再通信。
FIFO 指针/空满错误:格雷码没用对(一次变多位)、空满跨域比较相位错、深度按平均不按最坏突发。正解:用验证过的异步 FIFO IP,形式证明指针逻辑,深度按速率差 + 最大突发 + 频差漂移计算。
停时钟握手死等:对端时钟停了 req 无 ack,系统挂死。正解:时钟启停握手 + 超时 + 唤醒序列。
只靠仿真、无 CDC 流程:仿真从不报错,上板间歇故障。正解:结构 CDC lint 进 CI 清零告警、关键协议形式验证、随机相位仿真、实算 MTBF。
岛界划错:宽总线/逐周期握手跨岛,FIFO 堆成山仍时序/性能差。正解:按交互频率图划界,紧耦合宽接口留同岛,松耦合消息接口跨岛。
异步/CDC 评审清单:①有完整时钟域图,每个时钟源、频率、门控/停钟明确;②所有跨域信号列入清单,类型(电平/脉冲/总线/流)与同步结构一一对应,无遗漏;③无多位裸跨、无窄脉冲直跨、无同步信号当时钟;④全部同步器用库原语、级数满足 MTBF 计算、就近放置;⑤异步 FIFO 经形式证明、深度有推导、永不溢出/下溢有断言;⑥复位分域同步释放、跨域在 ready 汇合后使能;⑦CDC lint 零未豁免告警,waiver 逐条有记录;⑧握手协议经形式验证无死锁/丢事件;⑨真异步外部/模拟输入有显式同步/隔离方案并在时钟域图登记;⑩停钟/降频/唤醒/超时路径有测试。把这份清单作为每次评审和签核的固定动作,把异步风险关进少数经过证明的模块里。
十一、多时钟系统的时序收敛:当 STA 遇上异步

CDC 结构正确只解决“亚稳态不传播”,多时钟设计还要过静态时序分析这一关——工具默认会检查所有时钟域之间的路径,若不告诉它哪些是异步关系,它要么报出海量无法收敛的跨域违例,要么在错误的地方插入优化。正确地在约束文件中表达时钟关系,是 GALS/CDC 设计能被正常签核的前提(签核总流程见 专家 40)。
第一步是完整、真实地声明时钟:主时钟定义在输入端口/收发器输出,PLL 生成时钟用约束自动派生,分频、相位关系如实描述。工具据此建立时钟关系图。第二步是明确划定时钟组:两个真正异步、无固定相位关系的时钟(如两个独立晶振域、收发器恢复时钟与系统时钟)之间用异步时钟组约束声明互不检查——注意这只是告诉 STA “这条路径的时序由同步器协议保证”,它不替代、也不免除物理上的两级同步器或异步 FIFO,二者缺一不可。同一个 PLL 派生的时钟之间通常是同步或有已知频率比的,不能图省事全划成异步,否则真违例被掩盖。
例外路径要最小化、可审计:异步 FIFO 的格雷码指针跨域、同步器第一级到第二级等是标准例外,最好让工具通过库属性自动识别(同步器原语带标记),而不是手写宽泛的伪路径把整块逻辑都切掉。跨域的复位释放路径、收发器与用户逻辑之间的专用接口也按各自手册约束。每一条例外都要在 CDC 报告里对应到具体结构,形成“结构检查 + STA 例外”互相印证的闭环。

多周期与频率相关路径:当两个相关时钟是整数倍频/分频关系且逻辑按慢时钟设计时,正确做法是用多周期约束放宽采样要求,而不是粗暴设伪路径——多周期保留了单向时序检查,仍然能抓真错误。跨时序相关但相位未锁定的时钟(如动态重配 PLL 过程中)应在逻辑上保证重配期间不进行数据交换(停流量、复位下游),重配锁定后再恢复。
收敛策略:先让每个时钟域独立收敛(这是主要工作量,且与单时钟设计无异),再单独审查全部跨域例外的必要性,最后在多种模式(调试插桩、PR 分区组合、低功耗停钟)下重复上述分析。报告上要确认:每个域内 WNS/WHS 为正、跨域路径要么被正确的同步结构覆盖要么有最小延迟约束保护复位释放、没有“未约束”的内部路径。把 CDC 结构检查和 STA 当成两道独立的门——结构证明“协议对”,时序证明“同步器和域内逻辑在物理上够快”——任何一道单独过关都不足以让多时钟系统安全交付。
收尾:异步能力的正确心态。对绝大多数 FPGA 工程师,真正要练的不是设计无时钟电路,而是三样扎实功夫:规范的 CDC(标准同步器/异步 FIFO/握手,结构检查加形式验证)、合理的 GALS 划岛(让时钟边界落在松耦合接口上)、以及对亚稳态概率和复位时序的量化理解。把这三样做扎实,多时钟、多板卡、多供应商 IP 的复杂系统都能稳稳落地;反过来,轻视它们、凭“好像没问题”直连信号,是间歇性、难复现、最难追责那类故障的最大来源。异步理论留给专门领域,但它强调的“完成才推进、跨域必握手、物理延迟不可假设”,应成为每个 FPGA 设计者的本能。
总结
FPGA 上把"异步"限定在 CDC 边界和 GALS 时钟岛:岛间握手、岛内同步,空闲用时钟使能/降频拿到异步电路承诺的功耗收益;真正的无时钟自定时设计因延迟不可控、无专用单元、工具链缺失,在商用 FPGA 上应主动回避。