1. 时钟与接口速率关系

DUT采用synopsys PCIe Controller IP 作为End Port。DUT一共有4条Lane, Pipe Width 为32bit, PCIe最大速率为Gen4.0。
在这里插入图片描述

其中波形中以rc_xx为标志的信号均为rc侧pipe interface, 比如rc_rate表示当前接口速率:

3‘b000 : 表示为PCIe Gen1
3’b001 : 表示为PCIe Gen2
3’b010 : 表示为PCIe Gen3
3’b011 : 表示为PCIe Gen4

PCIe Gen1 Clk频率:
在这里插入图片描述
PCIe Gen3 Clk频率:
在这里插入图片描述
PCIe Gen4 Clk频率:
在这里插入图片描述

2. ltssm状态机跳转

2.1 ltssm_state[5:0]状态编码

RP和EP解复位后,PCIe进入链路训练状态,当前LTSSM状态编码值如下:
在这里插入图片描述
以Target Gen Speed 为Gen4为例子,整个状态机跳转过程如下:

PCIe Gen1 : LTSSM状态值跳转为:0–> 1 --> 6 --> 1 --> 2 --> 4 --> 5 --> 0 --> 1 --> --> 6 --> 1 --> 2 --> 4 --> 7 --> 8 -->9 --> a --> b --> c -->11 --> d --> f --> e
PCIe Gen3 : LTSSM状态值跳转为:e --> d --> 21 --> d --> f --> 10 --> 11 --> d --> f --> e
PCIe Gen4 : LTSSM状态值跳转为:e --> d --> 21 --> d --> f --> 10 --> 11

在这里插入图片描述

2.2 Gen1/Gen2 链路训练

2.2.1 基本时钟、复位检查

为了保证PCIe Controller可以正常工作,从*。u_pcie_core波形上检查下面信号是否正常:

  • core_clk – core_clk 要运行在Gen1 需要的工作频率。
  • perst_n, pwr_rst_n, core_rst_n, sticky_rst_n 和non_sticky_rst_n – 所有的复位信号都要释放,从低变高。具体释放时间由时钟复位初始化boot code决定。
  • app_ltssm_enable – 必须为高,允许LTSSM进行链接训练后应用程序已经通过DBI(如果有的话)完成了控制器寄存器的编码。
  • cfg_fast_link_mode – 启用快速链接模式,以加快计时器和减少仿真时间。
    在这里插入图片描述

2.2.2 LTSSM Detect子状态

Detect.Quiet:
在这种状态下,控制器LTSSM从Detect.Quiet 进入到Detect.Active状态,如果PHY电源状态为P1时。并且phy_mac_phystatus在所有的Active lanes上都会被释放。控制器处于“Detect.Quiet”状态。直到任意的数据lane退出到electrical idle 或发生12ms超时。
从层次 *.u_pcie_core 检查下面信号:

  • mac_phy_powerdown: PCIe Controller的pipe输出口,需要被驱动到P1(2’b10)值。
  • phy_mac_status : PCIe Controller的pipe输入口。在所有有效Lane上,该状态为0。
  • smlh_lanes_active : 显示Active Lanes(每个Lane 为1位)。缺省情况下,设置smlh_lanes_active
    设置为控制器的最大链路宽度。
  • phy_mac_rxelecide : 控制器pipe输入口。 如果phy_mac_rxelecidle 在每一条数据lane上都不为0,则LTSSM状态机跳转到Detect.Active状态。

在这里插入图片描述

Detect.Active:

在此状态下,控制器对所有的Active lanes进行接收端检测,并检测某一接收端的Lane的条数。如果PHY没有完成所有active Lane上的接收序列接收,那么LTSSM状态会停留在Detect.Active状态,如phy_mac_phystatus的断言所示。如果所有Lane都未检测到某一接收器,则重复该序列至少一次,以检查相同Lane是否再次检测到接收机。

从层次 *.u_pcie_core 检查下面信号:

  • mac_phy_txdetectrx_loopback : 控制器置起该信号开始接收检测机制。
  • phy_mac_phystatus : PHY置起该信号,表示序列接收完成。
  • phy_mac_rxstatus : PHY置该信号指示接收器被检测(3‘b011)。

在这里插入图片描述

2.2.3 LTSSM Polling子状态

