一种多接口协议弹性缓冲器优化设计方法

2022-01-06 12:33樊仕超贾一平杨海钢
电子设计工程 2021年24期
关键词:数据位缓冲器指针

樊仕超,贾一平,舒 毅,杨海钢

(1.中国科学院空天信息创新研究院,北京 100190;2.中国科学院大学电子电气与通信工程学院,北京 100049;3.山东产业技术研究院山东产研集成电路产业研究院,山东济南 250001)

随着高速串行接口的不断发展,弹性缓冲器逐渐出现在许多接口技术应用中,例如以太网[1-3]、USB[4-7]、PCI-Express[8-9]、SATA[10]、光纤通信(Fiber Communications,FC)[11]、InfiniBand 等接口协议。由于接口协议中的收发两端支持独立参考时钟源,所以其恢复时钟频率与本地时钟频率存在差别[12]。为了保证数据可靠地从一个时钟域传送到另一个时钟域,部分接口协议采用了弹性缓冲器来解决时钟相位同步和频率补偿的问题[13]。

目前对于弹性缓冲器的设计,绝大多数是基于特定协议,采用新型设计方法来实现控制字符集的添加与删减。例如,文献[4]基于USB3.0 协议,采用具有写指针屏蔽与跳跃、断点保存等功能的异步FIFO 来实现弹性缓冲器。文献[5-6]则在文献[4]的基础上,设计出通过读指针暂停实现控制字符集增添和写指针暂停实现控制字符集删减的结构。文献[1-2]基于10Gbase-KR/10Gbase-R 协议,通过控制写指针插入和暂停实现字符集的增删操作。基于PCIE2.0 协议,文献[9]采用半满检查方式和半满同步方法,简化了逻辑结构,相比于其他文献所设计的弹性缓冲器,省去了格雷码转换这一步骤。

文献[4]所设计的弹性缓冲器在添加SKP 字符时,需要读写指针在不同的时钟域进行读写操作,会带来复杂的异步控制电路,可能产生亚稳态、采样丢失等时序错误。为了解决这一问题,文献[1]和文献[9]采用单独控制写指针或读指针的方式来实现缓冲操作。

各个协议对弹性缓冲需求的主要差异在于控制字符集、缓冲深度以及数据位宽。为了提高设计的复用性,文中设置了多组控制字符集检测逻辑,并通过更改参数来实现多种数据位宽和缓冲深度,从而满足多种协议的要求。文中在文献[9]和文献[12]设计方法的基础上,结合可变多路指针以及半满检查的方式,通过控制读指针暂停和跳跃实现缓冲控制,设计了一种能够兼容1000Base-X 千兆以太网、USB3.0 以及PCI-Express2.0 3 种协议的可重复配置弹性缓冲器。经过仿真验证,在对应的协议要求下,多指针弹性缓冲器能够在适当的频率下正确地实现SKP 或IDLE 字符的增添和删减功能。

1 弹性缓冲器原理

1.1 基本原理

弹性缓冲器本质上是一个异步FIFO 器件,常见的实现弹性缓冲器的方式有两种:流程控制方式和常半满方式[1-2]。多数弹性缓冲器采用常半满方式实现。常半满方式通过计算读写地址差值,根据结果判断是否增减SKP 或IDLE 字符,调节弹性缓冲器两边有效读写速率,使弹性缓冲器恒在半满状态。流程控制方式则是当写入数据速率小于读出数据速率时,产生使能信号使读指针停滞,将弹性缓冲器维持在一个底端进入点的状态[1-2]。在常半满实现方式下,读时钟一直处于活跃状态,输出端口持续有信号输出。流程控制则通过门控时钟暂停读指针跳转以及控制读时钟使能并降低功耗,但门控时钟方式将更改后续电路工作模式,不利于DFT 的实现,同时会造成额外的面积消耗。综上,文中采用常半满方式实现弹性缓冲器。

1.2 弹性缓冲器位置

弹性缓冲器通常位于高速接口接收通路中,位于串并转换和物理层编解码器之间,以调整恢复时钟域和本地时钟域之间的微小偏差。弹性缓冲器所在位置如图1 所示。

图1 弹性缓冲器位置图

1.3 控制字符集

控制字符集是为了实现时钟频率补偿而规范的一组特殊有序集,每种协议对控制字符集的定义也各有不同。以PCIE2.0 协议为例,协议规定用于调整时钟相位的特定字符为SKP字符(K28.0),控制字符集由一个COM 字符(K28.5)和3 个SKP 字符组成[14-17]。其他协议的控制字符集信息如表1 所示。

表1 部分协议控制字符集

1.4 深度计算

弹性缓冲器的深度取决于数据的最大位移量,而最大位移量受器件支持的最大数据包大小、字符集发送周期以及总线链路宽度等因素影响[18]。由于各个协议对上述因素以及对时钟允许误差范围的要求千差万别,因此需要对每种协议单独计算数据最大位移量,才能找到适合各个协议的最低缓冲深度。

1)PCIE2.0 协议

