物理层控制和状态允许用户应用程序根据数据吞吐量和电源需求来更改链路的宽度和速度。
1 Design Considerations for a Directed Link Change
在Directed Link Change(定向链接更改)期间需要注意的事项有:
- 链接更改操作(Link change operation)必须在user_lnk_up被断言且IP核处于L0状态时进行。这通常通过检查pl_ltssm_state[5:0]信号来确定。
- 如果启用了Lane Reversal(车道反转),则不应使用链接宽度更改。
- 目标链接宽度的更改操作必须等于或小于由pl_initial_link_width输出指示的宽度。
- 如果pl_link_upcfg_cap被设置为1b,则PCI Express链接具有Upconfigure能力。这意味着链接宽度可以在初始协商的链接宽度和由端口和链接伙伴共同支持的任何较小链接宽度之间变化(这通常是为了链接可靠性或应用原因)。
- 如果链接不是Upconfigure capable的,则协商的链接宽度只能变为链接伙伴和设备共同支持的较小宽度。
- 在链接速度从2.5 Gb/s更改为5.0 Gb/s之前,用户应用程序必须确保链接是5.0 Gb/s(Gen2)兼容的(即pl_link_gen2_cap为1b),并且链接伙伴也是Gen2兼容的(pl_link_partner_gen2_capable为1b)。
- 当cfg_lcommand[9](硬件自主宽度禁用位)被设置为0时,表示硬件不会自主更改链路宽度,从而允许应用程序来控制这个更改。当应用需要改变链路的宽度或速度时,必须设置pl_directed_link_auton为1b(即二进制1,或逻辑真)。这个信号告诉PCIe硬件,链路宽度和/或速度的更改是由应用程序发起的,而不是由硬件自主管理的。要将链路宽度和速度恢复到原始(可能是更高的)配置,需要将pl_link_upcfg_cap设置为1b(即二进制1,或逻辑真)。这个信号可能用于触发PCIe硬件重新协商并配置到最初支持的最大链路宽度和速度。
- 当用户应用程序试图将PCIe链路设置为一个特定的宽度,但该宽度不被链路伙伴所支持时,链路的实际宽度将退回到下一个双方共同支持的较窄的宽度。例如,用户应用程序试图将8条通道的PCIe链路(通常称为“x8”链路)设置为4条通道(即“x4”模式)操作,但是链路伙伴只支持降低到1条通道(即“x1”模式)的操作。因此,最终的链路宽度将是1条通道。
- 当cfg_pcie_link_state寄存器的值为101b(表示链路正在过渡到或从PPM的L1状态转移)或110b(表示链路正在过渡到PPM的L2/L3 Ready状态)时,不应使用定向链路更改引脚(Root或Endpoint)或设置重链接位(仅适用于Root)来发起重链接。这是因为在PCIe链路处于电源管理相关的过渡状态时,链路的稳定性和配置可能会受到影响。如果在这些状态下发起重链接,可能会导致链路的不稳定、配置错误或更严重的通信问题。
- 为了简化时序收敛,允许在发起定向链路更改(Directed Link Change)之前,最多等待16个用户时钟周期来同时检查上述所有条件是否均为真。这些条件是:
- user_lnk_up == 1'b1:这表示用户链路已上电且可用。
- pl_ltssm_state[5:0] == 6'h16:这表示PCIe链路链接状态机(LTSSM, Link Training and Status State Machine)当前处于L0状态,这是正常操作状态。
- cfg_lcommand[9] == 1'b0:这通常与PCIe的某些特定配置或命令位相关,可能是指不允许某些类型的命令或配置。
- cfg_pmcsr_powerstate[1:0] == 2'b00:这表示设备处于D0电源状态,即完全上电状态。
- cfg_pcie_link_state[2:0] != either 3'b101 or 3'b110:这确保PCIe链路不处于过渡到PPM(Power Management Power-down Mode)的L1状态或过渡到PPM的L2/L3 Ready状态的过程中。
在PCIe系统设计中,这些检查是必要的,以确保在发起任何可能影响链路状态的操作(如定向链路更改)之前,系统处于正确的状态。由于硬件和软件的时序差异,允许有一定的缓冲时间(最多16个用户时钟周期)来确保所有条件都得到满足,从而避免潜在的时序违规或不稳定行为。
2 Directed Link Width Change
Directed Link Width Change(定向链路宽度更改),是指由用户应用程序驱动来更改PCIe(Peripheral Component Interconnect Express)链路的宽度。这个过程确保了应用程序可以根据需要动态地调整链路的带宽,以适应不同的工作负载和数据传输需求。
图3-57展示了必须由用户应用程序实现的定向链路宽度更改过程。
3 Directed Link Speed Change
定向链路速度更改是一个由用户应用程序驱动来更改PCIe链路速度的过程。图3-58展示了该过程,其中target_link_speed是应用程序驱动的新链路速度请求。
注意:不应该仅仅通过驱动pl_directed_link_change引脚到特定的值(例如10或11)来在Root Port上发起链路速度更改,除非Root Port的RP_AUTO_SPD属性被设置为11。
4 Directed Link Width and Speed Change
用户应用程序需要实现定向链路宽度和速度更改的功能。图3-59描述了这一过程,其中target_link_width[1:0]表示应用程序驱动的新链路宽度请求,而target_link_speed表示应用程序驱动的新链路速度请求。
注意:通过直接设置pl_directed_link_change引脚为10或11来在Root Port上发起链路速度更改,那么这一操作只有在Root Port的RP_AUTO_SPD属性被设置为11时才是允许的。