流量控制
流控初始化
在上电或者内部复位完之后,正常操作之前,需要对默认的虚通道 (Virtual Channel, 简称 VC) VC0 进行流控初始化 (initialize Flow Control)。此外,当有其它 VCs 被使能起来后,必须等到每一个 VC 流控初始化过程完成之后才可以使用。VC0 会早于其它 VCs 使能,必须等到 VC0 初始化完成之后,才可以发 TLP traffic。但是,当其它 VCs 在初始化的时候,可能会有 TLP traffic 在其它已经完成初始化的 VC 上。这种 traffic 对其它正在进行初始化过程的 VC 没有直接的影响。Shared Flow Control 在 Flit Mode 是使能的,在 Non-Flit mode 需要禁用。VC 初始化过程中,有两个状态 : FC_INIT1 和 FC_INIT2。
InitFC1, InitFC2 & UpdateFC DLLPs
InitFC1 格式如下 :

InitFC2 格式如下 :

UpdateFC 格式如下 :

针对 InitFC1, InitFC2 和 UpdateFC DLLPs
- HdrFC 字段表明 P/NP/CPL header credit 值
- DataFC 字段表明 P/NP/CPL data payload credit 值
- 当支持 Scaled Flow Control 时,HdrScale 字段表明 P/NP/CPL header credit 的缩放系数
- 当支持 Scaled Flow Control 时,DataScale 字段表明 P/NP/CPL data payload credit 的缩放系数
- 当 Scaled Flow Control 不支持,HdrScale 和 Datascale 字段是保留的
- 如果启用了 Scaled Flow Control,在所有传输的 InitFC1, InitFC2 和 UpdateFC DLLPs 中,HdrScale 和 Datascale 字段必须设置为 01b, 10b 或者 11b
- 发射机如果支持 Scaled Flow control 且启用了,并且针对某个 VC,收到的 InitFC1s 和 InitFC2s 中的 HdrScale 和 DataScale 是非零值,那么发射机发送的 UpdateFCs 中的 HdrScale 和 DataScale 允许是非零值。
- 在 Flit 模式中,除了 UpdataFC DLLP 外,还支持 Optimized_Updata_FC 机制,Optimized_Update_FCs 中不包含 HdrScale 和 DataScale 字段,所以发射机和接收机把 HdrFC 和 DataFC 字段视为初始化过程使用相应的 HdrScale 和 DataScale 字段建议的值
- 为了便于调试以及让调试工具(如逻辑分析仪)能够使用,设备必须每隔 10 us 发送至少一个 DLLP,每个 VC 中的 UpdateFC DLLP 都需包含 scaled credit 信息。
- 强烈建议在 “Optimized_Update_FC ”中,只要对应的 VC 可用的 credit 可供释放,发射器就应循环使用那些 credit 为有限且非零值的 VCs。
- 当初始化某个 VC 的 Flow Control 时,数据链路层需要发送这几种 DLLP
- 数据链路层在接收时会检查其完整性,如果检查无误,则 DLLP 的信息内容将传递至事务层。若检查失败,则该信息必须被丢弃。
- 注意:InitFC1 和 InitFC2 DLLP 仅用于 VC 初始化。
HarScale 和 DataScale 编码
| HdrScale 或者 DataScale 值 | 是否支持 Scaled Flow Control | Scaling Factor | HdrFC 域 | DataFC 域 |
|---|---|---|---|---|
| 00b | No | 1 | HdrFC[7:0] | DataFC[11:0] |
| 01b | Yes | 1 | HdrFC[7:0] | DataFC[11:0] |
| 10b | Yes | 4 | HdrFc[9:2] | DataFC[13:2] |
| 11b | Yes | 16 | HdrFC[11:4] | DataFC[15:4] |
流控初始化状态机
如果在对 VCs 1 至 7 进行初始化的过程中,任何时刻某个 VC 被禁用,那么针对该 VC 的流控初始化将被终止
FC_INIT1 状态
满足下面任意一个条件时,进入 FC_INIT1 状态:
- 当进入到
DL_INIT时 - 当软件使能 VCx (VC1-7) 时
FC_INIT1 状态行为
- 传输层必须阻止使用 VCx 的 TLP 传输
- 在 Non-Flit 模式时,针对 VCx,按照下列相对顺序发送 3 个 InitFC1 DLLP
- InitFC1-P (Dedicated – 专用,独享) (第一)
- InitFC1-NP (Dedicated) (第二)
- InitFC1-CPL (Dedicated) (第三)
- 在 Flit 模式时,针对 VCx,按照下面相对顺序发送 6 个 InitFC1 DLLP
- InitFC1-P (Dedicated) (第一)
- InitFC1-NP (Dedicated) (第二)
- InitFC1-CPL (Dedicated) (第三)
- InitFC1-P (Shared) (第四)
- InitFC1-NP (Shared) (第五)
- InitFC1-CPL (Shared) (第六)
- 至少每隔 34 us 发送 3(或者6) 个 InitFC1 DLLPs
- 34 us 不包含 LTSSM 在
Recovery或者Configuration的时间 - 强烈建议频繁重复执行 InitFC1 DLLP 传输操作,尤其是在没有其他 TLP 或 DLLP 可供传输的情况下。
- 34 us 不包含 LTSSM 在
当 DataFC 或者 HdrFC 是 0 时,DataScale 和 HdrScale 编码如下(Infinite.x 表示无限流控)
| 编码 | 模式 | 是否支持 Scaled FC (可缩放的流控机制) | DataScale/HdrScale |
|---|---|---|---|
| Infinite.1 | Non-Flit | 不支持 | 00b |
| 保留 | Non-Flit | 不支持 | 01b, 10b 或者 11b |
| Infinite.2 | Non-Flit | 支持 | 01b, 10b 或者 11b |
| 保留 | Non-Flit | 支持 | 00b |
| Infinite.3 | Flit | NA | 00b |
| zero | Flit | NA | 01b |
| Merged | Flit | NA | 10b |
| 保留 | Flit | NA | 11b |
Non-Flit 模式 InitFC1 和 InitFC2 中 DataFC, DataScale, HdrFC 和 HdrScale 配置表
| 支持 Scaled Flow Control 并且激活了 | Local and Remote Extended VC Count | Merged | InitFC 数量 | Dedicated/Shared | DataScale and HdrScale | DataFC and HdrFC | Notes |
|---|---|---|---|---|---|---|---|
| 否 | 0(保留) | 不适用 | 3 | 0(保留) | Infinite.1 (00b) | Infinite.1 (00b) | 1 |
| 否 | 0(保留) | 不适用 | 3 | 0(保留) | 00 | 不等于0 | 1 |
| 是 | 0(保留) | 不适用 | 3 | 0(保留) | Infinite.2 (01b, 10b 或 11b) | Infinite.2 (00b) | 1 |
| 是 | 0(保留) | 不适用 | 3 | 0(保留) | 01b/10b/11b | 不等于0 | 1,2 |
Dedicated/Shared 表明 credits 是独占的还是共享的, 比如是 Dedicated 的,则表示某一类 Traffic Class(TC)或 Virtual Channel(VC)拥有自己专用的 Credit,不与其他类型共享,即使 即使 VC0 的 Credit 用不完,也不能借给 VC1。Shared 表示:多个流量共享同一组 Credit Pool。
Notes :
- 1 : 向后兼容性:在本规范的早期版本中,DataScale 和 HdrScale 位被保留。
- 2 : 向后兼容性:在本规范的早期版本中,任何非零的 DataScale/HdrScale 均表示 Infinite.2
Flit 模式 DataFC, DataScale, HdrFC, HdrScale 配置表