PCIE2.0 协议规定总线时钟速率与标准速率最大可以允许300 ppm 的误差范围,两个设备之间最大可以有600 ppm的时钟误差[14-17]。即在大约1 666个时钟周期内就可能会有一个周期的偏差,至少需要在1 666 个周期内发送一个字符集。根据协议要求,SKP 字符集间隔为1 180~1 538 个字符,最大数据包是4 096 个字符,TLP 基本数据量固定为28 个字符。在最差的情况下,即当链路宽度为1 时,根据如下公式:

计算可得数据最大位移量为3.4 个,采用常半满方式实现弹性缓冲时,理论上最小深度为8。在实际应用中,为了避免出现上溢或下溢,弹性缓冲器的深度会被适当加大。在该设计中,只有在数据位宽为10 bit时,深度可以设置为8。

2)USB3.0 协议

USB3.0 协议对时钟管理电路采取扩频技术,扩频后的时间精度为-5 000~0 ppm,同时USB3.0 规范要求的时间精度为+/-300 ppm[19-20]。由上述两点可知,时钟的叠加精度为-5 300~+300 ppm,最大时钟偏差为5 600 ppm,即发送端最多每隔约177 个字符便插入一个SKP 字符,每次间隔354 个时钟周期发送一次字符集。此外,USB3.0 协议规定最长的数据包为1 056 个字符,在最差的情况下,发送一个最长的数据包后需要发送6 个SKP 字符(3 个字符集)。理论上最小深度为12,为了便于弹性缓冲器的实现,设置最小深度为16。

3)1000Base-X 协议

1000Base-X 协议规定时钟允许的误差范围为+/-100 ppm,即最少隔5 000 个周期就会产生一个周期的移位。另外,在长连续随机测试模式中的每个数据包均包含1 536 个字符,由此可以估算出,在该协议下的数据最大位移量小于1,对弹性缓冲深度的需求最低。

为满足不同协议下的最大位移量需求,并评估设计复杂度,文中选择在PCIE2.0 和1000Base-X 协议下,弹性缓冲最小深度为8;在USB3.0 协议下,弹性缓冲最小深度为16。

1.5 可选模式

为了满足PCIE2.0、USB3.0、1000Base-X 3 种协议对弹性缓冲器容量的需求,提出了可变参数的方法来实现数据位宽以及缓冲深度的可配置性。目前支持时钟频率在500 MHz 以内,数据位宽为40 bit 以下的各种模式,其配置信息如表2 所示。此外还可以通过参数选择时钟频率,实现同步配置。

表2 3种协议可选配置信息

2 多指针弹性缓冲器结构

多指针弹性缓冲器由多个读写指针寻址,指针数与当前数据位宽有关。例如,弹性缓冲器深度为16,宽度为11(最高位为数据有效位,低10 位用于存储数据),当前数据位宽为20 bit,写指针个数为2,读指针个数是写指针的两倍。其原理结构如图2 所示。在PCIE2.0 协议中规定,字符集为一个COM 字符,后面跟随3 个连续的SKP 字符。由于需要在检测到COM 字符之后才能进行SKP 字符的增删,所以在检测到COM 字符的下一个周期,才能进行读指针的暂停或跳跃。

图2 多指针弹性缓冲器原理结构图

设计的基于常半满方式下多指针弹性缓冲器结构如图3 所示,该缓冲器包含输入输出控制模块、写指针操作模块、读指针操作模块、字符集检测模块、缓冲阈值测量模块、同步模块和双端口存储器RAM模块。

图3 弹性缓冲器结构图

2.1 输入输出控制模块

输入输出控制模块是与外部进行信息交互的连接模块。输入模块的主要功能是控制读写时钟域下的复位操作。在写数据有效和全局复位信号共同作用下,产生读写指针复位信号。输出模块则由读使能信号控制着信号的输出。只有当读使能有效时,才能从存储器中读出数据并发送给其他模块。此外,输出模块需要输出弹性缓冲器当前状态信号,字符集检测结果也会由该模块传递。写数据有效信号作为输入信号,表示当前数据的有效状态,其中数据为数据字符或控制字符均为有效。当上层指示数据无效时,触发复位逻辑,复位整个弹性缓冲器。

2.2 写指针操作模块和同步模块

在正常模式下,读写指针递增,由于读写时钟异步,需要将写指针经过同步后再进行差值计算。同时为了避免毛刺的生成,采用格雷码转换器,这会占用较多资源,逻辑结构也较为复杂。为了解决这一问题,文中采用半满状态检查的方式,在触发读指针的检查操作时写指针处在半满位置,即写指针即将到达半满位置时,触发检查脉冲,将此脉冲信号经过同步模块传递到读时钟域下,随后读指针地址信息被送到缓冲阈值测量模块,由该模块判断当前弹性缓冲器的状态,并进行后续操作。相对于直接跨时钟域同步多位指针的实现方法来说,既减少了同步的位数,也简化了逻辑结构。

2.3 双端口存储器RAM模块

