PCIe协议翻译【第三章】【Data Link Layer Specification】

数据链路层是事务层和物理层之间的中间组件。它的主要职责是提供可靠的机制,用于在链路上的两个组件之间交换事务层数据包(TLP)。

3.1 Data Link Layer Overview

在这里插入图片描述
数据链路层负责将事务层提供的TLP可靠地传输到另一个组件的事务层。数据链路层提供的服务包括:

  • 数据交换
    - 接受从传输事务层传输的TLP并将它们传递到传输物理层
    - 接受通过链路从物理层接收的TLP并将其传递到接收事务层
  • 错误检测和重试
    - TIP序列号和LCRC生成
    - 用于数据链路层重发的TLP包存储
    - TLP和数据链路层包(DLLP)的数据完整性检查
    - 积极和消极应答DLLP
    - 错误报告和日志机制的错误指示
    - 链接应答超时重发机制
  • 初始化和电源管理
    - 跟踪链接状态并将活动/重置/断开状态传递到事务层

DLLPs:

  • 用于链路管理功能,包括TLP确认、电源管理和流控制信息交换
  • 在链路上两个直接连接的组件的数据链路层之间传输
  • DLLP在一个链路上的两个组件之间进行点对点发送。TLP可能通过一个或多个中间组件从一个组件路由到另一个组件。
  • DLLP和TLP的数据完整性检查是使用通过链路发送的每个数据包中包含的CRC来完成的。DLLP使用16位CRC,而TLP(可以比DLLP长得多)使用32位LCRC。TLP还包括序列号,用于检测一个或多个完整TLP丢失的情况。
  • 收到的未通过CRC检查的DLLP将被丢弃。使用DLLP的机制可能会因这种信息丢失而遭受性能损失,但可以自我修复,以便连续的DLLP将取代任何丢失的信息。
  • 未通过数据完整性检查(LCRC和序列号)或在从一个组件到另一个组件的传输中丢失的TLP将由发送器重新发送。发送器存储已发送的所有TLP的副本,在需要时重新发送这些副本,并仅在收到来自其他组件的无错误接收的肯定确认时清除这些副本。如果在指定时间段内未收到肯定确认,发送器将自动开始重新传输。接收者可以使用否定确认请求立即重新传输。

数据链路层表现为对事务层具有不同延迟的信息管道。在任何给定的单个链路上,送入发射数据链路层(1和3)的所有TLP将在稍后以相同的顺序出现在接收数据链路层(2和4)的输出处,如图3-1所示。延迟将取决于多种因素,包括管道延迟、链路的宽度和操作频率、链路上的电信号传输以及数据链路层重发引起的延迟。由于这些延迟,发射数据链路层(1和3)可以向发射事务层施加反压力,而接收数据链路层(2和4)将有效信息的存在或不存在传达给接收事务层。

3.2 Data Link Control and Management State Machine

数据链路层跟踪链路的状态。它与事务层和物理层通信链路状态,并通过物理层执行链路管理。数据链路层包含数据链路控制和管理状态机(DLCMSM)来执行这些任务。该状态机的状态如下所述,如图3-2所示。

状态:

  • DL_Inactive。物理层报告链路不可操作或没有连接到端口
  • DL_Feature (optional) 。物理层报告链路可运行,执行 Link Feature交换
  • DL_Init。物理层报告链路可操作,初始化默认虚拟通道VC0的流控制
  • DL_Active。正常操作模式

状态输出:

  • DL_Down。数据链路层与链路另一端的组件通信
  • DL_Up。数据链路层正在与链路另一端的组件通信

在这里插入图片描述

3.2.1 Data Link Control and Management State Machine Rules