LTSSM loops between Polling.Active <->Polling.Compliance or Polling.Active <-> Detect.

  • 在Polling.Active状态,控制器向所有的Lane发送TS1序列,这些lane已经在Detect状态检测到接收器,如果出现以下两个场景中的一个,那么LTSSM跳转到Polling.Configuration状态。
    1) 当所有这些Lane接收到8个连续的TS1/TS2有序集。
    2) 在24毫秒超时后,一个预定通道子集退出electrical空闲,并且任意通道接收8个连续的TS1/TS2有序集。

  • LTSSM 状态从Detect.Wait 跳转到Detect.Active再跳转到Polling.Active进入到Polling状态。

  • phy_mac_rxelecidle: De-assertion (1->0) 表示的是 the receiver检测到了退出机制从electrical Idle。

当启用快速链接模式(cfg_fast_link_mode= 1’b1)时,为了加快仿真速度,在Polling.Active状态控制器只发送16个TS1,而PCIe Base规范要求发送1024个TS1。
在这里插入图片描述

2.2.4 LTSSM Configuration 子状态

在从Polling状态过渡到配置状态时,在“Detect”期间检测到接收方的任何通道都是被认为是Active lanes。当Lanes出现反转时,控制器可以在此状态下进行通道反转。如果LTSSM卡在Configuration.Lanenum.Accept状态,很可能它没有在active 通道上收到所需的TS1,或者通道号与预期不匹配。在这种情况下,你应该检查以下内容:

  • 检查控制器是否配置为同时支持全通道和部分通道反转(CX_AUTO_LANE_FLIP_MUX_ARCH =2).
  • 检查NUM_OF_LANES, PRE_DET_LANES, and AUTO_LANE_FLIP_CTRL_EN fields in
    GEN2_CTRL_OFF是否为适当的值。

主要信号在*.u_pcie_core.u_cx_pl.u_smlh.u_smlh_ltssm有

  • cfg_upstream_port: 表示控制器是否正在作为upstream 端口工作。
  • cfg_auto_flip_en: 表示 auto lane flip and reversal 被使能。
  • smlh_lane_flip_ctrl: 表示有多少条Lane已经被反转。

Auto Lane Reversal During Configuration.Lanenum.Wait
在这里插入图片描述

在Configuration.Complete状态,RC和EP以Link Num!=PAD 和LaneNum!=PAD发送TS2s ,收到8个相同数据速率、链路号、通道号的连续ts2,状态跳转到Configuration.Idle状态。在Configuration.Idle, RC和EP都向所有的active Lanes发送idle data字符,并进到L0状态,如果8个idle data 字符被收到。
主要涉及信号从层次 *.u_pcie_core.u_cx_pl.u_xmlh有

xmtbyte_ts2_sent, data[],data_dv[]

从层次*.u_pcie_core看信号:

smlh_link_up, mac_phy_rate

Configuration to L0 Transition
在这里插入图片描述

2.2.5 Link Width 比预期小

如果link成功后的链接宽度比预期的小,你应该检查以下:

  • 图“Detect.Active”过程中,所有预期通道是否都检测到接收器?
  • 如果不是,那么检查PHY的接收器检测逻辑的正确操作。
  • 所有通道在Polling.Active状态退出电空闲状态时,是否都接收TS1s序列?
    如果不是,则检查连接到PHY和链路支持的最大链路宽度。
  • 如果通道发生反转或损坏,请检查你的控制器是否配置为支持“LTSSM配置子状态”一节中描述。

2.2.6 Speed 切到Gen2速率

如果RC和EP都支持Gen2 速率,那么当两侧都进到Gen1 Speed后,任意一侧都可以发起速率切到Gen2, 如果速率切换不成功,需要查看以下两个方面:

  • 控制器GEN2_CTRL_OFF[17](Directed Speed Change)是否设置为1‘b1。
    允许控制器自动发起速率切换从Gen1到Gen2
  • 是否两侧都支持Gen2 速率。

主要信号来自层次 *.u_pcie_core.u_cx_pl.u_smlh.u_smlh_ltssm:

  • cfg_directed_speed_change: 表示 GEN2_CTRL_OFF[17] (Directed Speed Change)的值。
  • directed_speed_change: directed_speed_change变量,由PCIe基础规范定义。
  • link_latched_ts_data_rate: 显示远端发起数据速率改变。
  • ltssm_ts_data_rate: 由控制器发起数据速率切换。