Merged 一般表示:把多个 Credit 类型或多个 Channel 的 Credit 合并管理。
Note 的一些说明 :
- 3 : 由于 Extended VC 数量为 0,因此只能分配 1 个 VC 。 分配 0 个 dedicated credits,所有 credits 都是 Shared 的
- 4 : 由于 Extended VC 数量为 0,因此只能分配 1 个 VC。分配 0 个 NP dedicated credits,所有 NP credits 都是 shared
- 5 : 当 local 不为 0 且 Remote 为 0 时,第 3 行和第 4 行是推荐的,但是第 9 行和 第 10 行是允许的。
- 6 : Zero shared credits 表明分配额外的 shared credits。所有 shared credits 都是由其它 VCs 分配,并且由改 VC 使用。
当多个虚拟通道(VC)同时广播 shared credits,且其缩放因子为 01b、10b 或 11b 时,无论是哪个 VC,该缩放因子(scale factor)必须能够表示所有已分配的 shared credits。
例如,如果 VC0 和 VC1 都建议 120 header creids(总的是 240 个 credits),他们必须使用一个不等于 1 的缩放因子(01b),因为该缩放因子最多只能有 127 个 credits。
使用 Infinite.3 shared credits 必须在所有 VCs
- 7 : TODO
- 8 : 当 Local 不为 0 且 Remote 为 0 时,第 5 行到第 8 行是推荐的,但是第 11 行到 13 行是允许的。
- 9 : Shared / Dedicated 机制的定义使得 shared credits 成为常见情况。使用 dedicated credits 的 TLP 将采用 “Flit Mode Local TLP Prefix”,因此会额外消耗一个DW。在第3至第4行中,所有 credits 都是 shared 的。
- 10 : 为了防止死锁, P 和 CPL credits 禁止为 Zero
数据链路层不得阻塞其他传输,除非是为了确保需要达到所需频率的 InitFC1 DLLP
– 请注意,这包括所有由物理层发起的传输(例如 OS )、Ack和Nak DLLP(适用时),以及使用已完成初始化的 VC 的 TLP(适用时)。
处理接收到的 InitFC1 和 InitFC2 DLLPs 时:
- 记录下指示的 HdrFC 和 DataFC 值
- 如果接收机支持 Scaled Flow Control (可缩放的流控),记录下 HdrScale 和 DataScale 指示的值
- 对于 VCx,一旦 P,NP 和 CPL 的 FC unit 值已经记录下来,就必须设置 FI1 标识
- 在 Non-Flit 模式下,当记录了 3 个 dedicated FC unit 时,FI1 标识将被设置。
- 在 Flit 模式下,当记录了 6 个 FC unit 时,FI1 表示将被设置。
FC_INIT1 状态跳转
| 下一状态 | 跳转原因 |
|---|---|
| FC_INIT2 | FL1 标识置为 1,这表明 VCx 中的 N/NP/CPL 都记录了 FC unit 的值 |
FC_INIT2 状态
FC_INIT2 状态行为
- 传输层必须阻止使用 VCx 的 TLP 传输
- 在 Non-Flit 模式,按照下列相对顺序在 VCx 上发送 3 个 InitFC2 DLLP
- InitFC2-P (Dedicated) (第一)
- InitFC2-NP (Dedicated) (第二)
- InitFC2-Cpl (Dedicated) (第三)
- 在 Flit 模式,按照下列相对顺序在 VCx 上发送 6 个 InitFC2 DLLPs
- InitFC2-P (Dedicated) (第一)
- InitFC2-NP (Dedicated) (第二)
- InitFC2-Cpl (Dedicated) (第三)
- InitFC2-P (Shared) (第四)
- InitFC2-NP (Shared) (第五)
- InitFC2-Cpl (Shared) (第六)
- 至少每隔 34 us 发送 3(或者6) 个 InitFC2 DLLPs
- 34 us 不包含 LTSSM 在
Recovery或者Configuration的时间 - 强烈建议频繁重复执行 InitFC2 DLLP 传输操作,尤其是在没有其他 TLP 或 DLLP 可供传输的情况下。
- 数据链路层不得阻塞其他传输,除非是为了确保需要达到所需频率的 InitFC2 DLLP
- 请注意,这包括所有由物理层发起的传输(例如 OS )、Ack和Nak DLLP(适用时),以及使用已完成初始化的 VC 的 TLP(适用时)。
- 处理接收到的 InitFC1 和 InitFC2 DLLPs
- 忽略接收到的 HdrFC, HdrScale, DataFC 和 DataScale 的值
- VCx 受到任意一个 InitFC2 就需要设置 Fl2 标志
- 34 us 不包含 LTSSM 在
FC_INIT2 状态跳转
| 下一状态 | 跳转原因 |
|---|---|
| NA | 满足所有 1. FL2 标志为1 2. 如果链路支持 Scale Flow Control,针对 VCx,在所有的 UpdataFC DLLP 上必须发送 HdrScale 为 01b,DataScale 为 10b 或者 11b 3. 如果 Scale Flow Control 不支持或者链路上没有激活 Scaled Flow Control,在 VCx 上,在所有发送的 UpdataFC DLLP 中, HdrScale 和 DataSacle 都为 00 |
流控规则
感谢您的支持,请扫码打赏