规则

  • DL_Inactive
    • PCI Express hot、warm或冷重置后的初始状态(请参阅第6.6节)。请注意,DL状态不受FLR的影响(请参阅第6.6节)
    • 进入DL_Inactive后
      • 将所有数据链路层状态信息重置为默认值
      • 如果端口支持可选的 Data Link Feature ,则必须清除“Remote Data Link Feature Supported,”和“Remote Data Link Feature Supported Valid”有效字段
      • 丢弃数据链路层retry buffer的内容(请参阅第3.6节)
    • 处于DL_Inactive状态时
      • 向事务层以及数据链路层的其余部分报告DL_Down状态注意:这将导致事务层丢弃任何未完成的事务并在内部终止任何传输TLP的尝试。对于下游端口,这相当于“热移除”。对于上游端口,链路关闭相当于热重置(请参阅第2.9节)。
      • 丢弃事务层和物理层的TLP信息
      • 不生成或接受DLLP
    • 退出到DL_Feature状态,如果
      • 该端口支持可选的数据链路功能交换,数据链路功能交换启用位为设置,事务层指示软件未禁用该链路,物理层报告物理LinkUp = 1b
    • 退出到DL_lint状态,如果
      • 该端口不支持可选的数据链路功能交换,事务层指示该链路未被软件禁用,物理层报告物理LinkUp = 1。
      • 该端口支持可选的数据链路功能交换,数据链路功能交换启用位为清除,事务层指示软件未禁用该链路,物理层报告物理LinkUp = 1b
      • 上述2个条件取或
  • DL_Feature
    • 在DL_Feature中
      • 执行第3.3节中所述的数据链路功能交换协议
      • 报告DL_Down状态
      • 具有DL_Down状态的端口的数据链路层被允许丢弃任何收到的TLP,除非已经发送一个或多个ACK DLLP来确认这些TLP。
    • 退出到DL_lint状态,如果
      • 数据链路功能交换成功完成,物理层继续报告物理链路Up = 1b
      • 数据链路功能交换确定远程数据链路层不支持可选的数据链路功能交换协议,物理层继续报告物理LinkUp = 1b
      • 上述2个条件取或
  • DL_Init
    • 在DL_Init中
      • 遵循第3.4节中描述的流控制初始化协议,初始化默认虚拟通道VC 0的流控制
      • 处于FC_INIT1状态时报告DL_Down状态;处于FC_INIT2状态时报告DL_Up状态
      • 具有DL_Down状态的端口的数据链路层被允许丢弃任何收到的TLP,除非已经发送一个或多个ACK DLLP来确认这些TLP。
    • 退出到DL_Active状态,如果
      • 流量控制初始化成功完成,物理层继续报告物理LinkUp = 1b
    • 如果出现以下情况,则终止初始化VC 0的流控制的尝试并退出DL_Inactive
      • 物理层报告物理LinkUp = 0
  • DL_Active
    • DL_Active称为正常工作状态
    • 处于DL_Active状态时
      • 事务层和物理层接受并传输TLP信息
      • 生成和接受DLLP
      • 向事务和数据链路层报告DL_Up状态
    • 退出到DL_Inactive,如果
      • 物理层报告物理LinkUp = 0
      • 具有Surprise Down错误报告功能的下游端口(请参阅7.5.3.6部分)必须将从DL_Active到DL_Inactive的转换视为Surprise Down错误,除非以下情况下此错误检测被阻止:
        • 软件设置了桥控制寄存器的Secondary bus Reset
        • 软件设置了Link Disable
        • switch的下游端口因为上游端口的事件导致从DL_Active到DL_Inactive的转换不被视为错误。比如上游端口的Hot reset,上游链路转换到DL_Down,上游端口的Secondary bus Reset
        • 通过此端口发送OME_Turn_Off消息。
        • 关闭电源,复位,恢复链路的请求发送到物理层之前,不允许转换到DL_Inactive。
        • 如果PME_Turn_off/PME_TO_Ack握手失败,则可能会检测到Surprise Down。
        • 如果该端口和可热插入插槽关联,(Slot Capabilities寄存器的Hot-Plug Capable bit设置1),Hot-Plug Surprise bit设置1,那么任何到DL_Inactive的转换都不能被视为错误。
        • 如果该端口和可热插入插槽关联,(Slot Capabilities寄存器的Hot-Plug Capable bit设置1), Power Controller Control bit设置1,那么任何到DL_Inactive的转换都不能被视为错误。

