作者:Gary Pan,来源:AMD Xilinx开发者社区
目前Xilinx的以太网IP核,如软核10G/25G,40G/50G或者硬核CMAC,MRMAC,DCMAC等等,都采用的是同一种Pause帧处理方式。
这篇blog主要介绍了,用户应当如何设置以太网IP的相关参数,使其能够有效处理以太网的Pause帧。
按照IEEE802.3协议,一个Pause帧是一个最小长度,即64bytes长的以太网帧,目标地址(DA)为一个广播地址01-80-C2-00-01,Type为8808,Opcode为0001(Global)或者0101(Priority)。具体细节请参考IEEE802.3协议。
PFC结构如下所示:
Xilinx以太网IP,可以灵活的设置这些以太网Pause帧参数。例如通过设置如下TX侧的参数,包括GPP(Global Pause Packet)的目标地址(DA),Ether Type,Opcode等,这样IP会产生你所期望的任意数据包,作为你要的Pause帧发送出去。
同样地,IP也需要在RX侧做相应的设置,这样才能识别出Pause帧并进行处理。接下来,就重点介绍,如何在RX侧设置Pause帧的处理。
首先,IP遵循如下3个Steps,对收到的以太网帧进行处理:
Step1,如果通过了,则该以太网帧被认为是控制包,进入Step2,并且不再出现在用户数据侧显示;只有将ctl_rx_forward_control设为1的时候,即使是控制包,IP仍然会将其跟其它数据包一起输出到RX用户侧;如果Step1没通过,则该以太网帧为普通RX数据包。
Step2,如果通过了,则该以太网帧被确认为全局Pause帧;如果没通过,则进入Step3。
Step3,如果通过了,则该以太网帧被确认为Priority Pause帧;如果没通过,则不是Pause帧,为其它类型控制帧。
也就是说,这里有四种特殊的以太网帧,分别是两种控制包Global Control Packet(gcp),Priority Control Packet(pcp),和两种Pause帧Global Pause Packet(gpp),Priority Pause Packet(ppp)。
IP需要首先判断收到的是否是控制包(即gcp或pcp),是的话,则先判断是否是Global Pause帧,再判断是否是Priority Pause帧。这几步判断,IP都给了相应的参数,供用户设置,每一个条件,用户都可以选择是否要作检查。
文档里给出了IP是如何做判断的相关代码,如下。(由于某些新的IP文档尚未完善,如DCMAC,如果缺失这部分内容,也是可以参考其它IP文档里的这一段内容的)
接下来,选取Step2中的两句,具体解释下,如何理解这个代码。
其它部分可以类推
先来看图中第二句,判断该以太网数据包为Global Pause帧(gpp),首先要满足Step1,然后是由上图中第二句代码(assign global_pause_packet)后面的所有项“与”(&&)起来的,就是说要满足后面所有的项,分别是DA符合,SA符合,Etype符合,Opcode符合,并且使能了该功能(即设置ctl_rx_enable_gpp=1)。
再来看第一句,Opcode符合(assign opcode_match_gpp),是由后面两个条件“或”起来。这里要注意,为什么是或,第一个条件是该功能使能取反,也就是说,如果你设置使能不打开的话,这个条件是直接满足的;这就意味着,不打开这个使能表示代码不检测这个条件,任意数据都会被当作满足条件,所有数据包都会被认作Pause帧;使能打开后,才会要求后面的第二个条件符合才行,第二个条件即RX收到的数据包的该段数据,满足你设置的ctl_rx_opcode_gpp,按照协议你应当将其设置为0001。
总之,在设置完这些Pause帧相关参数后,就可以使用以太网IP的流控功能了。通过stat_tx_pause确认IP是否成功发出Pause帧,并通过stat_rx_pause确认IP是否能收到Pause帧。如果仍然无法成功接收到Pause帧,不要忘了将ctl_rx_forward_control设为1,并在用户侧接收数据的地方,检查IP实际收到的数据包,并逐条对照之前的。