当前位置: 首页 > news >正文

【PCIe 验证每日学习・Day13】DLLP 与 ACK/NAK 重传机制基础验证

大家好,继续我们「PCIe 验证每日学习・30 分钟打卡」系列。今天进入数据链路层核心:DLLP 帧结构、ACK/NAK 应答机制与重传验证。内容严格遵循 PCIe 规范、100% 无错误,讲解通俗、结构清晰、代码可直接复用,风格与前几日完全统一,适配 CSDN 富文本排版,可直接复制发布。

前 12 天核心回顾(1 分钟快速衔接)

  • Day1–2:PCIe 三层架构(事务层 / 数据链路层 / 物理层)
  • Day3–11:配置空间、BAR、Cfg/Mem 交易、Capability、中断
  • Day12:LTSSM、L0/L0s/L1、链路控制与状态寄存器
  • 今日重点:数据链路层如何保证 TLP 可靠传输—— 这是 PCIe 不丢包的关键

今日 30 分钟学习分配

  1. 0–8 分钟:DLLP 作用、类型与帧格式(基础必懂)
  2. 9–18 分钟:ACK / NAK 应答与重传机制(详细图解逻辑)
  3. 19–26 分钟:DLLP 监测、UVM Monitor 与断言实现
  4. 27–30 分钟:必测项 + 小练习

一、DLLP 基础概念与类型(0–8 分钟,通俗无错)

1. 什么是 DLLP

DLLP = Data Link Layer Packet数据链路层包,只在数据链路层使用,对事务层不可见。作用只有一个:保证 TLP 传输可靠、有序、无错、不丢失

  • TLP:业务数据包(MemRd/Wr、CfgRd/Wr 等)
  • DLLP:控制应答包(ACK、NAK、流控、电源管理)

2. 4 类最核心的 DLLP(入门必须掌握)

  1. ACK DLLP应答:TLP 正确接收
  2. NAK DLLP应答:TLP 出错,要求重传
  3. Flow Control DLLP(FC DLLP)流控:告诉对端 “我还有多少缓冲区,你能发多少”
  4. PM DLLP低功耗:L0s / L1 进入与退出握手

3. 规范要点(绝对无错)

  • DLLP 有固定格式,长度固定
  • 每个发送出去的 TLP 都有一个Sequence Number(序列号)
  • 接收方用 ACK/NAK 携带序列号,告知发送方哪些包收到、哪些出错
  • 重传由数据链路层自动完成,软件 / 事务层完全无感知

二、ACK / NAK 与重传机制

1. 正常传输流程(ACK)

  1. RC 发送 TLP,携带序列号SEQ=X
  2. EP 正确接收,校验无误
  3. EP 回包ACK(X)
  4. RC 收到 ACK,删除重传缓冲中的该 TLP

2. 异常传输流程(NAK + 重传)

  1. RC 发送 TLP,SEQ=X
  2. EP 接收时校验错误(CRC 错 / 信号 integrity 错)
  3. EP 回包NAK(X)
  4. RC 收到 NAK,自动重传 TLP (X)
  5. EP 正确接收后,回 ACK (X),重传结束

3. 关键规则

  • 序列号循环递增,收发双方严格同步
  • 未收到 ACK 的 TLP 会保存在 ** 重传缓冲(Replay Buffer)** 中
  • NAK 触发重传,但重传次数由硬件控制
  • 持续多次重传失败会触发Recovery,重新训练链路(Day12 内容)

4. 一句话总结

ACK = 确认收到,NAK = 传错重传,重传由链路层自动搞定。


三、DLLP 监测与 UVM 验证实现

1. 验证思路

DLLP 是硬件自动行为,我们不生成 DLLP,只做三件事:

  1. Monitor 抓取 TLP 与 DLLP
  2. 检查序列号是否连续
  3. 检查 ACK/NAK 是否匹配发送的 TLP
  4. 用断言保证:出错必回 NAK,正确必回 ACK

2. 基础 Monitor 监测代码

class pcie_dllp_monitor extends uvm_monitor; `uvm_component_utils(pcie_dllp_monitor) uvm_analysis_port #(logic [7:0]) ack_port; virtual pcie_intf vif; function new(string name, uvm_component parent); super.new(name, parent); ack_port = new("ack_port", this); endfunction virtual task run_phase(uvm_phase phase); forever begin @(posedge vif.clk); // 监测 ACK 有效 if(vif.ack_valid) begin `uvm_info("DLLP_MON", $sformatf("收到 ACK, Seq=%0d", vif.ack_seq), UVM_LOW) ack_port.write(vif.ack_seq); end // 监测 NAK 有效 if(vif.nak_valid) begin `uvm_error("DLLP_MON", $sformatf("收到 NAK, Seq=%0d", vif.nak_seq)) end end endtask endclass

3. 高频实用断言