由上述一

<think>嗯,用户想了解关于Verilog实现的PCIe协议代码。首先,我需要确认PCIe协议的基本概念,比如分层结构、数据包格式等。然后,Verilog作为硬件描述语言,通常用于设计数字电路,所以PCIe的Verilog代码可能涉及物理层、数据链路层和事务层的实现。 用户可能是硬件工程师或学生,想要了解如何用Verilog实现PCIe接口,或者需要参考代码结构。他们可能对PCIe协议的层次结构不太清楚,需要先解释各层的功能,再结合代码示例说明。 需要注意Verilog代码的结构,比如物理层的串行器/解串器(SerDes)、时钟恢复等模块。数据链路层可能包括ACK/NACK机制,事务层处理TLP包的生成和解析。要确保提供的代码示例符合分层结构,并正确使用Verilog语法。 另外,用户可能需要知道常用的IP核,比如Xilinx的XDMA或Intel的PCIe IP,这些通常由厂商提供,而不是从头开始编写。但用户可能希望了解基础实现,所以给出简单示例,如TLP包的生成,同时推荐官方文档和资源。 需要提醒用户实际开发中使用IP核的重要性,避免重复造轮子,同时确保代码符合时序和协议规范。可能还需要提到验证和仿真工具,如ModelSim,以及合规性测试的必要性。</think>关于Verilog实现PCIe协议的代码开发,我将分步骤为您解析关键要点: 一、PCIe协议分层结构 1. 事务层(Transaction Layer) - 处理TLP包(Transaction Layer Packet)的组装/解析 - 支持内存读写、配置读写等操作类型 - 示例TLP头格式: ``` | Fmt | Type | TC | Attr | Length | Requester ID | Tag | Address | ``` 2. 数据链路层(Data Link Layer) - 负责DLLP包(Data Link Layer Packet)传输 - 实现ACK/NACK机制保障可靠性 - 流量控制管理 3. 物理层(Physical Layer) - 实现SerDes高速串行传输 - 8b/10b或128b/130b编码 - 参考时钟恢复电路设计 二、Verilog实现核心模块示例 ```verilog // TLP包生成模块(简化版) module tlp_generator ( input clk, input rst_n, output reg [127:0] tlp_header, output reg [31:0] data_payload ); parameter MEM_READ_REQ = 3'b000; parameter MEM_WRITE_REQ = 3'b001; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin tlp_header <= 128'h0; end else begin tlp_header[126:124] <= MEM_WRITE_REQ; // 设置操作类型 tlp_header[63:32] <= 32'hDEAD_BEEF; // 目标地址 tlp_header[9:0] <= 10'h1; // 数据长度 end end endmodule ``` 三、开发注意事项 1. 时序约束 - 需满足PCIe Gen3 8GT/s或Gen4 16GT/s速率要求 - 建立严格的时序约束文件(.xdc) 2. 验证策略 - 使用Synopsys VIP验证IP进行协议合规性测试 - 构建SystemVerilog验证环境 - 覆盖率驱动验证(代码覆盖率+功能覆盖率) 3. 实际开发建议 - 优先使用Xilinx UltraScale+或Intel Stratix 10的硬核IP - 采用AXI4-Stream接口进行数据交互 - 实现MSI/MSI-X中断处理模块 四、学习资源推荐 1. PCI-SIG官方文档: - 《PCI Express Base Specification 5.0》 - 《PIPE Specification》 2. FPGA厂商指南: - Xilinx PG213 (UltraScale+ PCIe) - Intel AN 820 (Stratix 10 PCIe Implementation) 3. 开源参考项目: - LitePCIe (FPGA开源实现) - PCIe Exerciser测试套件 建议开发步骤: 1. 使用Vivado/Qtus生成PCIe IP核 2. 通过AXI Bridge连接用户逻辑 3. 实现DMA传输引擎 4. 构建Linux驱动验证端到端通信 注:完整PCIe协议栈开发需要团队协作,建议从FPGA厂商提供的IP核开始集成,而非完全从头实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值