基于国产处理器直连接口的设计与验证∗

2019-11-29 05:13王锦涵班冬松
计算机与数字工程 2019年11期
关键词:物理层接收端报文

王锦涵 李 研 班冬松 陶 涛

(上海高性能集成电路设计中心 上海 201204)

1 引言

共享多路服务器的片间直连技术是服务器芯片设计中的重要组成部分,也是提升服务器芯片性能的一项关键技术[1]。在现有技术中,PCIe 协议具有应用范围广、传输带宽搞、较为成熟等优点,因此,可以基于PCIe 协议实现国产处理器芯片的片间直连功能。通过研究一些直连技术的结构和PCIe 的具体实现方式,结合芯片直连的功能需求,将PCIe 的总线技术运用在处理器片间直连当中,可以实现自主可控的芯片直连接口,达到处理器直连的目的。

PCIe总线历经多代发展完善,目前有着高度灵活可配置的特性和比较完整的体系结构。从分层协议的角度来看,PCIe由处理层、数据链路层、物理层这几个部分组成。另外,PCIe协议针对不同的设备在接口上的不同需求,重新设计与PCIe 核心的接口,可以将PCIe 的核心功能运用到各种各样的计算机或通信系统平台中去。除此之外,PCIe还明确定义了协议相关的报文格式,在每一个协议层里都根据了不同的实现需求定义了一种包含关系的报文格式。

本文在跨芯片一致性协议已经完备的基础下提出了一种基于PCIe 实现的直连接口协议,该协议在功能划分上实现了处理层、数据链路层和物理层。同时,为了满足功能正确性的要求,本文提出了一种基于UVM 的直连接口验证环境。根据直连接口的接口协议,发送了一系列的报文来验证传输的正确性,并针对实际传输的阻塞、延时等情况,环境可以驱动特殊的激励输入给直连接口电路进行功能验证。

2 PCIe协议简介

PCIe(Peripheral Component Interconnect express)是用于互连计算机或一些通信平台应用中外围设备的高性能IO 总线。相较于其他总线,PCIe有着广泛的应用场景、完整的协议体系、带宽高等优点[2]。本文在PCIe 协议的基础上提出了一种直连接口,因此,对PCIe 协议的处理层、数据链路层和物理层进行简要的介绍。

2.1 处理层

处理层处在PCIe 协议的最高层次,处理层的功能是接受设备核心层的数据,并对其进行转换处理,使其符合总线事务的相关标准。数据经过处理层后,会被封装为一个或多个处理层数据包(TLP,Transaction Layer packet)。TLP的组成如图1所示,包含了数据的有效载荷大小、事务类型、目标的起始地址、虚通道/流量类别信息、传输属性。这些信息可以很好地确保数据在到达接收端之后,接收逻辑来判断收到的报文的格式类型和路由信息。头信息的控制域很多,每一种都支持不同的功能。事务层最主要的功能就是实现包的封装和拆解。对于不同的应用场景,不同的TLP头信息配置可以支持非常多的功能[3]。

图1 通用TLP头格式

2.2 数据链路层

数据链路层用来连接物理层和处理层,主要作用是将从物理层获得的报文数据传送给事务层,同时接收事务层的报文数据并转发给物理层,另外,数据链路层有另外一个重要的功能是保证TLP 报文在链路传输过程中的正确性。为此,数据链路层定义了如图2 所示的数据链路层数据包(DLLP)。数据链路层会生成DLLP 数据包并对外发送,同时也会接收对端发来的DLLP 数据包,通过DLLP 数据包,数据链路层可以保证链路中TLP报文的正确性。

图2 一般DLLP报文头格式

数据链路层在保证报文正确性时,采用了Ack/Nak 协议,如图2 所示。Ack/Nak 协议是一种滑动窗口协议,分为发送端和接收端。发送端中设置了一个重传缓冲,在接收到来自事务层的TLP 时,发送逻辑会先将TLP 进行封装,加上序列号前缀和LCRC 后缀,然后放到重传缓冲中。只要重传缓冲不满,发送端会一直从事务层提取报文出来。序列号是由发送端的计数器实现的,每发一个TLP 报文,计数器进行加一操作,对应的接收端也有一个计数器,接收端的这个计数器记录即将收到的报文的序列号,在正常的情况下,接收端收到的TLP 的序列号应该与发送端的序列号相同。接收端在正确接收了TLP报文之后,也会将自己的计数器进行加一操作。报文传输到了接收端时,接收端首先会对报文进行CRC 校验。校验正确的报文才可进入后续操作,否则直接丢弃,并返回Nak。报文校验正确之后,接收逻辑会对比报文中的序列号与本地的计数器是否相同,如果相同则认为是正确的报文,并返回Ack 给发送端确认报文已经正确接收。如果收到的报文的序列号大于本地的计数器的值,代表报文在传输的过程中出现了丢失报文的情况,如果收到的报文的序列号小于本地计数器的值,代表链路在传输的过程中发生了重复传输已经正确接收的报文的情况。这两种不正确的情况下就需要返回Nak 来使得接收端开启重传逻辑。接收端在返回Ack/Nak 时,会有一个域带着接收端最后一次成功接收的报文的序列号,发送端的接收逻辑在收到这个DLLP报文后会根据这个域的值来控制重传缓冲从哪个条目来发送之前没有正确接收的数据。同时,发送端也根据本地序列号计数器的值与最后一次成功接收的报文号的值做比较,如果差值比较大,发送端将不会从事务层中接收新的TLP,因为发送端发送了很多的TLP 而接收端并没有成功收到这些TLP或者收到的数目很少,数据在链路上的传输可能出现了问题。