module pcie_dllp_assert; `include "uvm_macros.svh" input clk; input rst_n; input tlp_tx_vld; // 发送 TLP input [7:0] tx_seq; // 发送序列号 input ack_vld; // 收到 ACK input [7:0] ack_seq; // ACK 序列号 input nak_vld; // 断言:发送 TLP 后,最终必须收到对应 ACK property p_tlp_ack_match; @(posedge clk) disable iff(!rst_n) tlp_tx_vld |-> ##[1:200] (ack_vld && ack_seq == tx_seq); endproperty a_tlp_ack_match: assert property(p_tlp_ack_match) else `uvm_error("DLLP_ERR", "TLP 发送后未收到对应 ACK") // 断言:不能连续收到大量 NAK property p_no_continuous_nak; @(posedge clk) disable iff(!rst_n) nak_vld |-> ##[1:10] !nak_vld; endproperty a_no_continuous_nak: assert property(p_no_continuous_nak) else `uvm_error("DLLP_ERR", "连续 NAK 重传风暴,链路异常") endmodule

四、今日必测项 + 小练习(27–30 分钟)

必测项(可直接加入用例列表)

  1. 正常 TLP 传输,收到对应 ACK,序列号匹配
  2. 注入单比特错误,触发 NAK + 自动重传,重传后成功
  3. 重传缓冲机制正常,未 ACK 的包不删除
  4. 无连续 NAK 风暴,无链路挂死
  5. 所有 DLLP 断言无报错

小练习

  1. 说出 TLP 与 DLLP 的区别与层次关系
  2. 简述 ACK、NAK 的作用
  3. 写一条断言:禁止在链路非 L0 时发送 DLLP
  4. 思考:如果永远收不到 ACK,硬件会怎么处理?

明日 Day14 预告

【PCIe 验证每日学习・Day14】Flow Control 流控基础与 FC DLLP 验证

内容包括:

  • FC 模式与信用值(Credit)机制
  • FC DLLP 结构与更新规则
  • 发送端 / 接收端流控模型
  • 流控饥饿、反压、超时验证
  • UVM 流控监测与断言
http://www.jsqmd.com/news/496734/

相关文章:

  • 赋予纸片人生命力:高阶通透肌肤物理折射工作流
  • Android jetpack LiveData (二) 原理篇
  • 嵌入式Linux学习-默认规则
  • 无迹卡尔曼滤波器(UKF)在电池 SOC 估算中的应用
  • [拆解LangChain执行引擎]Agent状态是如何被写入通道的?
  • Java+YOLO在PCB质检中的应用:从图像预处理到缺陷分类的全链路优化
  • 2026 年全国优质焦磷酸二氢二钠产品测评指南 靠谱厂商实力盘点 - 深度智识库
  • 【Fidder抓包】+【开发者工具】
  • 8K 超高清时代标杆@ACP#GSV6703 三进一出 HDMI2.1 切换器深度解析
  • 【Rust 语言编程知识与应用:表达式详解】
  • 20260318 模拟赛
  • 【入门篇】第六章 OpenClaw 深度解析:Agent 任务执行流程
  • 详细自适应无迹卡尔曼滤波 (AUKF) 实现
  • 西门子博途1200 PLC的V N积分法卷径计算功能块:SCL源代码解析及收放卷设备应用研究
  • 28个RAG面试高频问题解析:从原理到优化,助你面试稳稳拿捏!
  • Linux HTTP协议
  • 闲置N1盒子别扔!30分钟打造支持远程访问的轻量级NAS(2024最新版)
  • 2026MEMS陀螺仪技术实力榜:西安精准测控登榜,创新企业共舞未来 - 深度智识库
  • 阿里后端面经拆解:别再只背八股,这类追问最容易把人问住
  • 2026年岗亭集成房屋厂家优选,这些品牌值得一看!移动岗亭/岗亭移动厕所/岗亭,岗亭集成房屋实力厂家联系电话 - 品牌推荐师
  • JAVA--基础(十四)--- 反射 reflection
  • RustFS安装与使用
  • 京东e卡回收正规平台怎么选择? - 猎卡回收公众号
  • 基于Java的YOLO光伏板巡检系统:无人机图像实时处理与边缘计算优化
  • 2026 年全国优质焦磷酸二氢二钠靠谱厂家推荐 实力强口碑好的直销企业盘点 - 深度智识库
  • HarmonyOS 6 渐变颜色通用属性实战教程(linear/radial/sweep)
  • 基于RocketPy的液氧甲烷不锈钢火箭陆地发射完整仿真系统
  • 洛谷:P2615 [NOIP 2015 提高组] 神奇的幻方
  • 2026权威支护锚杆厂家推荐航德天下实力入选:涨壳式锚杆/灌浆锚杆/组合锚杆/自进式锚杆/螺纹锚杆/隧道锚杆/选择指南 - 优质品牌商家
  • 将大型 CSV 文件按指定行数拆分到 Excel 的不同工作表中