docs: 发布非对称可靠串行传输规范 v0.6

This commit is contained in:
zhoushuang 2026-10-01 00:21:34 +08:00
parent 08c6cdd9b5
commit 3de4021553
1 changed files with 259 additions and 163 deletions

View File

@ -2,8 +2,8 @@
**Asymmetric Reliable Serial Transport Technical Specification**
**版本:V0.5**<br>
**日期:2026-09-30**<br>
**版本:V0.6**<br>
**日期:2026-10-01**<br>
**作者:周爽**
---
@ -12,7 +12,8 @@
| 版本 | 日期 | 说明 |
|---|---|---|
| V0.5 | 2026-09-30 | 明确链路重新训练期间的传输状态保持、恢复门控及主从状态机行为;统一`IDLE`和`CRC-32/MPEG-2`术语;修订数据协议边界、封装解析图、发送仲裁、`LEN`校验及帧内字计数规则。 |
| V0.6 | 2026-10-01 | 完善主从同步与重新训练状态机;明确重复`SYNC_RESET`、训练应答保护、同步确认和运行入口超时;补充`IDELAY`与`ODELAY`扫描状态机;统一200帧边界搜索与测量周期;修订完整UI环形窗口、`ALL_PASS`及最小通过窗口派生规则。 |
| V0.5 | 2026-09-30 | 明确链路重新训练期间的传输状态保持、恢复门控及主从状态机行为;统一`IDLE`和`CRC-32/MPEG-2`术语;修订数据协议边界、封装解析图、发送仲裁、`LEN`校验及帧内字计数规则;更新延迟配置就绪语义、`ODELAY`点间隔确认及运行入口`IDLE`握手。 |
| V0.4 | 2026-09-30 | 重构通信机制概述与总体架构,补充SEQ术语定义;明确规范核心覆盖数据链路层和传输协议层,将相位或延迟调节单元及其控制归入数据链路层的物理接口适配功能,并明确业务应用配置的可选属性。 |
| V0.3 | 2026-09-30 | 新增基于Transaction帧结构的典型业务应用配置,明确请求与响应封装、设备与通道路由、字节序及分片规则,并增加读写分片示意图。 |
| V0.2 | 2026-09-29 | 删除专用配置帧,将寄存器配置等业务统一纳入DATA载荷;统一术语和分层边界,完善拓扑、同步、重传、解析及帧布局图。 |
@ -379,7 +380,7 @@ R_{line}=N_M f_{M,parallel}=N_S f_{S,parallel}
187.5\text{ MHz}\times4=750\text{ Mbps}
\]
该配置中,一个UI约为1.333 ns。主端内部每个187.5 MHz周期处理4位,从端每个750 MHz周期处理1位,二者在线路上产生完全相同的750 Mbps比特流。
该配置中,一个UI约为1.333 ns。主端内部每个187.5 MHz周期处理4位,从端每个750 MHz周期处理1位,二者在线路上产生完全相同的750 Mbps比特流。若实现配置采用第23.2节建议的`MIN_PASS_WINDOW_RATIO=0.4`,则派生的`MIN_PASS_WINDOW_TIME`约为533.3 ps;该数值仅属于本750 Mbps典型配置。
### 7.4 其他配置的适配规则
@ -955,56 +956,63 @@ flowchart LR
sequenceDiagram
participant M as Master
participant S as Slave
Note over M,S: 时钟、PLL/MMCM、delay 控制器就绪
S-->>M: 连续 TRAIN
Note over M: 每个 IDELAY 最多检测 200 帧<br/>连续 50 个 TRAIN 正确则该点通过
loop 每个 DL ODELAY 测试点
M->>S: 持续 TRAIN,单点最多 200 帧时间
Note over S: 连续 50 个 TRAIN 正确后进入 ACK_ACTIVE
S-->>M: ACK_ACTIVE 期间持续 TRAIN_ACK
Note over M: 连续 10 个 TRAIN_ACK 则该点通过
M->>S: 4 帧时间 IDLE,终止 TRAIN_ACK
Note over M,S: 再排空 4 帧时间,随后切换 ODELAY
Note over M,S: 时钟、串行及延迟资源就绪
S-->>M: 持续TRAIN
Note over M: 每个IDELAY最多检测200帧<br/>连续50个TRAIN正确则该点通过
loop 每个DL ODELAY测试点
Note over M: 设置ODELAY并等待当前配置就绪
M->>S: 持续TRAIN,单点最多200帧时间
Note over S: 连续50个TRAIN正确后进入ACK_ACTIVE
S-->>M: ACK_ACTIVE期间持续TRAIN_ACK
Note over M: 连续10个TRAIN_ACK则该点通过
M->>S: 保持当前ODELAY,发送最多50个IDLE
Note over M: 忽略点间隔内全部TRAIN_ACK
S-->>M: 检测到IDLE后恢复持续TRAIN
Note over M: 收到最后一个ACK之后的首个完整TRAIN<br/>才允许切换ODELAY
end
Note over M: 选择并装载 DL 窗口中心
M->>S: 持续发送 SYNC
Note over S: 连续正确检测 10000 个 SYNC
S-->>M: 连续发送 20 个 SYNC_ACK
S-->>M: 随后持续发送 SYNC
Note over M: 连续 10 个 SYNC_ACK 后等待第一个 SYNC<br/>再连续正确检测 10000 个 SYNC
M->>S: 停止 SYNC,持续发送 IDLE
Note over S: 检测到合法 IDLE,停止 SYNC并进入 RUN
S-->>M: IDLE 或合法 UL 协议帧
Note over M: 确认 Slave进入 RUN,Master进入 RUN
Note over M: 选择并装载DL窗口中心,等待配置就绪
M->>S: 持续发送SYNC
Note over S: 连续正确检测10000个SYNC
S-->>M: 连续发送20个SYNC_ACK
S-->>M: 随后持续发送SYNC
Note over M: 连续10个SYNC_ACK后等待第一个SYNC<br/>再连续正确检测10000个SYNC
M->>S: 停止SYNC,持续发送IDLE
Note over S: 检测到首个合法IDLE后<br/>UL连续发送20个IDLE
S-->>M: 20个IDLE
Note over M: 检测到首个完整IDLE后进入M_RUN
```
设计原则:
1. 从端的时钟和串行资源有效后自动发送`TRAIN`,不等待控制命令;
2. 每个`IDELAY`点最多检测200个固定帧时间;连续正确检测50个`TRAIN`则该点通过,否则超时失败;
3. `UL`窗口中心装载后,主端扫描`DL` `ODELAY`;
4. 每个`ODELAY`点持续发送`TRAIN`,单点最多200个固定帧时间;
5. 从端连续正确检测50个`TRAIN`后锁存 `train_ack_active` 并持续发送`TRAIN_ACK`;本测试点内不再因后续`TRAIN`错误撤销,直到检测到主端发送的`IDLE`间隔;
6. 主端连续正确检测10个`TRAIN_ACK`则该`ODELAY`点立即通过,不必继续发送满200个`TRAIN`;
7. 每个`ODELAY`点结束后,主端保持当前`ODELAY`发送4个固定帧时间的`IDLE`,再用4个固定帧时间排空残余`TRAIN_ACK`;确认从端已停止ACK并恢复`TRAIN`后才切换`ODELAY`。异常时可延长,但总点间隔以16个固定帧时间为上限;
8. 主端得到两个方向的窗口中心后持续发送固定160位`SYNC`;
9. 从端连续正确检测10000个`SYNC`后,连续发送20个`SYNC_ACK`;
10. 从端发完20个`SYNC_ACK`后持续发送固定160位`SYNC`;
11. 主端连续正确检测10个`SYNC_ACK`后,忽略可能剩余的`SYNC_ACK`,检测到第一个`UL` `SYNC`后开始连续计数;
12. 主端连续正确检测10000个`UL` `SYNC`后停止发送`SYNC`并持续发送`IDLE`;
13. 从端检测到合法`IDLE`后停止发送`SYNC`、进入运行期,并发送`IDLE`或合法`UL`协议帧;
14. 主端检测到从端已经进入运行期后进入 `M_RUN`;
15. `SYNC`采用“持续发送、条件终止、超时失败”;不需要额外的“进入业务状态”控制命令。
2. 主端设置每个`IDELAY`后必须等待当前延迟配置就绪,再清除历史并开始该点测量;
3. 每个`IDELAY`点最多检测200个固定帧时间;连续正确检测50个`TRAIN`则该点通过,否则超时失败;
4. `UL`窗口中心装载且配置就绪后,主端扫描`DL` `ODELAY`;
5. 主端设置每个`ODELAY`后必须等待当前延迟配置就绪,再清除ACK历史并开始发送该点的`TRAIN`;
6. 每个`ODELAY`点持续发送`TRAIN`,单点最多200个固定帧时间;
7. 从端连续正确检测50个`TRAIN`后锁存`train_ack_active`并持续发送`TRAIN_ACK`;本测试点内不再因后续`TRAIN`错误撤销;
8. `train_ack_active`置位时启动300个固定帧时间的保护计时;检测到当前测试点的首个完整合法`IDLE`时正常结束,计满仍未检测到`IDLE`时则在当前`TRAIN_ACK`完整发送结束后清除ACK状态并恢复发送`TRAIN`;
9. 主端连续正确检测10个`TRAIN_ACK`则该`ODELAY`点立即通过,不必继续发送满200个`TRAIN`;
10. 每个`ODELAY`点结束后,主端保持当前`ODELAY`连续发送最多50个32位`IDLE`并忽略全部`TRAIN_ACK`;从端检测到首个合法`IDLE`后退出ACK状态并恢复发送`TRAIN`;
11. 对已经观察到`TRAIN_ACK`的测试点,主端只有在最后一个已观察`TRAIN_ACK`之后检测到首个完整`TRAIN`,才确认点间隔成功并切换`ODELAY`;发送满50个`IDLE`仍未满足该条件时判定点间隔失败,不得开始下一测试点;
12. 主端得到两个方向的窗口中心后持续发送固定160位`SYNC`;
13. 从端连续正确检测10000个`SYNC`后,连续发送20个`SYNC_ACK`,随后持续发送固定160位`SYNC`;
14. 主端连续正确检测10个`SYNC_ACK`后,忽略可能剩余的`SYNC_ACK`,检测到第一个`UL` `SYNC`后开始连续计数;
15. 主端连续正确检测10000个`UL` `SYNC`后停止发送`SYNC`并持续发送`IDLE`;
16. 从端检测到首个完整合法的`DL IDLE`后停止发送`SYNC`,使接收方向进入运行期解析,并在`UL`连续发送20个`IDLE`;
17. 主端检测到首个完整合法的`UL IDLE`后进入`M_RUN`并置位`link_sync_up`;剩余`IDLE`按正常空闲码字处理;
18. 主端随后通过`POLL_REQ`恢复传输状态;只有传输状态对齐完成后才置位`transport_ready`;
19. `SYNC`采用“持续发送、条件终止、超时失败”;不需要额外的“进入业务状态”控制帧。
步骤8和步骤10的`SYNC`持续发送均受超时保护:正常情况下由对端状态变化终止;超过规定时间仍未观察到终止条件,则本次同步失败并进入重新训练。长序列由连续重复固定160位`SYNC`帧构成,不改变单帧长度。
步骤11和步骤12中的`SYNC`持续发送均受超时保护:正常情况下由对端状态变化终止;超过规定时间仍未观察到终止条件,则本次同步失败并进入重新训练。长序列由连续重复固定160位`SYNC`帧构成,不改变单帧长度。
固定帧时间为 `160/LINE_RATE`。连续帧数量判据与线路速率无关,具体时间必须按所选物理配置换算。采用第7.3节的750 Mbps典型配置时,一个固定帧为213.333 ns;50帧约10.667 μs,200帧约42.667 μs,8帧点间隔约1.707 μs,10000帧`SYNC`约2.133 ms/方向,20帧`SYNC_ACK`约4.267 μs。
固定帧时间为`160/LINE_RATE`。连续帧数量判据与线路速率无关,具体时间必须按所选物理配置换算。采用第7.3节的750 Mbps典型配置时,一个固定帧为213.333 ns;50帧约10.667 μs,200帧约42.667 μs,10000帧`SYNC`约2.133 ms/方向,20帧`SYNC_ACK`约4.267 μs。50个32位`IDLE`为1600 bit,约2.133 μs;20个32位`IDLE`为640 bit,约0.853 μs。
## 19. 主端顶层状态机
### 19.1 状态图
外部硬件复位不作为同步状态。RTL复位只负责初始化状态寄存器、计数器和临时扫描结果,其中主端顶层状态初始化为 `M_WAIT_RESOURCE`。同步模块不产生全局复位请求。
外部硬件复位不作为同步状态。RTL复位只负责初始化状态寄存器、计数器和临时扫描结果,其中主端顶层状态初始化为`M_WAIT_RESOURCE`。同步模块不产生全局复位请求。
```mermaid
stateDiagram-v2
@ -1015,7 +1023,7 @@ stateDiagram-v2
M_RX_TRAIN --> M_RX_TRAIN: RX training failed
M_TX_TRAIN --> M_DL_CONFIRM: TX window found
M_TX_TRAIN --> M_TX_TRAIN: TX training failed and RX healthy
M_TX_TRAIN --> M_TX_TRAIN: TX training or point-gap failed and RX healthy
M_TX_TRAIN --> M_RX_TRAIN: RX lost during TX training
M_DL_CONFIRM --> M_UL_CONFIRM: SYNC_ACK confirmed
@ -1025,7 +1033,7 @@ stateDiagram-v2
M_UL_CONFIRM --> M_RUN_ENTRY: UL SYNC confirmed
M_UL_CONFIRM --> M_RX_TRAIN: UL SYNC timeout
M_RUN_ENTRY --> M_RUN: peer_run_confirmed
M_RUN_ENTRY --> M_RUN: first complete UL IDLE
M_RUN_ENTRY --> M_DL_CONFIRM: run_entry_timeout
M_RUN --> M_RX_TRAIN: UL synchronization lost
@ -1037,37 +1045,39 @@ stateDiagram-v2
| 状态 | 主要动作 | 离开条件 |
|---|---|---|
| `M_WAIT_RESOURCE` | 等待时钟、MMCM/PLL和延迟控制器可用;撤销 `link_sync_up` | 资源就绪 |
| `M_RX_TRAIN` | 执行第 21 章`IDELAY`扫描、`UL`窗口分析和中心点装载 | 找到合法窗口;失败时持续重试 |
| `M_TX_TRAIN` | 执行第 22 章`ODELAY`扫描、`DL`窗口分析和中心点装载 | 找到合法窗口;失败时持续重试 |
| `M_DL_CONFIRM` | `DL`持续发送`SYNC`;等待从端完成10000个`DL` `SYNC`检测并返回`SYNC_ACK` | 连续收到10个`SYNC_ACK`或超时 |
| `M_UL_CONFIRM` | `DL`继续持续发送`SYNC`;先忽略剩余`SYNC_ACK`,检测到首个`UL` `SYNC`后连续计数 | 连续收到10000个`SYNC`或超时 |
| `M_RUN_ENTRY` | 停止发送`SYNC`,持续发送`IDLE`;等待从端返回`IDLE`或合法`UL`帧 | 确认对端进入运行期或超时 |
| `M_RUN` | 发送`IDLE`/协议帧;执行第 25 章同步监测 | 失步、资源失效或从端返回`TRAIN` |
| `M_WAIT_RESOURCE` | 等待时钟、MMCM/PLL和延迟控制资源可用;撤销`link_sync_up` | 资源就绪 |
| `M_RX_TRAIN` | 执行第21章`IDELAY`扫描、`UL`窗口分析和中心点装载 | 找到合法窗口;失败时持续重试 |
| `M_TX_TRAIN` | 执行第22章`ODELAY`扫描、点间隔确认、`DL`窗口分析和中心点装载 | 找到合法窗口;失败时按UL健康状态选择重试范围 |
| `M_DL_CONFIRM` | `DL`持续发送`SYNC`;等待从端完成10000个`DL SYNC`检测并返回`SYNC_ACK` | 连续收到10个`SYNC_ACK`或超时 |
| `M_UL_CONFIRM` | `DL`继续持续发送`SYNC`;先忽略剩余`SYNC_ACK`,检测到首个`UL SYNC`后连续计数 | 连续收到10000个`SYNC`或超时 |
| `M_RUN_ENTRY` | 停止发送`SYNC`并持续发送`DL IDLE`;允许残余`UL SYNC`,等待首个完整`UL IDLE` | 收到首个完整`UL IDLE`或超时 |
| `M_RUN` | 发送`IDLE`或协议帧;执行第25章同步监测 | 失步、资源失效或从端返回`TRAIN` |
### 19.3 主端的确定性要求
- `UL`和`DL`扫描得到合法窗口后装载所选中心点,并直接进入下一同步阶段;
- 上电后先执行 `M_RX_TRAIN`,RX窗口建立后无条件进入 `M_TX_TRAIN`;
- 任何`UL`失效都返回 `M_RX_TRAIN`;RX重新训练成功后仍无条件执行完整TX训练;
- `M_DL_CONFIRM` 和 `M_UL_CONFIRM` 期间,主端均持续发送`SYNC`;
- `SYNC_ACK`只在 `M_DL_CONFIRM` 统计,必须连续正确收到10个;任一非`SYNC_ACK`固定帧使计数清零;
- 进入 `M_UL_CONFIRM` 后,主端允许继续收到从端尚未发送完的`SYNC_ACK`;这些剩余ACK不计为错误;
- `M_UL_CONFIRM` 检测到第一个完整`SYNC`时将`UL` `SYNC`连续计数置1;此后任一非`SYNC`固定帧使计数清零,重新等待下一个完整`SYNC`作为新序列起点;
- `M_RUN_ENTRY` 期间`DL`持续发送`IDLE`,不允许发送协议帧;
- `link_sync_up` 只在 `M_RUN` 有效;
- `UL`失步返回 `M_RX_TRAIN`,随后依次重新训练`UL`和`DL`;能够明确判断为`DL`单向异常时,直接返回 `M_TX_TRAIN`;
- 从运行期进入定向训练时,如果`DL`仍能发送固定帧,主端先发送完整`SYNC_RESET`,使从端进入 `S_TRAIN`;随后再开始`IDELAY`或`ODELAY`扫描;
- 公共时钟、MMCM/PLL或公共延迟资源异常时返回 `M_WAIT_RESOURCE`,资源恢复后依次重新训练`UL`和`DL`;
- `UL`和`DL`扫描得到合法窗口后装载所选中心点;只有当前延迟配置就绪后才能进入下一同步阶段;
- 上电后先执行`M_RX_TRAIN`,RX窗口建立后无条件进入`M_TX_TRAIN`;
- 任何`UL`失效都返回`M_RX_TRAIN`;RX重新训练成功后仍无条件执行完整TX训练;
- `M_DL_CONFIRM`和`M_UL_CONFIRM`期间,主端均持续发送`SYNC`;
- `SYNC_ACK`只在`M_DL_CONFIRM`统计,必须连续正确收到10个;任一非`SYNC_ACK`固定帧使计数清零;
- 进入`M_UL_CONFIRM`后,主端允许继续收到从端尚未发送完的`SYNC_ACK`;这些剩余ACK不计为错误;
- `M_UL_CONFIRM`检测到第一个完整`SYNC`时将`UL SYNC`连续计数置1;此后任一非`SYNC`固定帧使计数清零,重新等待下一个完整`SYNC`作为新序列起点;
- `M_RUN_ENTRY`期间`DL`持续发送`IDLE`,不允许发送协议帧;主端在已知边界完整匹配首个`UL IDLE`后立即进入`M_RUN`,不执行额外连续检测;
- 主端进入`M_RUN`后发送`POLL_REQ`;`link_sync_up`和`transport_ready`必须按第46章分别产生;
- `UL`失步返回`M_RX_TRAIN`,随后依次重新训练`UL`和`DL`;能够明确判断为`DL`单向异常时,直接返回`M_TX_TRAIN`;
- 点间隔发送满50个有效`IDLE`仍未收到完整`TRAIN`时,不得开始下一`ODELAY`点;UL仍可靠时重新执行完整DL训练,UL不可靠时重新训练UL和DL;
- 主端主动请求从运行状态进入链路重新训练时,如果`DL`仍具备传送完整固定帧的条件,应先连续发送20个`SYNC_RESET`;从端完整检测到其中任意一个后,清除当前训练上下文并进入`S_TRAIN`;主端发送完成后根据需要进入`M_TX_TRAIN`,或者进入`M_RX_TRAIN`并在`UL`恢复后继续执行`M_TX_TRAIN`;
- 从端因本地检测到`DL`失步而主动进入`S_TRAIN`时不依赖`SYNC_RESET`,而是直接清除当前训练上下文并持续发送`TRAIN`;
- 公共时钟、MMCM/PLL或公共延迟资源异常时返回`M_WAIT_RESOURCE`,资源恢复后依次重新训练`UL`和`DL`;
- 训练失败时停留在对应训练状态持续重试,重试计数仅用于诊断,不使状态机停止;
- 定向训练和双向确认期间保留传输协议层序号、累计 ACK状态和未确认帧缓存;
- 主端在 `M_RUN` 收到完整`TRAIN`,表示从端已因`DL`异常返回训练状态;若`UL`接收仍可靠,则直接进入 `M_TX_TRAIN`。
- 链路重新训练和双向确认期间保留传输协议层序号、累计ACK状态和未确认帧缓存;
- 主端在`M_RUN`收到完整`TRAIN`,表示从端已因`DL`异常返回训练状态;若`UL`接收仍可靠,则直接进入`M_TX_TRAIN`。
## 20. 从端顶层状态机
### 20.1 状态图
与主端相同,从端外部硬件复位不作为同步状态。RTL复位后将从端同步状态初始化为 `S_WAIT_RESOURCE`;同步模块自身只能在等待资源、训练、确认和运行状态之间转换。
与主端相同,从端外部硬件复位不作为同步状态。RTL复位后将从端同步状态初始化为`S_WAIT_RESOURCE`;同步模块自身只能在等待资源、训练、确认、运行入口和运行状态之间转换。
```mermaid
stateDiagram-v2
@ -1075,9 +1085,12 @@ stateDiagram-v2
S_WAIT_RESOURCE --> S_TRAIN: resources_ready
S_TRAIN --> S_SYNC_ACK_TX: 10000 DL SYNC received
S_SYNC_ACK_TX --> S_UL_SYNC_TX: 20 SYNC_ACK sent
S_UL_SYNC_TX --> S_RUN: legal run IDLE
S_UL_SYNC_TX --> S_RUN_ENTRY_IDLE_TX: first complete DL IDLE
S_RUN_ENTRY_IDLE_TX --> S_RUN: 20 UL IDLE sent
S_SYNC_ACK_TX --> S_TRAIN: sync timeout
S_UL_SYNC_TX --> S_TRAIN: sync timeout
S_UL_SYNC_TX --> S_TRAIN: 10500 frame timeout or DL sync lost
S_RUN_ENTRY_IDLE_TX --> S_TRAIN: sync_lost or sync_reset
S_RUN_ENTRY_IDLE_TX --> S_WAIT_RESOURCE: common resource lost
S_RUN --> S_TRAIN: sync_lost or sync_reset
S_RUN --> S_WAIT_RESOURCE: common resource lost
```
@ -1087,32 +1100,42 @@ stateDiagram-v2
| 状态 | `DL`接收行为 | `UL`发送行为 | 离开条件 |
|---|---|---|---|
| `S_WAIT_RESOURCE` | 清空固定帧检测历史,禁止普通帧提交 | 等待资源稳定 | 资源就绪 |
| `S_TRAIN` | 分别累计连续`TRAIN`和连续`SYNC`;`TRAIN`达到50后等待`IDLE`结束当前测试点 | 默认连续`TRAIN`;`train_ack_active` 有效时持续发送`TRAIN_ACK` | 连续收到10000个有效`SYNC` |
| `S_TRAIN` | 分别累计连续`TRAIN`和连续`SYNC`;`TRAIN`达到50后等待`IDLE`结束当前测试点 | 默认连续`TRAIN`;`train_ack_active`有效时持续发送`TRAIN_ACK` | 连续收到10000个有效`SYNC` |
| `S_SYNC_ACK_TX` | 继续检查`DL`是否保持`SYNC` | 连续发送20个`SYNC_ACK` | 20个发送完成或超时 |
| `S_UL_SYNC_TX` | 继续接收主端`SYNC`,检测合法`IDLE` | 持续发送`SYNC` | 收到合法运行入口`IDLE`或超时 |
| `S_RUN` | 解析普通帧并监测同步;处理`SYNC_RESET` | 无协议帧时发送`IDLE` | 失步、资源失效或`SYNC_RESET` |
| `S_UL_SYNC_TX` | 继续接收主端`SYNC`,检测首个完整合法`IDLE`;从进入本状态起累计固定帧时间 | 持续发送`SYNC` | 收到首个完整运行入口`IDLE`;达到10500个固定帧时间;或`DL`同步丢失 |
| `S_RUN_ENTRY_IDLE_TX` | 启用运行期接收解析;允许接收`POLL_REQ`并锁存待响应状态 | 连续发送20个`IDLE`,不得插入其他帧 | 完整发送20个`IDLE`;同步丢失;收到`SYNC_RESET`;或公共资源失效 |
| `S_RUN` | 解析普通帧并监测同步;处理`SYNC_RESET` | 优先发送待响应`CTRL`;无帧时发送`IDLE` | 失步、资源失效或`SYNC_RESET` |
### 20.3 `TRAIN_ACK`调度
从端在 `S_TRAIN` 中使用 `train_run_count` 和 `train_ack_active`:
从端在`S_TRAIN`中使用`train_run_count`和`train_ack_active`:
1. 默认在`UL`持续发送`TRAIN`;
2. 每完整接收一个正确`DL` `TRAIN`,`train_run_count` 加一;
3. `train_ack_active=0` 时,任一预期`TRAIN`不匹配使 `train_run_count` 清零;
4. `train_run_count` 达到50时置位 `train_ack_active`;
5. `train_ack_active=1` 时,`UL`在固定帧边界持续发送`TRAIN_ACK`;
6. `train_ack_active=1` 后,本测试点不再根据后续`TRAIN`正确与否撤销该标志;
7. 检测到主端在当前`ODELAY`下发送的合法`IDLE`间隔时,清除 `train_ack_active` 和 `train_run_count`,`UL`恢复发送`TRAIN`;
8. 从识别合法`IDLE`到最后一个残余`TRAIN_ACK`离开从端发送端的延迟必须有确定上界,并由点间排空时间覆盖;
9. 进入 `S_SYNC_ACK_TX`、`S_UL_SYNC_TX`、`S_RUN` 或重新开始训练时,清零`TRAIN`相关计数和活动标志。
2. 每完整接收一个正确`DL TRAIN`,`train_run_count`加一;
3. `train_ack_active=0`时,任一预期`TRAIN`不匹配使`train_run_count`清零;
4. `train_run_count`达到50时置位`train_ack_active`;
5. `train_ack_active=1`时,`UL`在固定帧边界持续发送`TRAIN_ACK`;
6. `train_ack_active=1`后,本测试点不再根据后续`TRAIN`正确与否撤销该标志;
7. `train_ack_active`从0变为1时启动`TRAIN_ACK_ACTIVE_TIMEOUT_FRAMES`计时;该计时按160位固定帧时间累计,固定为300,不因后续收到`TRAIN`或错误固定帧而重新开始;
8. 检测到主端在当前`ODELAY`下发送的首个完整合法`IDLE`时,正常结束保护计时并清除`train_ack_active`和`train_run_count`;已经开始发送的`TRAIN_ACK`必须完整发送结束,下一个完整帧恢复为`TRAIN`;
9. 计满300个固定帧时间仍未检测到完整合法`IDLE`时,必须完整发送结束当前`TRAIN_ACK`,随后清除保护计时、`train_ack_active`和`train_run_count`,保持在`S_TRAIN`并从下一个完整帧开始恢复发送`TRAIN`;该超时不触发全局重训练;
10. 如果第300个固定帧时间到期与完整合法`IDLE`检测在同一周期发生,`IDLE`检测优先,按正常测试点结束处理;
11. 进入`S_SYNC_ACK_TX`、`S_UL_SYNC_TX`、`S_RUN_ENTRY_IDLE_TX`、`S_RUN`或重新开始训练时,清零`TRAIN`相关计数、活动标志和保护计时;
12. 在任意非资源等待状态收到完整`SYNC_RESET`时,清除`train_ack_active`、保护计时和全部训练计数并进入`S_TRAIN`。
从端不需要知道主端当前使用的`ODELAY`值。每个测试点都必须重新累计50个连续正确`TRAIN`,上一点的累计结果不得沿用。
### 20.4 从端进入运行期
从端不依靠额外控制命令切换到运行期。它连续正确检测10000个`DL` `SYNC`后进入 `S_SYNC_ACK_TX`,连续发送20个`SYNC_ACK`;随后进入 `S_UL_SYNC_TX` 并持续发送`SYNC`。主端确认10000个`UL` `SYNC`后停止发送`SYNC`并持续发送`IDLE`;从端检测到规定数量的连续合法`IDLE`后进入 `S_RUN`,停止发送`SYNC`并发送`IDLE`或合法`UL`协议帧。
从端连续正确检测10000个`DL SYNC`后进入`S_SYNC_ACK_TX`,连续发送20个`SYNC_ACK`;随后进入`S_UL_SYNC_TX`并持续发送`SYNC`。主端确认10000个`UL SYNC`后停止发送`SYNC`并持续发送`DL IDLE`。
从端在 `S_SYNC_ACK_TX` 和 `S_UL_SYNC_TX` 中都要求`DL`继续出现合法`SYNC`;若在`IDLE`到来前连续异常达到规定门限,或阶段超时,则放弃本次确认并返回训练流程。
从端进入`S_UL_SYNC_TX`时启动`S_UL_SYNC_TIMEOUT_FRAMES`计时。该计时按160位固定帧时间累计,固定为10500;在计满前收到首个完整合法`DL IDLE`即正常结束。计满仍未收到`DL IDLE`,或者等待期间`DL SYNC`连续异常达到失步门限,均放弃本次确认并返回`S_TRAIN`。
从端在已知边界检测到首个完整合法`DL IDLE`后,使DL接收方向立即采用运行期解析规则、置位本端`link_sync_up`,并进入`S_RUN_ENTRY_IDLE_TX`。已经开始发送的`UL SYNC`必须完整结束;随后从端连续发送20个32位`IDLE`。这20个`IDLE`是运行入口响应,不用于重新验证链路质量。
从端发送20个`IDLE`期间可以接收并解析主端的`POLL_REQ`,但不得中断固定的20个`IDLE`发送序列;由该请求产生的状态响应先置为待发送,进入`S_RUN`后优先发送对应`CTRL`。业务应用层的UL发送请求在运行入口序列完成前不得上线。该状态不设置普通流程超时,状态转换以完整发送20个`IDLE`为准;同步丢失或收到`SYNC_RESET`时返回`S_TRAIN`,公共资源失效时进入`S_WAIT_RESOURCE`。
从端在`S_SYNC_ACK_TX`和`S_UL_SYNC_TX`中都要求`DL`继续出现合法`SYNC`;若在`IDLE`到来前连续异常达到规定门限,或`S_UL_SYNC_TX`达到10500个固定帧时间仍未收到完整合法`DL IDLE`,则放弃本次确认并返回训练流程。
## 21. 主端`UL` `IDELAY`扫描子状态机
@ -1120,85 +1143,131 @@ stateDiagram-v2
`UL`扫描在从端连续发送`TRAIN`时执行。主端改变对应接收链路的`IDELAY`,在每个延迟点搜索字边界并统计完整`TRAIN`匹配结果,得到采样通过窗口。
### 21.2 子状态
### 21.2 状态图与子状态
```mermaid
stateDiagram-v2
[*] --> RX_SET_DELAY
RX_SET_DELAY --> RX_WAIT_DELAY_READY: delay request accepted
RX_WAIT_DELAY_READY --> RX_CLEAR_HISTORY: rx_delay_ready
RX_CLEAR_HISTORY --> RX_SEARCH_AND_QUALIFY: start 200-frame timer
RX_SEARCH_AND_QUALIFY --> RX_RECORD: 50 consecutive TRAIN, pass
RX_SEARCH_AND_QUALIFY --> RX_RECORD: 200-frame timeout or point failure
RX_RECORD --> RX_NEXT_POINT: result recorded
RX_NEXT_POINT --> RX_SET_DELAY: more delay points
RX_NEXT_POINT --> RX_ANALYZE_WINDOW: scan complete
RX_ANALYZE_WINDOW --> RX_LOAD_CENTER: valid window found
RX_ANALYZE_WINDOW --> RX_SET_DELAY: no valid window, restart scan
RX_LOAD_CENTER --> [*]: center ready and alignment rebuilt
```
图中的结束节点表示`UL`扫描成功,控制权返回主端顶层状态机并进入`M_TX_TRAIN`。任一子状态下公共资源失效时,立即中止扫描并进入`M_WAIT_RESOURCE`;该全局异常转移未逐条画出。尚未记录的当前点不得写入扫描位图,已有扫描结果在重新训练时失效。
| 子状态 | 动作 | 转移条件 |
|---|---|---|
| `RX_SET_DELAY` | 写入当前`IDELAY`延迟档位 | 写命令接受后 |
| `RX_WAIT_SETTLE` | 等待延迟和接收流水线稳定 | `RX_DELAY_SETTLE_CYCLES` 到期 |
| `RX_CLEAR_HISTORY` | 清零比较历史、字对齐历史和当前点统计 | 下一拍 |
| `RX_SEARCH_ALIGNMENT` | 在允许的位滑移范围内搜索完整`TRAIN` | 找到候选边界或搜索超时 |
| `RX_MEASURE` | 在固定边界上连续检测`TRAIN`;维护连续正确计数和单点总计时 | 连续50个正确,或达到200个帧时间 |
| `RX_RECORD` | 按第 21.3 节记录通过/失败和错误数 | 下一拍 |
| `RX_SET_DELAY` | 请求设置当前`IDELAY`延迟档位 | 设置请求已被物理接口适配逻辑接受 |
| `RX_WAIT_DELAY_READY` | 等待当前延迟配置生效且接收路径可用于测量 | `rx_delay_ready=1` |
| `RX_CLEAR_HISTORY` | 清零比较历史、字对齐历史和当前点统计 | 下一拍启动200帧单点总计时 |
| `RX_SEARCH_AND_QUALIFY` | 在全部可能的位滑移和32位字边界中持续搜索完整`TRAIN`,并在当前候选边界维护连续正确计数和200帧单点总计时 | 任一候选边界连续正确50个`TRAIN`,或达到200个固定帧时间 |
| `RX_RECORD` | 按第21.3节记录通过、失败和错误数 | 下一拍 |
| `RX_NEXT_POINT` | 选择下一个延迟档位 | 仍有测试点则继续,否则分析 |
| `RX_ANALYZE_WINDOW` | 找最长连续通过区间并选择中心 | 有合法窗口或失败 |
| `RX_LOAD_CENTER` | 装载中心延迟档位,等待稳定并重新建立字边界 | 完成后进入`DL`扫描 |
| `RX_LOAD_CENTER` | 请求装载中心延迟档位,等待`rx_delay_ready`并重新建立字边界 | 完成后进入`DL`扫描 |
`rx_delay_ready`是抽象就绪条件,表示当前请求的`IDELAY`配置已经生效且接收路径可以开始有效测量。本规范不规定它由器件状态信号、固定等待周期、配置回读还是其他机制产生。就绪前不得启动200帧单点总计时、搜索候选边界、累计`TRAIN`、更新扫描位图或沿用旧字边界历史。资源全局就绪状态撤销时进入`M_WAIT_RESOURCE`,不得把该事件记录为普通失败点。
### 21.3 测试点判定
`IDELAY`用于调整串行数据的采样相位,位滑移或齿轮箱用于调整并行字的分组边界,两者属于相互独立的搜索维度。每个`IDELAY`测试点都必须清除旧边界历史,并在该点的200帧总计时内重新完成边界搜索和连续`TRAIN`判定。
每个`IDELAY`点的确定判据为:
- 改变`IDELAY`并等待稳定后,清零该点的`TRAIN`连续计数、200帧总计时和旧比较历史;
- 每完整匹配一个160位`TRAIN`,连续计数加一;
- 任一预期`TRAIN`不匹配,连续计数清零;
- 连续计数达到50时,该点立即判定通过;
- 从测量开始达到200个固定帧时间仍未出现连续50个正确`TRAIN`,该点判定失败;
- 测量期间发生字边界重新搜索、接收溢出或资源失效时,该点失败;
- 无法在 `RX_ALIGNMENT_SEARCH_LIMIT` 内找到候选边界时,该点失败。
- 请求改变`IDELAY`并确认`rx_delay_ready`后,清零该点的`TRAIN`连续计数、单点总计时、位滑移搜索历史和旧边界历史;
- 历史清除完成后立即启动200个固定帧时间的单点总计时;边界搜索和连续`TRAIN`判定共用该计时,不另设边界搜索超时;
- 计时期间持续遍历实现支持的全部位滑移位置和32位字边界候选位置;实现必须保证在200个固定帧时间内能够覆盖全部可能位置;
- 在某一候选位置完整匹配一个160位`TRAIN`时,将该位置作为当前候选边界并把连续计数置1;后续在同一候选边界每完整匹配一个`TRAIN`,连续计数加一;
- 当前候选边界上的预期`TRAIN`不匹配时,连续计数清零并继续执行边界搜索;旧候选不得阻止其他候选位置被检查;
- 任一候选边界的连续计数达到50时,该点立即判定通过,并将该边界作为当前点的有效接收边界;
- 单点总计时达到200个固定帧时间仍未出现连续50个正确`TRAIN`时,该点判定失败;
- 搜索和判定期间发生接收溢出时,该点失败。
公共资源失效不作为普通失败点记录,而是立即中止本轮扫描并使主端进入`M_WAIT_RESOURCE`。资源恢复后重新执行完整`UL`扫描。
50帧判据用于窗口扫描,不作为链路BER证明。最终选择的窗口中心还要通过双向各10000个连续`SYNC`完成同步确认。
### 21.4 字边界与延迟的关系
`IDELAY`调整位采样相位,位滑移/齿轮箱调整 4位并行字的分组边界。每次改变`IDELAY`后都必须清除旧比较历史。若器件特性可能使跨延迟档位的采样产生位滑移,应在每个点重新允许有限范围的字边界搜索。
## 22. 主端`DL` `ODELAY`扫描子状态机
### 22.1 目标
`UL`校准完成后,主端已能可靠接收`TRAIN_ACK`。每个`ODELAY`点持续发送`TRAIN`,最多测试200个固定帧时间;主端连续正确收到10个`TRAIN_ACK`时立即判定该点通过。`TRAIN_ACK`不携带延迟档位或轮次,因此相邻测试点之间必须使用明确的`TRAIN`中断和ACK排空间隔。
`UL`校准完成后,主端已能可靠接收`TRAIN_ACK`。每个`ODELAY`点持续发送`TRAIN`,最多测试200个固定帧时间;主端连续正确收到10个`TRAIN_ACK`时立即判定该点通过。`TRAIN_ACK`不携带延迟档位或轮次,因此每个测试点结束后必须用`IDLE`使从端退出ACK状态,并以从端恢复发送的首个完整`TRAIN`确认旧响应已经排空。
### 22.2 子状态
### 22.2 状态图与子状态
```mermaid
stateDiagram-v2
[*] --> TX_SET_DELAY
TX_SET_DELAY --> TX_WAIT_DELAY_READY: delay request accepted
TX_WAIT_DELAY_READY --> TX_CLEAR_ACK_COUNT: tx_delay_ready
TX_CLEAR_ACK_COUNT --> TX_SEND_TRAIN: ACK history cleared
TX_SEND_TRAIN --> TX_RECORD: 10 consecutive TRAIN_ACK
TX_SEND_TRAIN --> TX_RECORD: 200 frame timeout or point failure
TX_RECORD --> TX_POINT_GAP: result recorded
TX_POINT_GAP --> TX_NEXT_POINT: qualifying TRAIN received
TX_POINT_GAP --> TX_SET_DELAY: gap timeout and UL reliable
TX_POINT_GAP --> TX_TO_RX_TRAIN: gap timeout and UL unreliable
TX_NEXT_POINT --> TX_SET_DELAY: more delay points
TX_NEXT_POINT --> TX_ANALYZE_WINDOW: scan complete
TX_ANALYZE_WINDOW --> TX_LOAD_CENTER: valid window found
TX_ANALYZE_WINDOW --> TX_SET_DELAY: no valid window, restart scan
TX_LOAD_CENTER --> [*]: tx_delay_ready
state "返回 M_RX_TRAIN" as TX_TO_RX_TRAIN
```
图中的结束节点表示`DL`扫描成功,控制权返回主端顶层状态机并进入`M_DL_CONFIRM`。`TX_TO_RX_TRAIN`表示`UL`已不再可靠,必须退出本子状态机并重新训练`UL`和`DL`。任一子状态下公共资源失效时,立即中止扫描并进入`M_WAIT_RESOURCE`;该全局异常转移未逐条画出。
| 子状态 | 动作 | 转移条件 |
|---|---|---|
| `TX_SET_DELAY` | 写入当前`ODELAY`延迟档位 | 写命令接受后 |
| `TX_WAIT_SETTLE` | 等待延迟和发送流水线稳定 | `TX_DELAY_SETTLE_CYCLES` 到期 |
| `TX_CLEAR_ACK_COUNT` | 清除当前点 ACK 计数和旧固定帧事件 | 下一拍 |
| `TX_SEND_TRAIN` | 持续发送`TRAIN`,同时维护ACK连续计数和200帧单点计时 | 连续10个ACK,或单点超时 |
| `TX_RECORD` | 按第 22.3 节记录通过/失败 | 下一拍 |
| `TX_BREAK_TRAIN` | 保持当前`ODELAY`并连续发送`IDLE`,使从端退出ACK_ACTIVE | 4个固定帧时间到期 |
| `TX_DRAIN_ACK` | 继续发送`IDLE`并忽略全部`UL` `TRAIN_ACK`,排空残余响应 | 4个固定帧时间到期 |
| `TX_SET_DELAY` | 请求设置当前`ODELAY`延迟档位 | 设置请求已被物理接口适配逻辑接受 |
| `TX_WAIT_DELAY_READY` | 等待当前延迟配置生效且发送路径可用于测量 | `tx_delay_ready=1` |
| `TX_CLEAR_ACK_COUNT` | 清除当前点ACK计数和旧固定帧事件 | 下一拍 |
| `TX_SEND_TRAIN` | 持续发送`TRAIN`,维护ACK连续计数和200帧单点计时 | 连续10个ACK,或单点超时 |
| `TX_RECORD` | 按第22.3节记录通过或失败 | 下一拍 |
| `TX_POINT_GAP` | 保持当前`ODELAY`发送最多50个`IDLE`;忽略全部`TRAIN_ACK`并等待点间隔确认`TRAIN` | 收到最后一个已观察`TRAIN_ACK`之后的首个完整`TRAIN`,或50个`IDLE`发送完成 |
| `TX_NEXT_POINT` | 选择下一个延迟档位 | 仍有点则继续,否则分析 |
| `TX_ANALYZE_WINDOW` | 找最长连续通过区间并选择中心 | 有合法窗口或失败 |
| `TX_LOAD_CENTER` | 装载中心延迟档位并等待稳定 | 完成后进入双向`SYNC`确认 |
| `TX_LOAD_CENTER` | 请求装载中心延迟档位并等待`tx_delay_ready` | 就绪后进入双向`SYNC`确认 |
`tx_delay_ready`是抽象就绪条件,表示当前请求的`ODELAY`配置已经生效且发送路径可以开始有效测量。本规范不规定它由器件状态信号、固定等待周期、配置回读还是其他机制产生。延迟切换期间的线路输出不参与任何测试点判定;只有`tx_delay_ready=1`后才能清除旧ACK历史并开始新的`TRAIN`序列和200帧计时。资源全局就绪状态撤销时进入`M_WAIT_RESOURCE`。
### 22.3 测试点判定与应答归属
每个`ODELAY`点的确定判据为:
- 主端设置`ODELAY`、等待稳定并清除本地ACK检测历史;
- 主端持续发送`TRAIN`,并从第一个`TRAIN`开始计时;
- 从端连续正确检测50个`TRAIN`后进入 `train_ack_active`,持续发送`TRAIN_ACK`;
- 主端请求设置`ODELAY`,确认`tx_delay_ready`后清除本地ACK检测历史;
- 主端持续发送`TRAIN`,并从第一个完整`TRAIN`开始单点计时;
- 从端连续正确检测50个`TRAIN`后进入`train_ack_active`,持续发送`TRAIN_ACK`;
- 主端每完整匹配一个160位`TRAIN_ACK`,ACK连续计数加一;
- 任一非`TRAIN_ACK`固定帧使ACK连续计数清零;
- 主端连续正确收到10个`TRAIN_ACK`时,该点立即通过并停止发送`TRAIN`;
- 达到200个固定帧时间仍未得到连续10个`TRAIN_ACK`时,该点失败;
- `UL`失锁、接收溢出或物理资源失效时,该点失败。
- `UL`固定帧接收仍可靠但发生单点接收溢出时,该点失败;`UL`失锁时退出本子状态机并进入`M_RX_TRAIN`。
点结束后必须按以下顺序隔离:
公共资源失效不作为普通失败点记录,而是立即中止本轮扫描并使主端进入`M_WAIT_RESOURCE`。资源恢复后重新训练`UL`和`DL`。
1. 保持当前`ODELAY`,连续发送4个固定帧时间的`IDLE`,即20个32位`IDLE`字;
2. 从端检测到当前`ODELAY`下的合法`IDLE`后清除 `train_ack_active`;
3. 主端继续发送4个固定帧时间的`IDLE`,即另外20个`IDLE`字,并忽略此期间全部`TRAIN_ACK`;
4. 点间隔为8个固定帧时间,即 `1280/LINE_RATE`;采用第7.3节的750 Mbps典型配置时为320个187.5 MHz周期,约1.707 μs;
5. 基线排空结束时,主端应已停止收到`TRAIN_ACK`,并至少检测到一个从端恢复发送的完整`TRAIN`;
6. 若仍收到`TRAIN_ACK`或尚未检测到`TRAIN`,则继续发送`IDLE`并排空,但点间隔总长度不得超过16个固定帧时间;
7. 达到16个固定帧时间仍未确认ACK停止,判定点间隔失败,不得把后续ACK归入下一`ODELAY`点;
8. 点间隔确认成功后设置下一个`ODELAY`,并额外等待 `TX_DELAY_SETTLE_CYCLES`;
9. 清除ACK历史后才开始下一点`TRAIN`。
每个测试点结束后,无论该点通过还是失败,都必须按以下顺序隔离:
上述4+4帧是正常基线,总上限16帧用于处理额外流水线延迟。从端从识别`IDLE`到最后一个残余`TRAIN_ACK`离开发送端的延迟必须有确定上界。若实现后的最坏延迟超过16帧预算,必须修改 `TX_POINT_GAP_MAX_FRAMES` 并重新验证,不能让主端带着未清除的ACK历史进入下一测试点。
1. 保持当前`ODELAY`不变,连续发送32位`IDLE`,最多发送`TX_POINT_GAP_MAX_IDLE_WORDS=50`个;
2. 每完成发送一个完整`IDLE`,点间隔计数加一;尚未完整发送的码字不得计数;
3. 点间隔期间忽略全部`TRAIN_ACK`,不得将其计入当前点或下一点;
4. 从端检测到首个完整合法`IDLE`后清除`train_ack_active`;已经开始的`TRAIN_ACK`必须完整发送结束,下一个完整帧恢复为`TRAIN`;
5. 如果本测试点曾收到完整`TRAIN_ACK`,则主端只接受最后一个已观察`TRAIN_ACK`之后的首个完整合法`TRAIN`作为点间隔确认;由于`UL`串行流保持顺序,早于该`TRAIN`发送的旧`TRAIN_ACK`不可能随后到达。如果本测试点从未收到完整`TRAIN_ACK`,收到完整`TRAIN`表示从端仍处于默认训练发送状态;
6. 点间隔成功后,主端继续请求发送`IDLE`,选择下一个`ODELAY`并等待`tx_delay_ready`;切换期间的输出不参与同步判断;
7. 新延迟配置就绪后清除全部ACK检测历史,随后开始下一点`TRAIN`;
8. 发送满50个完整`IDLE`仍未收到满足第5项条件的完整`TRAIN`时,判定`TX_POINT_GAP_TIMEOUT`,不得开始下一测试点,也不得保留当前DL扫描结果作为最终窗口依据;
9. `TX_POINT_GAP_TIMEOUT`发生时,若UL固定帧接收仍可靠,则重新执行完整DL训练;若UL也不再可靠,则先重新训练UL再训练DL;公共资源失效时进入`M_WAIT_RESOURCE`。
50个`IDLE`是点间隔最大长度,不是链路质量检测序列。采用第7.3节的750 Mbps典型配置时,50个32位`IDLE`共1600 bit,约2.133 μs。主端必须以收到完整`TRAIN`作为成功条件,不得以“当前周期没有收到`TRAIN_ACK`”作为旧响应已经排空的依据。
## 23. 通过窗口与中心点选择
@ -1206,35 +1275,58 @@ stateDiagram-v2
每个扫描点产生一个 `pass[i]`。主端:
1. 找出所有连续的通过区间;
2. 选择长度最大的区间;
3. 多个区间等长时,选择最接近标称延迟档位的区间;
4. 仍相同时选择延迟档位编号较小的区间;
5. 偶数点窗口有两个中心点时,选择更接近标称延迟档位者,仍相同则取较小延迟档位;
6. 装载中心点;`UL`中心点随后用于接收`TRAIN_ACK`和`UL` `SYNC`,`DL`中心点随后用于发送`TRAIN`和`DL` `SYNC`。
1. 若全部扫描点均通过,按第23.2节的`ALL_PASS`规则处理,不执行基于失败边界的中心点计算;
2. 否则按照实现配置采用环形或线性窗口算法找出全部连续通过区间;环形算法必须先合并跨越最小和最大延迟档位的同一窗口;
3. 选择长度最大的区间;
4. 多个区间等长时,选择最接近标称延迟档位的区间;
5. 仍相同时选择延迟档位编号较小的区间;
6. 偶数点窗口有两个中心点时,选择更接近标称延迟档位者,仍相同则取较小延迟档位;
7. 装载所选点;`UL`所选点随后用于接收`TRAIN_ACK`和`UL` `SYNC`,`DL`所选点随后用于发送`TRAIN`和`DL` `SYNC`。
### 23.2 最小窗口判据
有效窗口必须同时满足:
- 连续通过点数不小于 `MIN_PASS_TAPS`;
- 换算时间宽度不小于 `MIN_PASS_WINDOW_TIME`;
- 中心点到左右失败边界均留有规定余量;
- 窗口未在扫描范围边界被截断。
- 对于`UL`窗口,连续通过点数不小于派生值`RX_MIN_PASS_TAPS`;对于`DL`窗口,连续通过点数不小于派生值`TX_MIN_PASS_TAPS`;
- 按实际延迟值换算的首尾通过采样点时间跨度不小于派生值`MIN_PASS_WINDOW_TIME`;
- 除`ALL_PASS`外,所选中心点到左右失败边界均留有实现配置规定的余量;
- 采用线性窗口算法时,窗口未在扫描范围边界被截断;采用环形窗口算法时,跨越最小和最大延迟档位的通过段已正确合并。
通过区间触及最小或最大延迟档位表示可能未观察到真实眼图边界。必须扩大粗相位/扫描范围后重扫,或判定校准不完整。
延迟扫描的实际有效范围必须覆盖至少一个完整UI。若采用环形窗口算法,最小和最大延迟档位在相位上视为相邻,跨越扫描数组边界的通过区间必须合并分析;通过区间触及扫描边界本身不表示校准不完整。若采用线性窗口算法,则必须通过调整粗相位把完整窗口移入线性扫描范围;只有在线性扫描未观察到通过窗口两侧边界,或者实际有效扫描范围小于1 UI时,才需要调整粗相位、扩大扫描范围或判定校准不完整。
项目初始目标可取:
若全部扫描点均通过,则将该方向的扫描结果记录为`ALL_PASS`。`ALL_PASS`不表示扫描范围不足,但由于没有观察到失败边界,不能根据本次扫描推断真实眼图中心。实现必须按照实现配置选择确定的标称延迟点,继续执行双向10000帧`SYNC`确认,并通过时序预算证明所选点具有足够裕量;如果实现要求根据实测边界选择中心,则必须提高扫描分辨率或采用其他边界测量方法。
`MIN_PASS_WINDOW_RATIO`是由设备设计者在RTL集成前根据抖动、建立保持时间、PVT漂移和目标时序裕量确定的实现配置值,不属于运行期可任意修改的参数。建议基线为:
\[
MIN\_PASS\_WINDOW\_TIME \ge 0.4UI \approx 533.3\ \text{ps}
MIN\_PASS\_WINDOW\_RATIO = 0.4
\]
该值是工程起点,不替代正式时序预算。
该建议值是工程起点,不替代正式时序预算。最小窗口时间必须根据实际线路速率派生:
\[
UI=\frac{1}{LINE\_RATE}
\]
\[
MIN\_PASS\_WINDOW\_TIME=MIN\_PASS\_WINDOW\_RATIO\times UI
\]
`MIN_PASS_WINDOW_TIME`不得作为与比例无关的第二个配置值。若扫描步进均匀,连续通过点数要求分别派生为:
\[
RX\_MIN\_PASS\_TAPS=\left\lceil\frac{MIN\_PASS\_WINDOW\_TIME}{RX\_DELAY\_STEP\_TIME}\right\rceil+1
\]
\[
TX\_MIN\_PASS\_TAPS=\left\lceil\frac{MIN\_PASS\_WINDOW\_TIME}{TX\_DELAY\_STEP\_TIME}\right\rceil+1
\]
加1是因为连续通过`N`个等间隔采样点时,首尾采样点之间只有`N-1`个延迟间隔。若延迟步进不均匀,必须使用物理实现提供的实际延迟映射计算首尾通过点的时间跨度;上述等步进公式仅用于得到保守的点数下限。
### 23.3 跨延迟档位回卷
若延迟形成周期性相位空间,RTL 必须明确选择环形位图算法,或先用粗相位把眼图移到线性扫描范围内部。两种方法只能选择一种并写入集成参数。
若延迟形成周期性相位空间,RTL必须明确选择以下一种窗口分析方法并写入实现配置:采用环形位图算法,将最小和最大延迟档位视为相邻并合并跨边界窗口;或者采用线性位图算法,通过粗相位调整把完整通过窗口移入线性扫描范围。两种方法的实际有效扫描范围都必须覆盖至少一个完整UI。
## 24. 帧边界建立与正常解析
@ -1373,7 +1465,7 @@ stateDiagram-v2
- 从端通过`TRAIN`报告`DL`失步,或`DL`确认超时且`UL`仍可靠:主端直接进入 `M_TX_TRAIN`;
- TX训练期间`UL`也失去可靠接收:返回 `M_RX_TRAIN`,随后重新训练RX和TX;
- 参考时钟异常、MMCM/PLL失锁或公共延迟资源异常:进入 `M_WAIT_RESOURCE`,资源恢复后重新训练RX和TX;
- 从端收到完整`SYNC_RESET`:进入 `S_TRAIN`,持续发送`TRAIN`;
- 从端在任意非资源等待状态收到完整`SYNC_RESET`:清除`train_ack_active`和训练计数,进入`S_TRAIN`并持续发送`TRAIN`;
- 双向确认阶段失败:根据仍然可靠的方向返回 `M_RX_TRAIN`、`M_TX_TRAIN`,或者只重新执行确认阶段。
训练失败时状态机持续执行相应训练,不因重试次数达到某个值而停止。重试计数只用于诊断。单个 CRC错误、合法帧的内容错误或上层丢包不触发物理重训。
@ -1427,45 +1519,49 @@ stateDiagram-v2
### 26.3 `SYNC_RESET`
`SYNC_RESET`是主端请求从端返回训练状态的固定帧。它不触发从端全局复位,也不清除传输状态。从端必须完整匹配160位后进入 `S_TRAIN`。若`DL`已严重失步而无法识别`SYNC_RESET`,从端的运行期监测仍应检测到边界异常并自行进入 `S_TRAIN`。
`SYNC_RESET`是主端主动请求从端返回训练状态的固定帧。它不触发从端全局复位,也不清除传输状态。主端主动发起链路重新训练且`DL`仍具备传送完整固定帧的条件时,必须连续发送20个`SYNC_RESET`;发送期间收到的`TRAIN`不作为提前终止条件。逐帧重复发送是幂等操作:从端在任意非资源等待状态完整匹配其中任意一个160位`SYNC_RESET`后,清除`train_ack_active`及固定帧检测历史并进入或保持`S_TRAIN`。主端发送完成后再进入相应训练状态。若`DL`已严重失步而无法识别全部`SYNC_RESET`,从端的运行期监测仍应检测到边界异常并自行进入`S_TRAIN`。从端因本地检测到`DL`失步而自行进入`S_TRAIN`时,不要求先收到`SYNC_RESET`。
## 27. 同步机制配置参数
所有参数必须在 RTL 集成前给出确定值并纳入版本控制。
所有参数必须在RTL集成前给出确定值并纳入版本控制。
| 参数 | 单位 | 约束/来源 |
|---|---:|---|
| `RX_DELAY_MIN/MAX/STEP` | 延迟档位 | `IDELAY`范围和分辨率 |
| `TX_DELAY_MIN/MAX/STEP` | 延迟档位 | `ODELAY`范围和分辨率 |
| `RX_DELAY_SETTLE_CYCLES` | 时钟周期 | 器件稳定时间 + RX 流水线清空 |
| `TX_DELAY_SETTLE_CYCLES` | 时钟周期 | 器件稳定时间 + TX 流水线清空 |
| `RX_ALIGNMENT_SEARCH_LIMIT` | 候选位置 | 覆盖所有位滑移相位 |
| `RX_DELAY_STEP_TIME` | ps/扫描步进 | 相邻`UL`扫描点的实际接收延迟差;由物理实现配置或校准数据给出 |
| `TX_DELAY_STEP_TIME` | ps/扫描步进 | 相邻`DL`扫描点的实际发送延迟差;由物理实现配置或校准数据给出 |
| `ALIGN_CONFIRM_FRAMES` | 帧 | 按假锁概率确定 |
| `UL_TRAIN_PASS_COUNT` | 帧 | 固定为50个连续正确`TRAIN` |
| `UL_POINT_TIMEOUT_FRAMES` | 帧时间 | 固定为200;到期未通过则该`IDELAY`点失败 |
| `DL_TRAIN_QUALIFY_COUNT` | 帧 | 固定为50;从端达到后持续发送`TRAIN_ACK` |
| `DL_ACK_PASS_COUNT` | 帧 | 固定为10个连续正确`TRAIN_ACK` |
| `DL_POINT_TIMEOUT_FRAMES` | 帧时间 | 固定为200;到期未通过则该`ODELAY`点失败 |
| `TX_TRAIN_BREAK_FRAMES` | 固定帧时间 | 固定为4;保持当前`ODELAY`发送`IDLE`并终止`TRAIN_ACK` |
| `TX_ACK_DRAIN_FRAMES` | 固定帧时间 | 基线值为4;必须覆盖残余`TRAIN_ACK`最坏延迟 |
| `TX_POINT_GAP_MAX_FRAMES` | 固定帧时间 | 固定基线为16;超过仍未确认ACK停止则点间隔失败 |
| `MIN_PASS_TAPS` | 延迟档位 | 由最小眼宽和延迟档位步进推导 |
| `MIN_PASS_WINDOW_TIME` | ps | 由时序预算确定 |
| `TRAIN_ACK_ACTIVE_TIMEOUT_FRAMES` | 固定帧时间 | 固定为300;从端置位`train_ack_active`后等待当前测试点首个完整合法`IDLE`的上限 |
| `TX_POINT_GAP_MAX_IDLE_WORDS` | 32位字 | 固定为50;超过仍未收到完整`TRAIN`则点间隔失败 |
| `MIN_PASS_WINDOW_RATIO` | 无量纲(UI比例) | 实现配置值;建议基线为0.4,必须由目标时序预算确认,不允许运行期任意修改 |
| `MIN_PASS_WINDOW_TIME` | ps | 派生值:`MIN_PASS_WINDOW_RATIO × UI`,不得独立配置 |
| `RX_MIN_PASS_TAPS` | 延迟档位 | 派生值:均匀步进时为`ceil(MIN_PASS_WINDOW_TIME / RX_DELAY_STEP_TIME) + 1` |
| `TX_MIN_PASS_TAPS` | 延迟档位 | 派生值:均匀步进时为`ceil(MIN_PASS_WINDOW_TIME / TX_DELAY_STEP_TIME) + 1` |
| `DL_SYNC_PASS_COUNT` | 帧 | 固定为10000个连续正确`SYNC` |
| `SYNC_ACK_TX_COUNT` | 帧 | 固定为20;从端定量发送 |
| `SYNC_ACK_PASS_COUNT` | 帧 | 固定为10个连续正确`SYNC_ACK` |
| `UL_SYNC_PASS_COUNT` | 帧 | 固定为10000个连续正确`SYNC` |
| `SYNC_PHASE_TIMEOUT_FRAMES` | 帧时间 | 必须大于10000并覆盖检测、切换和流水线余量 |
| `RUN_ENTRY_DL_IDLE_WORDS` | 32位字 | 从端进入`RUN`所需的连续`DL` `IDLE`数 |
| `RUN_ENTRY_UL_IDLE_WORDS` | 32位字 | 主端确认从端进入`RUN`所需的连续`UL` `IDLE`数 |
| `RUN_ENTRY_TIMEOUT` | 时钟周期 | 主端和从端完成`RUN`入口握手的最长时间 |
| `S_UL_SYNC_TIMEOUT_FRAMES` | 固定帧时间 | 固定为10500;从端进入`S_UL_SYNC_TX`后等待首个完整合法`DL IDLE`的上限 |
| `SYNC_RESET_TX_COUNT` | 帧 | 固定为20;主端主动发起链路重新训练时连续发送 |
| `RUN_ENTRY_IDLE_TX_WORDS` | 32位字 | 固定为20;从端运行入口响应长度 |
| `RUN_ENTRY_IDLE_PASS_WORDS` | 32位字 | 固定为1;主端收到首个完整`UL IDLE`即通过 |
| `RUN_ENTRY_TIMEOUT` | 时钟周期 | 主端在`M_RUN_ENTRY`中等待首个完整`UL IDLE`的最长时间;从端发送20个`UL IDLE`不使用此超时 |
| `RECOVERY_IDLE_WORDS` | 32位字 | 边界恢复所需连续`IDLE`数 |
| `RECOVERY_CONFIRM_FRAMES` | 帧 | 普通帧恢复确认数 |
| `RECOVERY_SEARCH_LIMIT` | 位/时钟周期 | 超过后触发重训 |
| `RECOVERY_SEARCH_LIMIT` | 位或时钟周期 | 超过后触发重训 |
本表中的50、200、10、10000和20为本规范固定基线。延迟稳定周期、ACK排空时间和各阶段总超时仍须依据目标器件及实际流水线验证;若实测最坏延迟超过基线排空预算,必须增大相应时间参数。
每次设置`IDELAY`或`ODELAY`后,数据链路层必须分别等待抽象条件`rx_delay_ready`或`tx_delay_ready`有效。本规范只约束“当前延迟配置就绪后才能开始测量”,不规定通过固定等待周期、器件状态信号、配置回读还是其他方法确认就绪。因此,通用参数表不规定统一的延迟稳定周期;具体物理实现可以在第7章配置声明中说明其就绪生成方法。
计数器按包含终值设计时,50计数至少6位,200计数至少8位,10计数至少4位,20计数至少5位,10000计数至少14位,16帧点间隔计数至少5位。所有连续计数器达到终值后应饱和或立即触发状态转换,不允许回卷。
本表中的50、200、300、10、10000、10500、20和1为本规范固定基线。除已明确固定的`TRAIN_ACK_ACTIVE_TIMEOUT_FRAMES`和`S_UL_SYNC_TIMEOUT_FRAMES`外,各阶段总超时仍须依据目标器件、线路速率及实际流水线验证。
计数器按包含终值设计时,50计数至少6位,200计数至少8位,300计数至少9位,10计数至少4位,20计数至少5位,10000和10500计数至少14位。所有连续计数器达到终值后应饱和或立即触发状态转换,不允许回卷。
# 第五篇非对称可靠传输与重传机制
@ -3312,12 +3408,12 @@ master_transport_ready = link_sync_up && (MASTER_STATE == M_RUN)
5. `IDELAY`点连续49个`TRAIN`后出现错误时计数清零,连续50个时立即通过,200帧到期时失败;
6. 从端在连续50个`DL` `TRAIN`后锁存`TRAIN_ACK`发送状态,并只由合法`IDLE`点间隔解除;
7. `ODELAY`点连续9个`TRAIN_ACK`后出现非ACK固定帧时计数清零,连续10个时立即通过,200帧到期时失败;
8. 4帧`TRAIN`中断、4帧ACK排空以及最多16帧点间隔能够隔离迟到`TRAIN_ACK`;
8. 每个`ODELAY`点结束后发送最多50个`IDLE`、忽略残余`TRAIN_ACK`,并只以首个完整`TRAIN`确认点间隔成功;50个`IDLE`超时不得进入下一测试点;
9. 从端的`DL` `SYNC`连续计数在9999后出现错误时清零,连续10000个时通过;
10. 从端精确发送20个`SYNC_ACK`,主端连续10个时通过;
11. 主端进入`UL`确认后忽略剩余`SYNC_ACK`,并从第一个完整`SYNC`开始累计10000个连续`SYNC`;
12. 主端和从端的`SYNC`均由状态条件终止,并能由超时退出;
13. 主端以`IDLE`结束同步,从端停止`SYNC`并返回`IDLE`,双方自动进入`RUN`;
13. 主端以`DL IDLE`结束同步;从端收到首个完整`DL IDLE`后连续发送20个`UL IDLE`,主端收到首个完整`UL IDLE`后进入`M_RUN`;
14. 载荷中出现全部`SOF`/`IDLE`图样时不误分帧;
15. CRC错误且长度合法时保持边界;
16. 长度非法、位滑移、FIFO溢出时进入恢复;
@ -3336,7 +3432,7 @@ master_transport_ready = link_sync_up && (MASTER_STATE == M_RUN)
### 48.2 门级、时序与板级验证
- 对所选物理配置的SERDES时钟、串行采样时钟、并行时钟和所有CDC路径完成静态时序检查;第7.3节典型配置对应375 MHz DDR与750 MHz SDR;
- 验证延迟控制时序;
- 验证每次设置`IDELAY`或`ODELAY`后,只有对应延迟配置就绪条件有效才开始测量;验证就绪丢失时进入资源恢复而不记录普通失败点;
- 在工艺、电压、温度角落记录窗口宽度和中心漂移;
- 在最长线、最差连接器和最大同时翻转条件下测量;
- 验证 AC 耦合基线漂移和终端匹配;
@ -3351,7 +3447,7 @@ master_transport_ready = link_sync_up && (MASTER_STATE == M_RUN)
- `UL`和`DL`窗口中心均已装载;
- 从端连续正确检测10000个`DL` `SYNC`,主端连续正确检测10个`SYNC_ACK`;
- 从端精确发送20个`SYNC_ACK`后持续发送`SYNC`,主端连续正确检测10000个`UL` `SYNC`;
- 运行入口的`DL`和`UL` `IDLE`被双方正确识别;
- 从端识别首个完整`DL IDLE`后精确发送20个`UL IDLE`,主端识别首个完整`UL IDLE`后进入`M_RUN`;
- `link_sync_up` 稳定;
- 初始协议`POLL_REQ`/ACK 完成后,传输协议层声明 `transport_ready`。
@ -3361,13 +3457,13 @@ master_transport_ready = link_sync_up && (MASTER_STATE == M_RUN)
本方案将复杂性集中在主端:主端负责两个方向的延迟扫描、窗口分析、中心选择、同步确认和运行期恢复;从端只需使用所选物理配置规定的固定收发结构,并完成固定帧比较、`TRAIN_ACK`/`SYNC_ACK`生成、普通帧解析和同步监测;第7.3节典型配置使用750 MHz SDR。
正常上电顺序固定为“从端连续`TRAIN` → 主端校准`UL` → 主端校准`DL` → 主端持续`SYNC` → 从端定量`SYNC_ACK`并持续`SYNC` → 主端持续`IDLE` → 双方`RUN`”。运行期通过确定边界上的`IDLE`/`SOF`、帧内长度计数和帧尾 CRC完成持续监测;内容错误与边界失步分开处理。发生物理失步时执行重训并保留传输协议状态。
正常上电顺序固定为“从端连续`TRAIN` → 主端校准`UL` → 主端以最多50个`IDLE`隔离相邻`ODELAY`点并校准`DL` → 主端持续`SYNC` → 从端定量发送`SYNC_ACK`并持续发送`SYNC` → 主端持续发送`DL IDLE` → 从端发送20个`UL IDLE` → 主端收到首个`UL IDLE`后进入`M_RUN`”。运行期通过确定边界上的`IDLE`或`SOF`、帧内长度计数和帧尾CRC完成持续监测;内容错误与边界失步分开处理。发生物理失步时执行重训并保留传输协议状态。
## 附录A:互操作实现声明清单
每个符合本规范的设备或IP至少应提供以下声明:
1. 本规范版本:V0.5;
1. 本规范版本:V0.6;
2. 主端或从端角色;
3. 采用的物理承载、时钟与链路实现配置及第7章全部参数;
4. 最大`DATA`载荷;