存储器的容量由参数控制,最小深度为8,宽度固定为11 bit。存储器宽度设置成固定有利于读指针操作,扩展数据位宽可以通过增加读写指针实现。

2.4 字符集检测模块

由于各个协议定义的字符集各不相同,因此设计了3 组字符集检测逻辑,通过模式选择信号(也可由参数控制,通过定义参数来选择不同模式)确定当前适用的协议,并将字符集检测结果送到缓冲阈值测量模块和输出控制模块。

2.5 缓冲阈值测量模块

缓冲阈值测量模块的工作流程是,写指针位于半满位置触发检查脉冲,检查脉冲经过同步模块到达读时钟域,读取读指针地址,根据阈值划分判断此时存储器状态。弹性缓冲器深度为16 时,其阈值划分示意图如图4 所示。读指针位于高缓冲区,表示存储器中的有效数据较少,一旦检测到字符集,则增加读指针递增值,实现删除SKP/ IDLE 字符操作,提高有效数据的读出速率,反之亦然。如果读指针处于上溢或下溢区间,则弹性缓冲器过满或过空,为了避免指针跃迁,读指针会直接跳过数据或立即暂停,并向外部输出上溢或下溢信号。为了满足其他协议的要求,弹性缓冲器深度随参数设置而变化,缓冲区间随深度成比例变化。

图4 弹性缓冲器阈值划分示意图

2.6 读指针操作模块

读指针主要用于选定要读出的存储单元,以及通过暂停和跳转的方式来实现字符集的增添与删减。由于读指针个数大于读指针递增数,因此能够预先检测到字符集,在下个时钟周期进行读指针的暂停或跳跃。若数据宽度为20 bit,在一般模式下,读指针依次递增数为2。当读指针的最低位处于高缓冲区,并且收到字符检测信号时,读指针多跳过一个字符,从而实现删减字符功能,反之,读指针位于低缓冲区,读指针不再递增,此时重复读取当前字符,完成增添字符操作。

3 综合与仿真

文中采用Verilog HDL 硬件描述语言设计多指针弹性缓冲器,用VCS 仿真工具进行功能仿真验证。同时在台积电55 nm 工艺条件下,通过EDA 工具DC(Design Compiler)进行综合,并且采用相对保守的时序约束。综合报告结果如图5 所示。从综合结果可以看出,该设计能够满足时钟频率为500 MHz的时序要求。

图5 综合报告结果

表3 展示了在相同参数及综合约束条件情况下,支持不同模式所需要的面积、功耗的比较。其中,仅支持PCIE2.0 的模式是从支持多协议模式中分离出来的模式,从表中可以看出,支持多协议的弹性缓冲器在面积和功耗上有一定的增加,面积增加4.4%,功耗增加1.0%。

表3 不同模式下面积功耗对比

仿真结果如图6~图11 所示。图6、图7 表示在PCIE2.0 协议下,弹性缓冲器配置为数据位宽40 bit,深度设置为32。从图6 中rd_data=40’b3e_8f4c_2c00 可以发现,读出数据删除了控制字符集中第一个SKP 字符,图7 读出数据在COM 字符后增添了SKP 字符;图8、图9 表示在USB3.0 协议下,将数据位宽配置成20 bit,深度配置为16,读指针处于高缓冲区或低缓冲区时,写入数据wr_data=20’b3_e706 被删除或重复加入;图10、图11 表示在1000Base-X 协议下,设置数据位宽为10 bit,弹性缓冲深度为最小值8,在控制字符删减/增添信号有效时完成删减/增添操作,维持了弹性缓冲器的常半满状态。

图6 PCIE2.0协议下SKP字符的删减操作

图7 PCIE2.0协议下SKP字符的增添操作

图8 USB3.0协议下SKP字符的删减操作

图9 USB3.0协议下SKP字符的增添操作

图10 1000Base-X协议下IDLE字符的删减操作

图11 1000Base-X协议下IDLE字符的增添操作

4 结束语

文中讨论了基于常半满方式的多指针弹性缓冲器原理与设计。该设计采用半满检查和多路指针的方法,实现了缓冲测量以及字符增删操作,同时引入可配置参数,使得该弹性缓冲器能够适配不同协议的数据位宽和深度需求。经过仿真综合验证,该设计能够同时满足1000Base-X 千兆以太网、USB3.0 以及PCI-Express2.0 的协议要求,正确完成动态增添或删除字符,实现传输速率补偿。

猜你喜欢
数据位缓冲器指针
A320飞机大气数据的采集和计算在排故中的应用
更正
重载货车用缓冲器选型的研究及分析
为什么表的指针都按照顺时针方向转动
微弱GPS信号避开比特跳变的捕获算法
起重机检验中缓冲器选型问题的分析和探讨
一种适用于FPGA系统中的变速箱电路设计
减少调度自动化设备通讯串口丢包率的措施
基于改进Hough变换和BP网络的指针仪表识别
ARM Cortex—MO/MO+单片机的指针变量替换方法