FPGA跨时钟域信号同步设计方法研究
2018-09-07,
,
(1.工业和信息化部电子第五研究所,广州 510610;2.重庆赛宝工业技术研究院)
引 言
随着电子自动化设计(EDA)技术的发展,现场可编程门阵列(FPGA)已经在许多方面得到广泛应用[1],比如将FPGA应用于通信领域,实现数字调制解调、编码解码,FPGA还在实现通信系统中的各种接口中起着重要作用,如PCI总线、SPI总线、429总线等。在FPGA接口设计中,同步决定了系统的稳定性与接收数据的准确性。但是在实际的工程中,纯粹单时钟同步系统设计的情况很少,特别是在设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免。跨时钟域信号处理不当就会产生亚稳态、采样数据错误、采样丢失和重聚合错误等一系列问题,从而使系统无法正常运行。本文就此讨论了在FPGA设计中跨时钟域设计中的常见问题,信号及数据同步的常见方法[2],在此基础上说明了进行跨时钟域分析时的方法和步骤。
1 跨时钟域信号常见问题
1.1 亚稳态问题
在FPGA系统中,如果数据传输中触发器的建立时间Tsu和保持时间Th不满足,或者复位过程中复位信号的释放相对于有效时钟沿的恢复时间(recovery time)和撤离时间(removal time)不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态。在这段时间里,Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值,这段时间称为决断时间(resolution time)。经过resolution time之后,Q端将稳定到0或1上,但是稳定到0还是1,是随机的,与输入没有必然的关系[3-5]。亚稳态示意图如图1所示。
图1 亚稳态示意图
图3 多信号聚合问题示意图
亚稳态产生的原因是触发器Tsu和Th时间不满足。对于同时钟域的信号,可以采用时序约束来保证满足Tsu和Th时间的要求,采用静态时序分析工具测试是否满足要求。但对于异步信号,源时钟和目的时钟相位关系完全不可控,而且会随时间发生变化,这就必然会存在亚稳态的问题。亚稳态的危害主要是破坏系统的稳定性、逻辑误判和亚稳态传播。由于输出在稳定前可能有毛刺、振荡、不固定的电压值,因此亚稳态将导致逻辑误判,严重的情况,输出0~1之间的电压值还会使下一级产生亚稳态,即亚稳态的传播。逻辑误判导致功能性错误,而亚稳态传播则扩大了故障面[6]。
1.2 数据丢失
数据丢失现象经常发生在跨时钟域信号进入快时钟域的信号持续时间太短,如果异步信号的长度小于目的时钟周期,作为采集方的慢时钟域有可能采集不到该信号,造成数据丢失。为了安全起见,通常异步信号保持目的时钟域两个时钟周期长度。
1.3 数据聚合错误
图2 单信号重聚合问题示意图
数据聚合是指信号在通过不同路径传输后重新聚合到一起使用。通常有几种情况:
① 单个信号多路扇出。如果信号从一个时钟域分多路进入另外一个时钟域,那么很有可能会导致功能上的错误。如图2所示,由于Td的存在,DA1和DA2到达CLKB的时间不同,最终导致fsm1_en和fsm2_en这两个本应该同时有效的信号实际上相差一个CLKB的周期。这很可能会影响到后继的电路功能。
② 多个信号的重聚合。如果多个信号从一个时钟域进入另外一个时钟域,然后这些信号在目的时钟域中又聚合到一起,那么就有可能因为信号的重新聚合导致电路功能上的异常。如图3所示,原本EN1和EN2转换时钟域后,期望得到的值是0b00和0b11,但由于EN1和EN2到达CLKB时钟域的时间有差异,实际得到的值是0b00、0b10和0b11,最终导致后继电路功能出现问题。
2 跨时钟域信号同步方案
2.1 信号同步
2.1.1 单个信号
单个信号跨时钟域同步常用电路是两拍同步,见图4。
图4 两拍DFF信号同步电路
理论上,采用这种方法可以有效地减少亚稳态继续传播的概率,但是并不能保证第2级输出的稳态电平就是正确电平。两拍同步是大部分同步处理措施的基础,如下面介绍到多位相关信号处理是对多个信号之间相互关系进行分析后,采用合并、抽取特征信号、增加指示信号等形式变为一个信号或逻辑独立再进行两拍同步。同样,数据同步的基础也是两拍同步,如握手协议的请求和应答信号、异步FIFO的地址信号。
2.1.2 多位相关信号
当跨时钟域传输多个相互关联信号时,不能采样简单的两拍同步,因为数据传输时多位数据之间的传输延迟不同,有可能造成多位数据在目的时钟域不同周期被采样,这种多位数据传输时由于数据之间的skew所引起的不能被目的时钟在同一个周期采样的现象,称为多位数据的跨时钟域问题。为简便起见,以两个信号为例。
(1)传输两个需要同时有效的信号
目的时钟需要源时钟的两个同时有效的控制信号,这两个控制信号来自于同一个源时钟,有可能会出现时钟之间的偏移,从而导致两个控制信号在目的时钟域的不同周期被采样,在此情形下两个本应该同时起控制作用的信号在目的时钟域失去了作用。
此种问题产生的原因是,两个来自于同一个时钟的需同时有效的控制信号在目的时钟发生作用时产生了多位信号传输。在逻辑设计中,通常可将这两个信号在源时钟中整合为一个信号,然后通过同步逻辑传送到目的时钟,从而消除多位信号的跨时钟传输问题[7]。
(2)传递两个顺序控制的信号
此种问题产生的原因是,两个来自于同一个时钟的有顺序关系的控制信号在目的时钟发生作用时产生了多位信号传输。在逻辑设计中,可以对前序逻辑进行分析,观察是否在一个信号有效后,其他信号一定会达到有效状态,这时可将该信号作为特征信号而仅传输该信号,那么经过同步逻辑传送到目的时钟,从而消除多位信号的跨时钟传输问题。
(3)传递两个编码控制信号
当具有编码关系的多位数据在不同的时钟之间进行传递时,不同编码信号之间具有skew导致目的时钟采样数据的不一致性,从而导致解码的错误。
考虑到目的时钟在接收多位信号时,无非是个别的信号在接收时晚一个时钟周期或者多位信号撤销时晚撤销一个时钟周期。所以可以得出以下解决方案:传输数据时增加一位ready_flag的寄存器。源时钟必须在产生需传输的多位数据一个周期之后产生该read_flag信号,同时在需要传输的多位信号撤销之前一个周期撤销ready_flag信号。该read_flag的使能信号需在目的时钟至少保持两个目的时钟周期。
2.2 数据同步
2.2.1 握手协议
根据不同的设计需求和不同的设计标准,利用两到三个握手信号可以实现数据在不同时钟之间的传递,图5给出了握手信号传递数据的机制。采用的握手信号越多,从一个时钟到另外一个时钟所需要的延迟也越多,同时数据传递也越准确。对于许多没有限制的传输,两个握手信号足以使数据在两个时钟之间准确地传递。
图5 握手机制传递数据示意图
与两级同步器相比,异步握手同步器的信号切换过程很慢,需要很多个时钟周期才能完成一组数据的传递,但这种通信方式能够精确传递指定数目的数据。数据信号会有效持续一段时间,可以用于多比特数据的传输,适合于连续处理。当几个电路不能预知相互的响应时间时,握手方法能让数字电路间实现有效的通信。
2.2.2 异步FIFO
当主机端的数据连续放入总线时,握手写方式则可能无法正确进行数据同步,可以采用异步FIFO解决这一问题。异步FIFO的读写可以工作在不同的时钟域内,将需要同步的数据利用写时钟暂存在FIFO内部的一个双口RAM里,然后利用读时钟读取暂存在双口RAM里的数据。FIFO的典型结构图如图6所示,它由FIFO读控制逻辑、FIFO写控制逻辑、空/满状态判断模块和一个双端口RAM四部分组成[8]。空满状态的判断由于存在读写地址跨时钟域的问题,容易产生错误,所以FIFO设计的关键是空满标志的产生,一般会将地址通过Gray码编码后传给对方。
图6 异步FIFO结构框图
3 跨时钟域信号验证方法
由于跨时钟域设计不当会引入较多的问题,除在设计阶段由开发工程师对跨时钟域信号进行同步设计外,在设计完成后应由验证工程师对设计进行跨时钟域的分析。跨时钟域分析可借助工具或由人工将跨时钟域信号提取出来,然后再进行分析和验证,主要包含两个阶段:一是协议检查,二是仿真测试。
3.1 协议检查
在对跨时钟域信号进行协议检查时,应按照逻辑梳理各信号相互之间的关系,按照关系选择是否应该进行同步化处理,判断同步化处理措施采用的同步协议是否合理。下面给出两拍同步器、握手协议、异步FIFO等同步协议的原理、应用场景和注意事项等[9-10]。
3.1.1 两拍同步
在两拍同步器中,触发器到触发器路径上的时序裕量可以为潜在的亚稳态信号到达设计的其他部分提供一定的判决时间,以便达到稳定的值。在应用两拍同步器时,为了确保跨时钟域信号能够安全传输至目的时钟域,应注意以下几点[11]:
① 跨时钟域信号在源时钟域尽量直接由寄存器驱动,直接输入给同步器的第一级触发器,不经过任何组合逻辑。因为数据传输很重要的一点就是进入接收时钟域的第一级触发器的输入信号不能出现毛刺,而组合逻辑电平不稳定,极易使得同步器采样到不稳定的信号。
② 两拍同步器采样到源时钟域的信号,经过目的时钟两个周期后,才能输出到目的时钟域的逻辑电路中,因此,同步信号传递到新时钟域时存在两个目的时钟周期的延时,这是需要注意的。
③ 两拍同步器常应用于单个异步数据的同步,而在同步多位异步数据时,如果多位异步数据存在同时变化的情况,则应考虑过渡虚假数据的产生。
④ 不能对一个信号在多个地方进行同步,如果进入亚稳态,它们可能输出不同的值,即使输出同一个数值,时间上也会有差别,如此产生的竞争会对后续电路有影响。
3.1.2 握手协议
为了降低系统故障率就需要尽量减少跨时钟域信号数目,使用握手协议可以仅仅对请求信号和应答信号进行同步,使得并行数据有足够的时间满足建立时间和保持时间的要求,所以握手协议能够满足并行数据安全传输的需要。握手协议常应用于解决并行总线信号的同步问题。
3.1.3 异步FIFO
异步FIFO的工作原理是先由写时钟把异步数据存储到RAM,稳定后再由读时钟读取数据,从而抑制亚稳态。总线数据同步、高速数据传输、数据在跨越时钟域时需要存储容量大的缓冲时,则可以采用异步FIFO[12-14]。
需要着重指出的是,在实际设计中,有时设计人员不会对跨时钟域信号进行同步处理。由于目的时钟域对跨时钟域进行捕获时,除可能引起的亚稳态传播外,带来的影响无非是信号早一个时钟出现或者晚一个时钟出现,又或者早一个时钟消失或者晚一个时钟消失,对于很多持续时间比较长的信号,一般不会造成影响。对于亚稳态传播的问题,由于芯片工艺的改进,决断时间越来越短,如果采用同步设计,一般会产生亚稳态传播的问题。这时应该具体分析不进行同步是否会对目的时钟域逻辑产生影响。
3.2 仿真测试
对于复杂的信号关系,仅仅借助静态的协议检查不能确认是否没有问题,这时需要使用时序仿真测试的手段针对跨时钟域信号进行专门的测试,可使用随机测试的形式测试信号再聚合时产生的问题[15]。
结 语
宋文强(工程师),主要从事软件可靠性测试和FPGA验证技术研究。