在KeyStone 器件实现IEEE1588 时钟方案
2015-03-06
1 概述
1588 是IEEE 规范定义的网络实时同步标准 [1] 。它提供一种通过网络信息交互以获得精准时钟信息的标准。和在广域网上的NTP 协议比较,1588 最新标准提供高于纳秒级别的时钟精度,可以用来满足要求在一个相对小的空间范围内对时钟同步有严格要求的应用场景,例如基站同步,音视频网桥(AVB),工业控制,产线控制,军事应用等。
KeyStone 架构是TI 推出的高性能多核架构,该架构目前已演进了两代——KeyStone1 和KeyStone2。基于KeyStone 架构,TI 推出多款针对基站和网络应用的多核芯片。
KeyStone1 家族基于40nm 工艺,包括如下器件型号:
· TCI6616,参见文献[2]
· TCI6618,参见文献[3]
· TCI6614 和TCI6612,参见文献[4]和[5]
· TMS320C6678、TMS320C6674、TMS320C6672 等,参见文献[6]
KeyStone2 家族基于28nm 工艺,包括如下器件型号:
· TCI6636K2H,参见文献[7]
· TCI6634K2K,参见文献[8]
· TCI6638K2K,参见文献[9]
· TCI6630K2L (即将发布),参见文献[10]
本文首先介绍IEEE1588 的基本原理,然后以常见的基于PHY 的IEEE1588 实现方案为参考,介绍KeyStone 架构上支持IEEE1588 的硬件功能。同时,本文总结了在KeyStone1 芯片上实现IEEE1588方案需要注意的实现细节,并对KeyStone2 芯片的1588 方案做初步介绍。
2 IEEE1588 时钟同步原理
IEEE1588 使用精准时间协议PTP (Precision Timing Protocol) ,通过端到端的报文交互获得时钟参考信息,矫正本地时钟频率和相位。1588 协议基于两个假设条件:第一,在时钟源设备和受时钟设备之间,网络报文传输时间是对称的。也就是说一个报文从时钟源设备到受时钟设备的传输时间等于报文从受时钟设备到时钟源设备的传输时间相同;第二,在PTP 报文交换过程当中,本地时钟的漂移可以忽略不计。
图1:IEEE1588 时钟同步原理
如图所示,在经过sync->delay_request->delay_response 消息交互以后,受时钟设备获得4 个时间值。以太网报文在两个设备之间的环路时延可以计算为
Troundtrip= (t4 - t1) - (t3 - t2)
假设包传输时延是对称的,那么单路时延是
Ttripdelay = ((t4 - t1) - (t3 - t2))/2
从时钟设备的时钟和主时钟的差值是
Tdelta = t2 - (t1 + Ttripdelay)
实际部署时,时钟源发送sync 消息,从设备根据多个sync 消息来计算本地时钟的偏差。当从设备需要同步本地时钟相位的时候,发送delay_req 消息,时钟源发送delay_response,从设备根据获得的4 个时间值来估计相位的偏差。
对于时钟源设备,如果在发送sync 报文时所带的时间戳就是报文发送时采集的准确时间,这种模式叫做single step 模式。如果发送sync 报文的时候所带的时间戳只是一个近似时间,sync 报文发送的准确时间不能在发送sync 报文的时候获得或者实时插入到sync 报文中,时钟源设备需要发一个follow up消息报文,用来传递sync 报文的准确发送时间,这种模式叫做two step 模式。下面介绍的PHY 方案支持时钟源single step,TI 的KeyStone 架构支持时钟源two step 模式。
3 1588 芯片实现方案
根据打时间戳的方式不同,常见的1588 方案分为软件时间戳方案和硬件时间戳方案。软件方案通常是通过软件手段在网络报文的接收中记录PTP 报文接收或发送时间,处理灵活,可以根据应用场景灵活处理PTP 协议报文,支持多种封装格式。但是因为软件中断的时间抖动大,软件时间戳方案的精度较差,在对精度要求不高的情况下使用。硬件方案通过特殊硬件解析PTP 报文,并用硬件记录报文发送或接收时间。硬件方案精度高,但是需要特殊硬件解析 PTP 报文,在特殊场景中,例如 PTP over IPSec,报文经过加密,硬件无法解析PTP 报文。根据硬件方案获取报文收发时间地点不同,硬件方案又分在PHY 上集成的1588 方案和MII 集成的1588 方案等。
下面先简单介绍一下TI 基于PHY 的硬件解决方案作为参考,然后着重介绍KeyStone 架构上的基于MII 和PA 的1588 方案。
3.1 以太网PHY1588 方案 (DP83640)
图2:DP83640 高精度时钟同步硬件模块
DP83640 [11] 是一款百兆网口PHY,集成了1588 功能,对外提供校准过的时钟和PPS 信号,同时还支持同步以太网功能,直接从物理层获得远端时钟。在支持同步以太网的情况下,使用1588 做相位调整,实验表明最终的时钟偏差精度可以达到纳秒以下。
83640 timestamp 模块维护一个本地的1588 计数器,包括32bit 的秒计数和30bit 的纳秒计数。PTP 报文中要求的48bit 秒计数中的高16 位需要软件维护。上层软件在发送一个1588 报文的时候,时间戳中秒计数的高16 位由软件设置的,低32 位设置为0。
报文解析模块用来匹配解析PTP 报文。83640 支持1588 Annex D & E 和Annex F 格式的报文。当PTP 报文送至PHY 时,报文解析硬件检测到这个PTP 报文的时钟,在报文发出时,把本地的时间戳写到PTP 报文里面,并修改相关的CRC 和CHKSUM 值。83640 支持1588 single step 模式的时钟源。在报文接收方向,同样有报文解析硬件。在解析到PTP 报文以后,接收报文的准确时间戳可以插入在报文里,或者通过控制接口上报。
83640 的1588 时钟模块对外提供频率控制接口,软件通过控制寄存器可以调整输出的时钟频率。1588 时钟模块根据上层软件的配置,对1588 时钟模块的输入时钟信号微调,然后分频输出。时钟调整是通过调整每个时钟周期的时间来实现的。在每个时钟周期调整的单位是2-32ns。在正常模式下,这个调整机制用来补偿本地时钟和时钟源的差距。在长期工作以后产生累积同步误差时,软件可以调整寄存器的值,在一定时间内,对频率向上或者向下微调,以补偿相位差距。当在相位补偿以后,恢复正常频率补偿模式。
软件协议栈通过协议处理以后获得本地的时钟与时钟源的绝对时间差值,然后通过寄存器调整本地绝对时间戳。在修改时,软件把绝对时间差值写入寄存器,然后使能修改。这种方法适用初始同步时单次校正本地绝对时间戳。如在正常工作中出现累积相位偏差,应该使用前面介绍的微调方法,避免输出时钟抖动。
应用层通过设置83640 的trigger control 模块来控制输出PPS 或者其他同步信号。应用可以设置在timestamp 的哪些具体时刻某个GPIO 管脚可以发生反转。trigger 的输出可以线与并输出到GPIO 管脚,通过线与可以是输出复杂的周期波形。
83640 方案实现简单,直接输出矫正时钟及相位信号,但是对于复杂传输场景支持困难;而且相比不包含IEEE1588 功能的PHY 芯片,83640 的成本要高出许多。
3.2 KeyStone1 1588 方案
KeyStone 架构是TI 推出的高性能多核架构,现在已经有KeyStone1 和KeyStone2 两种架构。KeyStone 架构中也包含了对IEEE1588 功能的支持。
KeyStone1 系列芯片的1588 方案包括两个硬件部分:记录时间戳,发送同步脉冲。KeyStone1 支持two step 的时间戳模式,同时也能支持1588 协议中Annex D & E 和Annex F规定的PTP 报文解析。
对于记录时间戳,KeyStone1 对于Annex D & E 和Annex F 采用不同的硬件来支持。Annex D & E 使用以太网协处理(NetCP)里面的包加速器(PA)来支持;Annex F 报文使用以太网交换机(GE Switch)里面的CPTS 模块来支持 [12-13] 。
对于同步信号的输出,KeyStone1 里面需要通过Timer64[14]来完成。
软件通过CPTS 或者PA 获取到时间戳后,计算需要调整的频率和相位,然后通过配置Timer64 的周期寄存器来更改Timer64 的输出周期,调整输出的相位信息;通过SPI 接口调整外部的VCXO 的输出频率,矫正本地时钟频率。
图3:KeyStone1 IEEE1588 时钟同步方案
3.2.1 Annex D & E PTP 报文处理
PA 内部会维护一个48bit 的计时器,该计时器的频率与PA 的频率一致(一般是
350MHz)。由于Annex D & E 报文的承载方式为IP/UDP 承载(报文模式为IPv4 和IPv6),当用户收到或者发送一个 IPv4 或 IPv6 的 PTP 报文时,在 PA 侧会记录一个报文接收(或发送)的时间戳,这个时间戳只有32bit(为48bit 中的低32bit)。这个时间戳保存在用户指定的QMSS 的某个Queue 的描述符里面。
用户从Queue 中提取出该描述符:如果是接收,用户可根据描述符信息解析报文类型,获取报文内容,同时读取32bit 时间戳并换算成绝对时间。如果是发送,用户只需读取时间戳,转换为1588 48bit 绝对时间后按照1588 two step 的规则再做报文发送。
3.2.2 Annex F PTP 报文处理
GE Switch 模块上的CPTS 模块支持对1588 Annex F(以太网封装)的PTP 报文解析,
支持VLAN。在CPSW 逻辑匹配到PTP 报文时,会触发一个硬件信号给CPTS 模块用来触发时间戳获取。
CPTS 的时间戳模块维护一个32bit 的timer,根据配置,这个timer 可以工作在二分之一CPU 主频上。这个timer 是一个free run timer。软件通过这个timer 换算得到1588 的32bit 纳秒时钟和48bit 秒时钟。因为timer 只有32bit,所以软件需要处理timer 反转事件,用来维护秒信息。CPTS 得到时间事件以后,会将PTP 报文的消息类型和Sequence ID 等信息压入EVENT FIFO 中,并触发中断让用户处理。
3.2.3 同步信号的产生
同步信号需要通过Timer64 来产生。由于Timer64,PA 以及CPTS 都是共用KeyStone 外部的VCXO,因此从时间源上保证各个计时器之间没有累积误差。这样计算出来的各个绝对时间也是固定不变的。
关于同步信号的时间戳,有两点需要说明:
1. KeyStone 芯片的1588 功能不维护绝对时间戳,时间信息是从CPTS timer 或者PA 的timer 换算出来。这样也不支持对1588 报文发送时实时修改,所以在用KeyStone 芯片做时钟源时,芯片只支持two step 模式。
2. 输出时钟方案需使用KeyStone1 芯片上的定时器的输出。因为CPTS(或PA)上打时间戳的计数器和定时器使用的时钟虽然是同源,但是相位不同,产生的PPS 时钟时,需要软件参与校正两个计数器,并对记录相应的相位差。具体实现时,需要首先对CPTS(或PA)里面的计数器和选定的Timer64 计数器相差相位进行计算。软件首先操作CPTS(或PA)寄存器,触发一个CPTS 时间戳记录事件(或者发起一个读取PA 时间戳寄存器的命令),然后马上读取timer64 的值。考虑到cache 问题以及硬件总线上的竞争可能性,软件应在一个循环内多次执行这个操作,保证执行程序加载到 L1 cache 中,两个时钟之间的相位差应该可以通过循环几次获得的值平均得到。
3.3 KeyStone2 1588 方案
KeyStone2 架构的TI 芯片对1588 的支持做了改进和增强。CPTS 模块支持同步以太网(Annex F)和1588 Annex D & E 的报文。在KeyStone2 芯片中,PPS 输出是直接由CPTS逻辑驱动的。软件通过设置相关寄存器设置下一个PPS 输出时timestamp 的值,当计数器跑到设置的值的时候,硬件触发PPS 信号输出。
图4: KeyStone2 IEEE1588 时钟同步方案
相比KeyStone1 的方案,KeyStone2 的主要优点在于:
1. 方案简单,涉及到的硬件和底层器件更少
KeyStone1 需要PA,CPTS,Timer64,QMSS 等外设和加速器来支持整套方案,而KeyStone2 只需要CPTS 一个模块就可以支持Annex D & E 和Annex F 的PTP 报文,同时也支持同步信号的输出;
2. 时间戳个数减少,降低了计算复杂度
KeyStone1 里面需要计算包括PA 时间戳,CPTS 时间戳以及Timer64 的时间戳在内的共计3 个时间戳与PTP 报文的真实时间的绝对时间相差;KeyStone2 里面只有CPTS一个时间戳需要计算;
3. 方案全由硬件逻辑完成,彻底避免了软件干预同时也提高了同步精度
KeyStone 1 的方案由于记录时间戳的时间源(PA 和CPTS)与发送同步信号的时间源(Timer64)是不同的,因此在系统运行的时候需要软件计算不同时间源的绝对时间差,这样才能在后面的时间同步中精确调整时间。这里有软件读取并计算时间差的工作,这部分工作不可避免的存在软件误差,虽然可以通过多次计算取平均等统计手段缩小误差,但还是对精度存在一定的影响。KeyStone2 中,记录时间戳和发送同步脉冲都在CPTS中,因此无需计算两者的时间差,这样就避免了软件干预,也提高了同步精度。
4 KeyStone1 1588 方案实现
前文从原理和方案上描述了KeyStone 中如何实现1588 方案,本章节以KeyStone1 为例,从技术细节方面来阐述1588 实现方式。
以Annex F 的PTP 报文为例,1588 的实现主要分为配置Gbe Switch[3]和计算时间偏差两部分。整体流程如下:当接收(或发送)一个802.3 的PTP 报文时,Gbe Switch 会自动侦测到PTP 报文的接收(或发送)时间,并将该时间戳记录下来;用户根据记录下来的时间戳,配置Timer64 的时间输出信号,获取当前需要调整的时间偏差。
4.1 Gbe Switch 配置
KeyStone1 中的 Gbe Switch 是一个集成了1588 PTP 报文检测的交换机,其中CPTS 用来记录时间戳,CPSW 用来侦测1588 报文。因此1588 实现方式主要通过配置CPTS 和配置CPSW 来实现。
4.1.1 CPTS 配置
CPTS 是KeyStone1 架构中Gbe Switch 中的一个模块,请参考文献 [12] 中的2.3.5 章节。该章节详细介绍了CPTS 模块的工作场景和寄存器列表。
图5: KeyStone1 CPTS 寄存器列表
CPTS 配置步骤如下:
1) 复位CPTS 模块;
CPTS 的复位通过将TS_CONTROL 寄存器中的CPTS_EN 位域写0 来实现。
2) 选择CPTS 时钟源;
CPTS 时钟源在CPTS_RFTCLK_SEL 寄存器中选择,有四种时钟源可以选择:SYSCLK3,SYSCLK4,TIMI0 和TIMI1。其中SYSCLK3 是1/2 CPU 时钟,SYSCLK4是1/3 CPU 时钟,TIMI0 和TIMI1 分别是两个外部时钟输入pin 脚,原本是作为Timer64 的输入时钟,这里也可以复用为CPTS 的时钟源。
3) 使能CPTS 模块;
CPTS 的使能通过将TS_CONTROL 寄存器中的CPTS_EN 位域写1 来实现。当CPTS使能后,CPTS 内部的时间记数器就会根据输入时钟的频率开始记数。
4) 使能CPTS 中断;
CPTS 模块中断使能通过配置INT_EABLE 来完成。CPTS 可以产生多种事件的中断,主要有:
· Push 中断:用户手动触发一个 Push 事件,该事件会记录当前 CPTS 的时间戳,并触发中断;
· 记数器翻转中断:当CPTS 的32bit 记数器从0xFFFFFFFF 变为0x00000000 时会自动触发一个中断;
· 记数器半翻转中断:当CPTS 的32bit 记数器从0x7FFFFFFF 变为0x80000000时会自动触发一个中断;
· 以太网PTP 报文接收中断:当接受1 个以太网PTP 报文时触发中断;
· 以太网PTP 报文发送中断:当发送1 个以太网PTP 报文时触发中断;
4.1.2 CPSW 的配置
CPSW 是属于Switch 的组成部分,可以通过配置CPSW 让Switch 识别PTP 报文。CPSW 的报文识别功能也通过配置寄存器的方式来实现。需要说明的是,由于Switch 对外有两个接口(port1 和port2),因此对应的寄存器也有两份。其寄存器列表如下图所示:
图6: KeyStone1 CPSW 寄存器列表
配置步骤如下:
1)配置LTYPE;
每种以太网报文都有一个类型,CPSW 将根据这个类型配置侦测用户需要的报文。根据以太网报文的定义,IEEE1588 的PTP 报文的类型为0x88F7。用户需要将这个类型写入Pn_TS_SEQ_LTYPE 中(n 表示端口号)。
2)配置VLAN ID(如果使能了VLAN 报文的话);
用户可以定义需要的VLAN ID,在Pn_TS_VLAN 寄存器里面配置。
3)使能CPSW 检测模块;
CPSW 的使能包括接收和发送的使能,需要用户配置Pn_TS_CTL 里面对应的位域。
4.2 时间偏差的计算和调整
Gbe Switch 完成对PTP 报文的时间戳记录之后,用户需要根据时间戳计算当前需要调整的时间数。由于真实系统时间是基于Timer64 的时间戳,因此用户在计算CPTS 的时间戳之后需要换算到真实系统时间。
为了方便说明和计算,在下面的配置中,假定CPU 时钟为1GHz,CPTS 采用1/3 CPU 时钟,Timer64 的定时周期为1ms。
4.2.1 CPTS 时钟到系统时钟
由于CPTS 的时间戳只有32bit,因此CPTS 翻转后时间戳不能代表真实时间,用户需要记录翻转的次数以获得Tcpts。那么换算关系如下:
其中,N 代表CPTS 翻转次数,TIME_STAMP_CPTS 代表当前CPTS 的32bit 时间戳。Timer64 是以1ms 为周期进行记数的定时器,其输入时钟为固定的1/6 CPU 时钟,因此可以算出Timer64 的记数器范围为0~166666 (Timer64 采用连续记数方式)。因此可以得出如下公式:
其中TIME_STAMP_TIMER 代表当前Timer64 的时间戳
当Timer64 和CPTS 完成使能,用户可以通过读取两者时间戳的方式获取两者的在1ms 内的基本时间戳。假设读取之后两者时间戳偏差为Toffset,由于Timer64 和CPTS 同源,因此可以认为此偏差在CPTS 或Timer64 复位前保持不变。
4.2.2 时间调整
1588 的时间调整包括调频和调相两部分。通常来说,需要先保证频率同步,然后再进行相位调整。
调频的部分不需要Timer64 的参与,需要比对PTP 报文中的时间戳差值和CPTS 记录的时间戳,处理如下:
其中Teth1 和Teth0 分别表示收到的两个PTP 报文中自带的主时钟时间戳(纳秒级),而Tcpts1 和Tcpts0 代表这接收这两个PTP 报文时由CPTS 得到的时间。考虑到传输对称性,这里可以不考虑传输过程时延的影响。
用户通过比对∆eth 和∆cpts 来确定当前系统频率与主时钟频率的差别。
当调频过程基本完成,即∆eth ≈∆cpts 时可以进行相位调整。调相的主要工作是调整Timer64的输出脉冲,由于输出脉冲以1ms 为周期,因此只需计算在1ms 内的偏差即可。相位调整的主要原理如下:
其中,Teth 表示接收到的PTP 报文的主时钟时间,Tcpts 表示该PTP 报文对应的CPTS 时间,Toffset 表示CPTS 和Timer64 的时间差,Ttripdelay 表示网络传输时间。
按照计算后,Timer64 的输出周期需要满足如下条件:
4.3 KeyStone1 1588 方案的说明
KeyStone1 的1588 方案主要依靠配置Gbe Switch 和软件换算时间戳两部分来完成。需要强调的是,在软件换算时间的部分,这涉及到具体的1588 时间戳计算算法。基于应用的需求和精度需求,许多算法往往比这里介绍的更复杂,但是原理上来说都是相同的。这也是KeyStone架构使用软件实现 1588 部分的一个优势,用户可以灵活使用软件功能来提高 1588 的同步精度。
5 小结
从目前来看,IEEE1588v2 标准已经越来越多的应用在通讯网络中。由于IEEE1588v2 标准也还在不断的完善中,因此从技术角度出发,熟悉1588 同步原理,了解并设计不同场景中的1588 方案,不论是从芯片设计角度或者基站整体解决方案角度来说,都是十分必要的。
本文简要的介绍了IEEE1588 的原理,并分类分析了1588 同步功能在PHY 以及KeyStone1 和KeyStone2 芯片上的应用方案。以太网PHY 实现1588 同步的精度最高,但是成本相对比较昂贵;德州仪器的KeyStone 架构上集成了支持1588 的Switch,用户可以通过KeyStone 架构灵活实现1588 同步功能,也为用户的方案设计提供了更多的选择。
参考文献
[1] IEEE Standard for a Precision Clock Synchronization Protocol for Networked Measurement and Control Systems
[2] http://www.ti.com/product/tms320tci6616
[3] http://www.ti.com/product/tms320tci6618
[4] http://www.ti.com/product/tms320tci6614
[5] http://www.ti.com/product/tms320tci6612
[6] http://www.ti.com/product/tms320c6670
[7] http://www.ti.com/product/tci6636k2h
[8] http://www.ti.com/product/tci6634k2k
[9] http://www.ti.com/product/tci6638k2k
[10] http://www.ti.com/product/tci6630k2l
[11] DP83640 Precision PHYTERTM
[12] KeyStone Architecture Gigabit Etherent (GbE) Switch Subsystem (SPRUGV9B)
[13] Packet Accelerator (PA) for KeyStone Devices User's Guide (SPRUGS4A)
[14] 64-Bit Timer (Timer64) for KeyStone Devices User's Guide (SPRUGV5A)