Gen1 to Gen2 Speed Change Initiation
在这里插入图片描述

2.2.7 LTSSM Recovery 子状态

在Recovery.RcvrLock状态,RC和EP必须接收8个连续的TS1s序列跳转到Recovery.RcvrCfg状态。
在Recovery.RcvrCfg状态,RC和EP必须接收8个连续的TS2s序列, 如果directed_speed_change 变量被设置,LTSSM状态跳转到Recovery.Speed,.
在Recovery.Speed状态,控制器改变PIPE口上的速率信号,等待PHY来识别速率改变并发送phy_mac_status状态在所有的active 通道上。如果使用动态频率速率模式,core_clk频率会自动切换到Gen2的时钟频率。

从层次 *.u_pcie_core 查看相关信号:

  • cxpl_debug_info[34]:每一个脉冲表示Lane0接收的一个TS1训练序列。
  • cxpl_debug_info[33]:每一个脉冲表示Lane0接收的一个TS2训练序列。
  • mac_phy_rate :控制器PIPE输出信号,从0切换到1表示速率从Gen1切换到Gen2。
  • phy_mac_status :由PHY发送给DUT controller, 表示识别rate 信息。

从层次 *.u_pcie_core.u_cx_pl.u_xmlh 查看相关信号:

  • xmtbyte_ts1_sent :每一个脉冲表示一个TS1序列被发送。
  • xmtbyte_ts2_sent :每一个脉冲表示一个TS2序列被发送。

Speed Change from Gen1 to Gen2在这里插入图片描述当速率在Recovery.Speed切换后,要求PHY在48ms timeout之前向所有的Lanes发送phystatus状态。当控制器在fast link模式时,默认的48ms超时发生在48us时刻,检测发现PHY仍然运行在fast link模式,并完成速率切换和48us内置起phystatus状态。当fast link 模式有效后,cfg_fast_link_mode=1’b1, 需要注意:为了在Recovery.RcvrLock状态加速仿真,控制器只发送16个TS1序列,然后标准规范规定正常要发送1024TS1序列。

core_clk 频率从Gen1到Gen2切换
在这里插入图片描述
Recovery to L0 Transition at Gen2 Rate
在这里插入图片描述

2.3 Gen3 Equalization

下面的输入信号需要和PHY连接并由PHY驱动,当动态PHY和动态MAC模式被应用时。

phy_mac_localfs[*]
phy_mac_locallf[*]
mac_phy_rxstandby
phy_mac_rxstandbystatus

EP 和RC两端从L0进入到Recovery状态,在Recovery.RcvrCfg状态,下游节点发送TS2s序列到上游节点,上游节点锁存preset值在Equalization Control register 的RO域。

相关信号从层次 *.u_pcie_core 可以找到:
上游端口:

smlh_lec_pset_ltx[4CX_NL-1:0] : 显示上游端口从接收到的EqTS2s(每通道4bit)捕获的发送器preset。
smlh_lec_pset_lrx[3
CX_NL-1:0]: 显示由上游端口从接收到的EqTS2s捕获的接收机preset(每个通道3bit)。

下游端口:

cfg_lec_pset_ltx[4CX_NL-1:0]: 每个通道4bit
cfg_lec_pset_lrx[3
CX_NL-1:0]: 每个通道3bit
cfg_lec_pset_rtx[4CX_NL-1:0]: 每个通道4bit
cfg_lec_pset_rrx[3
CX_NL-1:0]: 每个通道3bit

在这里插入图片描述
在Recovery.Speed状态,控制器发起Gen Speed切换到Gen3, PHY提供FS和LF值从发送器到控制器。
涉及到的信号有:

phy_mac_locallf: 每个通道6bit
phy_mac_localfs: 每个通道6bit
mac_phy_getlocal_pset_coef:每个通道1bit
mac_phy_local_pset_index: 每个通道4bit
phy_mac_local_tx_coef_valid: 每个Lane 1bit
phy_mac_local_tx_pset_coef: 每个通道18bit
mac_phy_txdeemph:

在这里插入图片描述
Equalization phase0~3此处省略不在详细介绍,具体请参考PCIe Controller spec.

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