RX 暂停终止 - 4.1 简体中文

10G/25G High Speed Ethernet Subsystem 产品指南 (PG210)

Document ID
PG210
Release Date
2023-05-16
Version
4.1 简体中文

10G/25G Ethernet Subsystem 去除了全局暂停帧和优先暂停帧,并提供了一个简单的握手接口以允许用户响应暂停包。

暂停包判定

暂停包判定分 3 个步骤:

  1. 执行检查,确认包属于全局控制包还是优先控制包。

    仅当 ctl_rx_forward_control 设为 1 时才会将通过步骤 1 的包转发给您。

  2. 如果通过步骤 1,则会检查该包以判定它是否属于全局暂停包。
  3. 如果未通过步骤 2,则会检查该包以判定它是否属于优先暂停包。

对于步骤 1,以下伪代码显示了检查功能:

assign da_match_gcp = (!ctl_rx_check_mcast_gcp && !ctl_rx_check_ucast_gcp) || ((DA 
== ctl_rx_pause_da_ucast) && ctl_rx_check_ucast_gcp) || ((DA == 48'h0180c2000001) && 
ctl_rx_check_mcast_gcp);
assign sa_match_gcp = !ctl_rx_check_sa_gcp || (SA == ctl_rx_pause_sa);
assign etype_match_gcp = !ctl_rx_check_etype_gcp || (ETYPE == ctl_rx_etype_gcp);
assign opcode_match_gcp = !ctl_rx_check_opcode_gcp || ((OPCODE >= 
ctl_rx_opcode_min_gcp) && (OPCODE <= ctl_rx_opcode_max_gcp));
assign global_control_packet = da_match_gcp && sa_match_gcp && etype_match_gcp && 
opcode_match_gcp && ctl_rx_enable_gcp;
assign da_match_pcp = (!ctl_rx_check_mcast_pcp && !ctl_rx_check_ucast_pcp) || ((DA 
== ctl_rx_pause_da_ucast) && ctl_rx_check_ucast_pcp) || ((DA == 
ctl_rx_pause_da_mcast) && ctl_rx_check_mcast_pcp);
assign sa_match_pcp = !ctl_rx_check_sa_pcp || (SA == ctl_rx_pause_sa);
assign etype_match_pcp = !ctl_rx_check_etype_pcp || (ETYPE == ctl_rx_etype_pcp);
assign opcode_match_pcp = !ctl_rx_check_opcode_pcp || ((OPCODE >= 
ctl_rx_opcode_min_pcp) && (OPCODE <= ctl_rx_opcode_max_pcp));
assign priority_control_packet = da_match_pcp && sa_match_pcp && etype_match_pcp && 
opcode_match_pcp && ctl_rx_enable_pcp;
assign control_packet = global_control_packet || priority_control_packet;

其中 DA 表示目标地址,SA 表示源地址,OPCODE 为操作代码 (opcode),而 ETYPE 则是从传入的包提取的“ethertype/length”(以太类型/长度)字段。

对于步骤 2,以下伪代码显示了检查功能:

assign da_match_gpp = (!ctl_rx_check_mcast_gpp && !ctl_rx_check_ucast_gpp) || ((DA 
== ctl_rx_pause_da_ucast) && ctl_rx_check_ucast_gpp) || ((DA == 48'h0180c2000001) && 
ctl_rx_check_mcast_gpp);
assign sa_match_gpp = !ctl_rx_check_sa_gpp || (SA == ctl_rx_pause_sa);
assign etype_match_gpp = !ctl_rx_check_etype_gpp || (ETYPE == ctl_rx_etype_gpp);
assign opcode_match_gpp = !ctl_rx_check_opcode_gpp || (OPCODE == ctl_rx_opcode_gpp);
assign global_pause_packet = da_match_gpp && sa_match_gpp && etype_match_gpp && 
opcode_match_gpp && ctl_rx_enable_gpp;

其中 DA 表示目标地址,SA 表示源地址,OPCODE 为操作代码 (opcode),而 ETYPE 则是从传入的包提取的“以太类型/长度 (ethertype/length)”字段。

对于步骤 3,以下伪代码显示了检查功能:

assign da_match_ppp = (!ctl_rx_check_mcast_ppp && !ctl_rx_check_ucast_ppp) || ((DA 
== ctl_rx_pause_da_ucast) && ctl_rx_check_ucast_ppp) || ((DA == 
ctl_rx_pause_da_mcast) && ctl_rx_check_mcast_ppp);
assign sa_match_ppp = !ctl_rx_check_sa_ppp || (SA == ctl_rx_pause_sa);
assign etype_match_ppp = !ctl_rx_check_etype_ppp || (ETYPE == ctl_rx_etype_ppp);
assign opcode_match_ppp = !ctl_rx_check_opcode_ppp || (OPCODE == ctl_rx_opcode_ppp);
assign priority_pause_packet = da_match_ppp && sa_match_ppp && etype_match_ppp && 
opcode_match_ppp && ctl_rx_enable_ppp;

其中 DA 表示目标地址,SA 表示源地址,OPCODE 为操作代码 (opcode),而 ETYPE 则是从传入的包提取的“以太类型/长度 (ethertype/length)”字段。

用户接口

将使用简单的握手协议来告知您,已使用 ctl_rx_pause_enable[8:0]stat_rx_pause_req[8:0]ctl_rx_pause_ack[8:0] 总线接收到暂停包。对于这些总线,位 [8] 对应于全局暂停包,位 [7:0] 对应于优先暂停包。

收到暂停包时,会发生以下步骤:

  1. 如果 ctl_rx_pause_enable[8:0] 的对应位为 0,那么将忽略暂停量并且该核保持处于步骤 1 不变。否则,stat_rx_pause_req[8:0] 总线的对应位将设置为 1,并且接收到的暂停量将加载到定时器中。

    如果当暂停处理处于步骤 2 或后续阶段时,ctl_rx_pause_enable[8:0] 的任一位设置为 0(即禁用),那么该核会照常完成这些步骤,然后返回步骤 1。

  2. 如果 ctl_rx_check_ack 输入为 1,该核会等待您将 ctl_rx_pause_ack[8:0] 总线的相应位设置为 1。
  3. 当您将 ctl_rx_pause_ack[8:0] 的适当位设置为 1 之后,或者如果 ctl_rx_check_ack 为 0,那么该核会开始对定时器进行倒计时。
  4. 当定时器超时时,该核会将 stat_rx_pause_req[8:0] 的相应位重新设置为 0。
  5. 如果 ctl_rx_check_ack 输入为 1,则当您将 ctl_rx_pause_ack[8:0] 的相应位重新设为 0 时,此操作即告完成。

    如果您不将 ctl_rx_pause_ack[8:0] 的相应位重新设为 0,那么该核会在 32 个时钟周期后将此操作视为完成。

下图中演示了上述步骤,每个步骤均显示在波形上。

图 1. RX 暂停接口示例

如果步骤 2 到 5 期间任意时间收到新的暂停包,那么定时器将加载新获取的暂停量值,并且此进程继续运行。

注释: 在“Pause”定时器中指定的时间段内,发射器 MAC 在接收到来自接收器的暂停帧时不应发射帧/包。