2.3 物理层

图3 Ack/Nak协议原理图

PCIe 协议的物理层包括逻辑物理层和电气物理层[4]。逻辑物理层是PCIe物理层的数字部分,在将一个数据链路层发来的数据包差动输出到链路上之前,需要对数据包进行处理。如图4 左侧部分所示,接收部分如图4右侧部分所示。

图4 物理层相关逻辑

电气物理层包括一个负责驱动发送器中的串行器的锁相环,还有一个与接收端收到的串行符号流转换保持同步的接收器锁相环。电气物理层的主要任务是将每条通道的输出符号串行化,并将比特流转化成嵌入了时钟的电气信号。同时,检测每条通道上的电气信号并生成串行比特流数据,反串行化数据并将从特流数据恢复出的时钟提供到逻辑物理层。电气物理层可以根据不同的应用场景重新设计,以便支持电缆或光纤接口。

3 国产处理器直连接口设计

实现芯片直连可以将单个芯片层次化存储结构连接形成一个更为复杂的共享存储结构,实现主存容量、访存带宽,IO 带宽的提升,提高处理器的性能。其中,芯片直连接口模块是实现芯片直连的基础。本文基于PCIe 协议并结合某品牌国产处理器直连的相关需求,提出了一种基于PCIe 的芯片直连接口结构[5~6]。

对于芯片直连而言,传输的事务只有固定的六类,但是在传输延时方面,芯片直连比PCIe 更敏感。因此,在设计芯片直连模块时,针对传输延时进行了必要的优化,使得整个直连模块的延时满足设计要求。下面,本文将对直连接口模块进行较为详细的介绍。

图5 直连接口模块设计构成

直连接口模块的总体结构如图5 所示,主要由Tx_APL、Tx_DLL、AckNak、FC_CTL、Rx_RLL、Rx_APL 和PHY 这七个部分组成,下面将对每个模块的具体功能进行简要的介绍。

Tx_APL 模块类似于PCIe 协议发送端的处理层,它的作用是对接受到的数据包进行处理,将其变成符合相应格式的一个或多个TLP 报文,同时,对上述TLP报文进行分类,并按照类型进行发送控制。

Tx_DLL 模块类似于PCIe 协议发送端的数据链路层,它的作用是对收到的TLP报文进行相关处理,在TLP 报文的特定位置加上响应的标志,用来提供正确性判断的依据。同时,Tx_DLL 模块还会对TLP 报文进行CRC 校验,生成校验码,并将其附加在TLP 报文上,最终将处理后的TLP 报文发送给PHY模块。

PHY 模块类似于PCIe 协议中的物理层,由于PCIe协议在物理层接受通路的延时很长,不利于夸芯片传输事务,因此这部分进行了改进,重点对物理编码子层PCS的逻辑设计进行了相应的优化,使其满足了芯片间传输的时序要求。

AckNak 模块的作用是确保传输过程中的正确性,该模块会对收到的TLP 报文进行校验,如果校验通过,则允许报文进入后续处理流程,同时生成DLLP 报文进行确认(Ack 报文);而如果校验不通过,则立即丢弃该TLP报文,并生成相应的DLLP报文要求进行重发(Nak 报文),另一端的芯片如果收到Nak报文,则会立即进入重发状态。

FC_CTL模块的作用是对直连模块进行流量控制,该模块会生成流量控制的DLLP报文并发送,另一端的芯片收到流量控制的DLLP报文后能够知道该芯片目前的状态信息,并根据上述信息对将要发送的TLP报文进行管理。

Rx_DLL 状态的作用是对收到的报文进行分类,将不同的报文送到不同的模块。

Rx_APL 的作用是接收Rx_DLL 传来的TLP 报文,按照TLP 报文的事务类型进行分类,同时根据报文的类型对TLP报文进行发送控制。

4 直连接口模块Mac功能验证

4.1 验证环境结构

