
几十年来,全局时钟一直是数字计算的总指挥,确保每个组件都完美同步地运行。然而,这种僵化的自上而下的控制已成为一个巨大的制约因素,导致了现代芯片巨大的功耗和对物理变化的脆弱性。本文探讨了一种颠覆性的替代方案:自定时设计,这是一种计算并非由通用计时器驱动,而是由数据流本身驱动的范式。通过放弃全局时钟,我们可以构建更鲁棒、更节能、适应性更强的系统,从而填补工程师在面对同步设计局限性时的一个关键知识空白。
本文主要分为两部分展开。首先,在“原理与机制”部分,我们将解构同步模型,并介绍异步通信的核心概念,例如握手协议、自定时编码以及定义电路鲁棒性的延迟模型层次结构。我们还将直面该范式带来的独特挑战,包括冒险和亚稳态这一物理现象。之后,“应用与跨学科联系”部分将展示这些原理在现实世界中的应用。我们将看到自定时逻辑如何被用于构建从高效的混合架构、受大脑启发的计算机到更安全的密码学硬件等各种系统,揭示这一优雅设计哲学的深远影响。
要理解自定时设计的世界,我们必须首先愿意质疑现代计算中最基本的概念之一:全局时钟。几十年来,时钟一直是数字乐团的总指挥,一个无情的节拍器,确保每个晶体管、每个门电路和每个存储单元都步调一致。在每个时钟节拍,一波计算席卷整个芯片。这种同步方法可预测、易于理解,并有无数设计工具的支持。但如果这种僵化的秩序并非必需,而是一种束缚呢?如果我们能构建一个更像小型爵士乐队的系统,乐手们在本地协调,对彼此的提示做出反应,只在需要时才演奏,而不是一个庞大的管弦乐团,那又会怎样?
这就是异步设计或自定时设计的承诺:构建计算并非由全局时间基准驱动,而是由数据流本身驱动的系统。指令不再是“在下一个节拍执行此操作”,而是“当必要数据准备好时执行此操作”。这一视角的简单转变开启了一个充满可能性的新世界,但它也迫使我们回答一系列引人入胜且根本性的问题。
如果我们扔掉全局时钟,电路的不同部分如何相互通信?一个生产者模块(比如 )如何告知消费者模块 新数据已可用? 又如何告知 它已收到数据,以便 可以自由地准备下一份数据?它们通过一种称为握手的本地对话来完成。
最简单和最常见的形式是请求-应答协议。想象一下连接 和 的两根线:一根请求线()和一根应答线()。为了发送一份数据,生产者首先将数据放在数据线上,然后升高 线上的电压(一个“请求”事件,我们称之为 )。消费者看到这个请求后,锁存数据,然后升高 线上的电压()。生产者看到应答,知道数据已被接收,于是可以降低其请求线()。最后,消费者看到请求消失,便降低其应答线(),完成这个周期,为下一次传输做好准备。
这一系列事件——, , , ——构成一个完整的、自包含的事务。请注意其中缺少了什么:任何对全局时钟的引用。时序完全由两个通信方之间信号的传播决定。每个事件都在因果上促成下一个事件的发生。 必须在 之前发生,而 又必须在 之前发生,依此类推。这条“先于发生”的关系链(表示为 )构成了系统中所有事件的一个偏序。与同步系统中时钟对所有状态变化施加*全序*不同,异步系统是由这些局部的、因果链组成的网络。芯片中不同部分的不具因果关联的事件可以并发地、以任何顺序发生,而不会影响正确性。正确性仅依赖于维护这些局部的因果联系,这正是全局时钟变得不必要的原因。
握手优雅地解决了通信时序的问题。但它隐藏了一个更深、更微妙的问题。当消费者 看到请求信号 时,它如何知道伴随数据线上的数据实际上是有效且稳定的?如果数据的某些比特比其他比特晚到,或者比请求信号本身晚到,该怎么办?确保仅在数据有效时才捕获数据,是异步设计的核心挑战,为此已发展出两种主要哲学。
第一种方法,称为捆绑数据(bundled-data)设计,是同步世界更务实、更直接的转换。其思想是将数据线与请求信号“捆绑”在一起,并强制执行一个时序契约。设计者计算数据通过逻辑电路到达消费者输入端并变得稳定的最坏情况延迟。然后,他们在请求信号的路径中插入一个匹配的延迟元件,该元件被保证比那个最坏情况的数据延迟更长。
这个契约很简单:“当您收到我的请求信号时,我保证数据已经到达并稳定下来了。”消费者不需要检查数据的有效性;它只相信请求信号的时序。这种方法有效,但很脆弱。它并非真正的“自定时”;而是“带有精心设计的猜测的自定时”。其正确性取决于一个时序不等式:。
对时序裕量的依赖是捆绑数据风格的阿喀琉斯之踵。在真实的硅片世界里,门和线的延迟不是固定常数。它们会随着制造工艺(Process)、供电电压(Voltage)和工作温度(Temperature)(PVT)的微小波动而显著变化。一个在标称仿真中完美工作的设计,在真实芯片上可能会因为运行过热、电压稍低,或者仅仅是来自硅晶圆上一个稍有不同的区域而失败。想象一个场景,由于PVT变化,数据路径的减速超出了预期,而匹配延迟路径却加速了。请求信号可能会在数据稳定之前到达,导致消费者锁存损坏的信息。这种失败并非理论上的奇谈;它是一个非常现实的冒险,需要仔细且通常是悲观的设计裕量 [@problem_d:4035917]。
第二种哲学更激进,在许多方面也更优雅。与其依赖一个独立的、定时的信号来为数据担保,不如让数据能够宣告自己的有效性?这就是自定时设计的核心思想,尤其是在其最鲁棒的形式中,如准延迟不敏感(QDI)设计。为了实现这一点,我们必须改变信息的编码方式。
传统的每比特单线编码是不够的。导线上的'0'(低电压)与尚未有信号到达的导线无法区分。我们需要一个与任何有效数据状态都不同的“空”或“间隔”状态。
实现这一点最简单的方法是使用双轨编码(dual-rail encoding)。我们用两根线来表示一个比特,而不是一根,称它们为d.0和d.1。
d.0(例如,d.0=1, d.1=0)。d.1(例如,d.0=0, d.1=1)。d.0=0, d.1=0)。这就是间隔状态。现在,数据的到达是明确无误的。等待一个比特的消费者,当看到两根线中恰好有一根被置位时,就知道数据已经到达。数据本身就携带了时序信息!这个原理可以推广到n中取m编码(m-of-n codes),其中一个有效符号通过置位根线中的根来编码。
这是一个深刻的转变。系统不再需要猜测。它可以构建逻辑来检测完成。对于一个用双轨编码的多比特字,接收器可以检查每一对导线。每对导线的或运算(d.0 OR d.1)告诉我们该特定比特是否已到达。要知道整个字何时到达,我们需要一种特殊的逻辑元件,它只在所有输入都到达时才产生输出。这个神奇的组件就是Muller C元件。
一个输入为和,输出为的C元件有一个简单的规则:如果和相同,就变为那个值。如果和不同,则保持其先前的状态。它是一个保持状态的共识门。通过将这些C元件排列成树状结构,我们可以为整个数据字构建一个完成检测器,该检测器只在每个比特都从间隔状态转换到有效数据状态时才会触发。令人惊奇的是,这个异步逻辑的基本构建块本身可以由几个简单的与非门构成。
通过使用这些自定时编码和完成检测逻辑,我们创建的电路的正确性不再依赖于任何延迟假设。只要延迟是有限的,无论它们的门和线有多慢或多快,它们都能正确工作。这个特性是真正的自定时设计或延迟不敏感设计的标志。
捆绑数据和自定时哲学之间的差异催生了一个异步设计模型的层级结构,每个模型都由其对组件时序的“信任”程度来定义。
有界延迟(Bounded-Delay): 这是最弱的模型,用于捆绑数据设计。它假设所有门和线的延迟都是未知的,但位于某个已知的上下界之内。正确性依赖于这些界限。
速率无关(Speed-Independent, SI): 这个模型更鲁棒。它假设门的延迟是任意且未知的,但做出了一个物理上不切实际的假设,即线的延迟为零。这是一个有用的理论模型,但对于线延迟显著的真实芯片来说不切实际。
延迟不敏感(Delay-Insensitive, DI): 这是能想象到的最鲁棒的模型。它假设所有门和所有线的延迟都是任意且未知的。一个DI电路堪称艺术品,但其约束条件如此严格,以至于几乎不可能构建任何非平凡的系统(例如,一个信号驱动两个门的简单扇出都会有问题)。
准延迟不敏感(Quasi-Delay-Insensitive, QDI): 这是实践中的最佳选择。它始于DI模型(任意的门和线延迟),但允许一个小小的、被仔细控制的“作弊”:等时分叉假设(isochronic fork assumption)。这个假设指出,在一个导线分叉到多个目的地的地方,为了电路的正确性,我们可以假设信号“大致在同一时间”到达那些目的地。对于精心布局并保持较短的导线来说,这是一个合理的物理假设。对纯DI模型的这唯一、最小的放宽,恰好使得设计大型、复杂且高度鲁棒的系统成为可能。
这个无时钟设计的新世界并非没有它自己的小魔怪。当信号可以沿着具有不同延迟的路径竞争时,奇怪的事情就可能发生。
其中一个问题是冒险(hazards)。这些是组合逻辑中由延迟差异引起的无用毛刺。例如,简单的布尔函数 在 和 时应始终为'1',无论 如何变化。然而,如果用标准门电路实现, 上的一个转换会通过两条不同的路径传播(一条直接,一条通过反相器)。如果一条路径比另一条快,可能会有一个短暂的瞬间, 和 两项都为'0',导致输出 瞬间跌至'0'然后又回到'1'。这是一个静态冒险。异步逻辑对这类毛刺高度敏感,但幸运的是,它们通常可以通过在电路中添加冗余逻辑项(如此例中的“共识项” )来消除。
一个更根本、更诡异的现象是亚稳态(metastability)。冒险是组合逻辑中的缺陷,竞争是时序状态机设计中的问题。亚稳态是任何双稳态元件的物理属性——任何需要做出决定的电路,比如一个仲裁器决定先批准两个竞争请求中的哪一个。想象一个完美平衡在尖峰顶端的球。理论上,它可以永远待在那里。实际上,任何微小的振动都会导致它滚入两个稳定山谷中的一个。亚稳态就是那个摇摇欲坠的球的数字等价物。如果两个异步请求几乎同时到达一个仲裁器,仲裁器可能会停留在一个中间的、未决定的状态,持续一段未知且理论上无限长的时间,然后最终才解析为一个稳定的'0'或'1'。
与冒险不同,亚稳态不能通过巧妙的逻辑设计来“修复”。它是物理学的一个基本结果。我们只能减轻其影响,将仲裁器设计得非常快,以使长时亚稳态事件发生的概率低到天文数字。这是数字逻辑的干净、确定性世界必须面对模拟世界混乱、概率性本质的唯一地方 [@problem_D:4035952]。
在经历了自定时设计的原理、挑战和优雅解决方案的旅程之后,我们必须问:这值得吗?答案是肯定的,回报主要体现在两个方面。
首先是鲁棒性。通过将正确性与时序解耦,尤其是在QDI风格中,我们创造了对困扰现代芯片设计的PVT变化具有天然适应能力的电路。自定时电路能适应其环境。如果它运行过热,门电路变慢,电路只是运行得慢一些,但仍能继续正确工作。相比之下,一个捆绑数据电路则可能完全失效。这种固有的鲁棒性是构建在先进、不可预测的硅技术中可靠系统的巨大优势。
其次,也许更引人注目的是能源效率。同步电路的时钟总是在跳动,驱动着遍布芯片的巨大导线网络,在每一个周期都消耗着电力,无论是否有用的工作在进行。这就像整夜让一栋摩天大楼里每个房间的灯都亮着。而自定时电路则基于“按需工作”的原则运行。它的组件处于静默状态,只消耗极小的泄漏功率,直到一个事件到达。活动会像涟漪一样通过处理该事件所需的部分电路,然后它们又恢复沉寂。在具有突发性或稀疏数据的应用中——比如神经形态、受大脑启发的计算机中的事件驱动处理——功耗节省可能是巨大的。定量分析表明,移除耗电的全局时钟可以在低活动度情况下将总功耗降低一个数量级,这对于移动和能源受限设备来说是一个改变游戏规则的优势。
通过放弃全局时钟,自定时设计用一个更复杂、并发且最终更自然的计算模型,换掉了同步逻辑简单但僵化的世界——这个模型更鲁棒、更高效,也许还更接近自然界本身的计算方式。
在走过自定时设计的基本原理之旅后,我们现在离开抽象规则的纯净世界,进入繁华的应用图景。当这些关于本地握手和事件驱动行为的思想付诸实践时,会发生什么?我们发现,它们不仅仅是熟悉的时钟同步机制的替代品,更是一种强大的范式,能够解锁新功能,解决顽固问题,甚至与人脑的运作方式找到意想不到的共鸣。我们即将看到,放弃全局时钟的滴答节奏,如何让我们构建出更高效、更鲁棒,在某些情况下也更安全的电路。
让我们从最小的尺度开始:计算的基本构件。在同步世界里,一个加法器电路执行其计算,当下一个时钟节拍到来时,我们简单地假设答案已经准备好了。但如果加法器能告诉我们它何时完成呢?
这正是自定时逻辑所能实现的。使用一种称为双轨编码的技术,我们可以重新设计一个像超前进位加法器这样的标准组件,使其具有“自我感知”能力。我们不用一根线来表示一个比特,而是用两根:一根用来声明“这个比特是1”,另一根用来声明“这个比特是0”。第三种状态,即两根线都静默,优雅地表示“我仍在计算中”。这个电路直到内部确认计算已完成后才会产生答案,届时它会自豪地置位两个输出轨中的一个。这种内置的完成检测是源于其设计哲学的一种基本属性。
但是,当电路的不同部分想同时访问一个共享资源,比如总线时,会发生什么?这会产生竞争。在无时钟的世界里,我们不能依靠时钟周期来分隔竞争者。相反,我们必须构建一个仲裁器,一个充当公平裁判的电路。在这里,我们遇到了数字物理学中最迷人的现象之一:亚稳态。当两个请求几乎在同一瞬间到达仲裁器时,电路可能会暂停,像一枚硬币在落地前竖立在边缘上一样,平衡在刀刃上。在一个短暂的、理论上无限的时刻,它的输出既不是对一个请求明确的“是”,也不是对另一个请求明确的“否”。
同步设计师一想到这个就发怵,因为它会造成严重破坏。但异步设计师却直面它。通过构建带有互斥(MUTEX)元件的鲁棒仲裁器,亚稳态被控制在一定范围内。仲裁器被允许有其犹豫不决的时刻,但它的输出会保持稳定,直到一个明确的胜者被选出。系统的其余部分只看到干净、最终的决定。这是通过巧妙设计来驾驭基本物理限制的一个绝佳例子,创造出即使在物理世界固有的不确定性下也能正确运作的电路。
扩展到更大规模,我们可以将这些自我感知的模块连接成流水线以执行复杂任务。在同步流水线中,数据以僵硬的步调移动,只有当全局时钟命令时才从一个阶段前进到下一个阶段。而异步流水线的行为更像一种流体。
想象数据是流经一系列管道的“令牌”。在任何时刻 ,一个流水线阶段内的令牌数量 ,就是已进入的令牌总数 减去已退出的总数 。这个简单的守恒定律 支配着整个系统。每个阶段都有有限的容量,并利用本地握手信号来管理流量。如果一个阶段变满了,它就停止对前一个阶段的新数据进行应答。这种“背压”会自然地向上游传播,无需任何中央指挥官就能暂停流动。
这催生了“弹性缓冲”的概念。数据令牌可以在流水线的一部分区域聚集,在另一部分区域散开,从而使系统能够优雅地吸收不同阶段处理速度的变化。流水线就像一个灵活、有弹性的通道,而不是一个僵硬、分段的传送带。这种局部的、自适应的流量控制是自定时系统最强大的特性之一,它能在没有全局时钟的开销和僵化的情况下实现高吞吐量。
尽管一个完全异步的世界很诱人,但同步电路的设计工具和方法论已经成熟并被广泛使用。这催生了一种强大而实用的混合方法:全局异步、局部同步(GALS)架构。
在GALS系统中,一个大芯片被划分为多个较小的、独立的“岛屿”。在每个岛屿内部,一切如常——一个本地时钟管理着同步逻辑。然而,没有一个全局时钟来同步整个芯片。岛屿之间的通信则使用我们讨论过的异步握手协议来处理。这就像一个由独立城邦组成的世界,每个城邦都在自己的本地时间上运行,但通过一个鲁棒的、与时间无关的邮政服务进行通信。
这不仅仅是一个优雅的妥协;它也是对抗现代芯片设计中一个重大挑战——“暗硅”问题的关键策略。随着晶体管的缩小,我们已经到了这样一个地步:我们可以在芯片上集成比我们能同时供电的更多的晶体管,这是由于热量限制。这部分功耗的很大一部分被全局时钟网络消耗,这是一个巨大的导线树,必须以千兆赫兹的频率在整个芯片上翻转。该网络的动态功耗由物理定律 决定,对于时钟来说,活动因子 总是很高的。
通过消除全局时钟,GALS架构极大地减少了这部分功耗开销。节省下来的电力可以用来“点亮”更多的硅计算岛,将功耗节省直接转化为性能增益。这种方法使架构师能够构建大规模多核系统,否则这些系统会受到其功耗预算的限制,从而使自定时原理成为未来高性能计算的关键推动者。
自定时设计的原理在神经形态计算或称受大脑启发的计算领域中找到了最自然的归宿。大脑是终极的异步处理器。你的头脑里没有中央时钟;神经元在有信息要传达时,会以离散、稀疏的事件——尖峰——的形式发放。计算是事件驱动的。
神经形态工程师们接受了这一点,创造了地址-事件表示法(AER)。在这种方案中,信息不是由特定时钟节拍下导线的电压水平来表示,而是由异步事件的发生本身来表示。当一个合成神经元“发放”时,它通过一个共享总线发送一个包含其唯一“地址”的数字包。通信是在一个原本安静的网络上的一阵活动爆发,由异步的请求和应答握手来管理。
这种事件驱动的方法效率极高。如果没有神经元发放尖峰,通信网络消耗的功率非常小。这与时钟同步系统形成鲜明对比,后者必须持续轮询每个神经元以查看其是否已发放。这一原理是像英特尔的Loihi研究芯片和曼彻斯特大学的SpiNNaker机器这样的大规模神经形态系统的核心。这些架构使用异步的、自定时的片上网络在其局部时钟同步的处理核心之间穿梭传递尖峰包。这种类似GALS的结构使它们能够以非凡的能源效率模拟大规模神经网络,让我们离模拟大脑卓越的计算能力又近了一步。
我们最后一个应用或许是最令人惊讶的。在硬件安全领域,攻击者有时不是通过破解芯片的代码,而是通过观察其物理副作用来窃取秘密。一种“时序攻击”会测量一个密码学操作需要多长时间。如果计算时间稍微依赖于所使用的密钥,那么这个微小的变化 就可以被测量出来,并用于反向工程出密钥。
在传统的同步电路中,依赖于数据的延迟部分可能很小,但在稳定时钟的低噪声背景下可能被检测到。信息泄漏是这个信噪比的函数。
在这里,异步时序看似“混乱”的特性成了一个强大的特点。一个设计良好的异步电路,例如使用准延迟不敏感(QDI)逻辑的电路,其握手周期和完成检测逻辑会带来固有的时序变化。这为总计算时间增加了大量的随机噪声 。这种随机性起到了天然伪装的作用。它提高了噪声基底,使攻击者更难找出那个微小的、依赖于密钥的信号 。通过增大了关键比率 的分母,电路有效地掩盖了自己的旁道泄漏。原本可能被认为是缺陷的——时序抖动——被转化为一个特性:一个抵御窥探目光的内置烟幕。
从逻辑的基础到超级计算机的架构,从大脑的效率到密码学的猫鼠游戏,自定时设计提供了一套丰富而强大的工具。它告诉我们,通过放弃时钟的全局控制,拥抱一个由局部因果关系支配的世界,我们可以创造出不仅与众不同,而且在许多重要方面更优越的系统。