从集成电路设计流程来说,前端设计与验证是彼此交互的过程,验证是设计的保障。在设计的初版代码完成之后,需要使用编译工具结合设计代码和验证环境的代码,进行功能模拟验证。验证环境会根据待测设计的接口协议去发送一些正确的激励,然后验证环境会接收待测设计输出的数据,并与待测设计的期望值来比较,进行功能验证。验证的流程和周期很长,也是前端设计中十分重要的部分。考虑到工程进度和实现的难度及可能性,针对直连接口电路的MAC 层进行了功能验证,本文介绍了基于UVM 的MAC 验证环境的结构框架和各个部件的具体实现功能,并分析了验证结果[7]。

对于MAC 这样的控制模块,传输数据作为最主要的功能,考虑到功能性验证在对数据流类的逻辑进行验证的过程中,不能很好地验证到各种复杂的场景,同时验证的代码对一些极端情况编写也存在难度,不能很高效地满足工程应用的需求。为此,采用UVM 验证方法学,基于UVM 库搭建了如图6所示的验证环境。

图6 MAC验证结构

在验证工作开始时,需要根据直连接口的特定验证需求来搭建验证环境,明确验证环境的框架。如图6所示,验证环境例化了两个直连接口DLI,这样做的原因是接口逻辑上主要是发送逻辑和接收逻辑,接收逻辑会在一些特殊情况下通过本地的发送逻辑来返回控制报文。一个直连接口的发送端和接收端两部分的逻辑之间是相互关联的,需要保证发送逻辑与接收逻辑同时工作才能模拟到传输的实际情况。

表1 六类消息格式说明

本文使用的处理器平台规定了直连接口共有六种消息格式,分别为HOM、SNP、NDR、DAT、NCA、NCB,这六类报文的详细信息如表1所示。上述六类报文在发往通过直连接口模块时会产生消息合并,具体的合并规则如图7所示。

图7 直连接口数据包合并格式

4.2 验证功能分析

针对直连接口的设计应用场景,在实际传输过程中,直连接口是负责将六种跨芯片一直性协议中的报文传输到目标芯片的直连接口上。直连接口会解析进入的报文的控制信息中的类型和路由信息,所以在接口层面发送激励只需关注类型和路由信息,控制信息其他的域可以随机生成。同时,在实际传输报文时,会将长短包进行合并,验证环境在发送合并报文时,也需要根据协议规则发送。而且在传输的过程中每个包之间可能会出现间隔(气泡),一个包的不同flit 之间也可能出现间隔。图8是连续发送随机报文的情况,可以看到虽然信息合并在高低段的报文输入给直连接口,但是经过内部缓冲或者站台及仲裁等操作后,直连接口输出的顺序发生变化,但是数据本身不变。

图8 连续发送随机报文

图9 是随机添加flit 之间的延时后发送报文的情况,这种情况下可以仿真出直连接口内部缓冲阻塞、轮转仲裁公平性等比较特殊的情况,更容易验证到代码逻辑中的一些错误。

图9 添加随机延时发送报文

在验证完正确传输之后,需要针对可靠传输的功能,进行模拟丢包验证,在环境中修改一些逻辑,使数据在传输的过程中丢失。直连接口控制逻辑会根据sequence号对丢失的报文进行重传,重新发送丢失的报文,控制逻辑的重传如图10所示。

图10 丢失报文重新发送

通过不断的发送随机激励,控制报文的时间间隔,类型和数量,可以在代码完成的早期验证出逻辑上的错误,直连接口的主要功能是传输数据,因此需要大量的激励来进行各种情况的仿真。经过初步的报文发送和报文接收进行正确性比对,直连接口电路可以初步满足逻辑功能正确性要求。

5 结语

服务器处理器芯片直连是扩大处理器主存容量、访存带宽和IO 带宽最有效的方式之一。结合现有技术背景,要实现芯片直连,必须针对芯片的特性设计直连接口模块。本文以国产处理器为平台,借鉴了PCIe 的体系结构,设计了适合该处理器芯片的直连接口,并对其进行了较为详细的介绍。同时,为了验证设计的正确性,使用UVM 验证方法学搭建了相应的验证环境,模拟了实际传输过程中的若干场景,对直连接口的控制层进行了较为完备的验证,保证了设计的正确性。

猜你喜欢
物理层接收端报文
基于J1939 协议多包报文的时序研究及应用
以太网QoS技术研究及实践
基于扰动观察法的光通信接收端优化策略
基于报文类型的限速值动态调整
纯多播BC 信道并存单播MAC 信道的天线效率研究
手机无线充电收发设计
浅析反驳类报文要点
利用Modbus协议实现垂直螺旋卸车机取料器自动调速方法
一种应用于5G基于LDPC码的物理层包编码
基于盲波束形成的MIMO雷达稳健参数估计