PCIE初始化流程包括PHY加载fireware程序,链路训练,设备枚举,能力寄存器配置,BAR空间分配等。
PHY配置

上电复位后,app_hold_phy_rst=1期间,PHY fireware来完成PHY的配置和加载;具体fireware的处理步骤,由PCIe PHY的vendor提供;本系列使用的是一个简单的generic phy mode,不涉及fireware的处理。
链路训练
在app_ltssm_enable=1后,进入链路训练流程;链路训练主要是为了保证物理层模数转换后的信号经过PCB能正确的被对端设备物理层所恢复;因为是模拟电路,仅有物理层参与,硬件自动启动,不需要软件干预;链路训练后,才可确保包在链路上正常传输。

链路训练由链路训练状态机(Link Training and Status State Machine, LTSSM)自动完成,不涉及数据链路层和事务层。LTSSM在物理层逻辑的数字部分-MAC实现,文件位置:Layer1/smlh_ltssm.sv
LTSSM不同状态下实现功能不同,归类如下:
Detect:监测设备
Polling: 实现位锁定,符号锁定,极性反转
Configuration:链路宽度,通道翻转
Recovery:调解EQ,提升速率
L0:正常工作状态

位锁定(Bit Lock):
PCIe 总线采用了一种嵌入式时钟的机制,即发送端只向接收端发送数据信号,并不发送时钟信号(时钟信号隐藏在数据信号中)。接收端可以通过 CDR(Clock and Data Recovery)逻辑将时钟从数据流中恢复出来,然后再用恢复出来的时钟对数据信号进行采样。当然,时钟恢复需要一定的时间,才能保证时钟信号与数据信号的相位对应关系符合要求。一旦 CDR 完成了时钟的恢复,我们就说 PCIe 总线完成了位锁定。
符号锁定(Symbol Lock):
完成了位锁定之后,只是能够准确地识别出数据流中的 0 和 1,还是不知道发送的内容是个啥。对于 Gen1&Gen2 来说,采用的 8b/10b 编码,即传输的数据是以 10bit 为一个字符。 LTSSM 可以引导物理层相关逻辑通过识别 COM(K28.5)等控制字符来确定每个字符的开始与结束为止,即字符锁定。
极性翻转(Polarity Inversion):
PCIe 收发的都是差分信号,有的时候 Link 两端的设备的对应信号的极性可能是相反的。因此,PCIe Spec允许在链路训练与初始化的时
候,对其进行调整,如下图所示。和通道位置翻转(Lane Reversal)不一样的是,信号极性翻转(Polarity Inversion)并不是一个可选项,而是所有标准 PCIe设备都应支持的。
链路宽度(Link Width):
由于 PCIe 允许将 x1 的 PCIe 卡插入 x4、 x8 甚至是 x16 的 PCIe 插槽中。因此在链路训练与初始化过程中,相邻的两个 PCIe 设备需要相互通信来确定其支持的最大链路宽度。
通道翻转(Lane Reversal):
有的时候两个 PCIe 设备的通道排列位置可能不太一致, PCIe Spec 允许对默认的通道排列位置重新排列,如下图所示。但是,从大部分的 PCIe 设备(PCIe 卡和插槽等)都是按照统一的标准实现的,一般不会出现这种情况,因此这一功能是可选的。
链路数率(Data Rate):
系统刚复位的时候,链路训练和初始化都是基于 2.5G T/s 的速率的。如果 Link两端的设备都支持更高的速率,则会自动进入 Re-training 状态,以重新切换速率。
通道对齐(Lane-to-Lane De-skew):
PCIe 链路完成字符锁定后,还需要进行通道对齐。因为有的通道的信号可能先到达,有的可能后到达。 PCIe Spec 规定 PCIe 链路应有能力对一定范围了的Lane-to-Lane Skew 进行移除,使得各个 Lane 上的信号是同步的。
均衡(Equalization):
调节发送端Tx实现FFE(Feed-forward Equalizer,前馈均衡器),接收端Rx实现CTLE (Continuous Time Linear Equalizer,连续时间线性均衡器)和DFE (Decision Feedback Equalizer,判决反馈均衡器)。以支持更高速率;🔗均衡器EQ和它在高速外部总线中的应用
在链路训练过程中,RC和EP通过Ordered Sets来通信,分为TS1 and TS2 OrderedSet (TS1OS/TS2OS)、 Electrical Idle Ordered Set (EIOS)、 FTS Ordered Set (FTSOS)、SKP Ordered Set (SOS)和 Electrical Idle Exit Ordered Set (EIEOS)。TS1和TS2为Training Set。
上节提到,PA中可显示具体Ordered Sets的发送时间和内容:


具体的链路训练细节,在PCIE集成验证中,不必过分考究;
因为链路训练由MAC的逻辑自动完成,所以VIP集成时,只需调用VIP提供的svt_pcie_dl_service_set_link_en_sequence,在svt_pcie_dl_service_sequencer上启动;然后等待VIP与DUT链路训练完成。

VIP和RTL都提供ascii格式的debug信号,观察到LTSSM的跳转情况;从最开始的2.5G,经过RECOVERY_EQUALIZATION,速率提升到8G;再次RECOVERY_EQUALIZATION,达到目标速率16G。

mac_phy_pclk_rate从0->2->3,表明由PHY_PLL产生的Phy Clk频率从62.5Mhz->250Mhz->500Mhz

LTSSM中包含很多时序参数,如果完全按照标准协议的时序参数,仿真耗时很长;建议将VIP和DUT都配置为fast mode,加速仿真速度:
DUT中由DEFAULT_FAST_LINK_ENABLE宏控制:

VIP中调用set_fast_sim_ltssm_state_timeout_values配置:

VIP也支持完全跳过链路训练:

枚举
主板上的CPU作为RC,通过PCIE Switch连接多个EP设备;系统软件(一般为BIOS代码)负责RC建立PCIE系统的拓扑结构,这个过程一般称为枚举。
RC会通过发送CFG_RD/CFG_WR类型的TLP,以深度优先的方式,遍历访问整个拓扑结构;RC会通过读取最后一个节点EP的Vendor ID寄存器,来判断是否存在EP设备;如果Vendor ID值为’hFFFF,则表明设备不存在;当一个SWITCH下所有的EP设备遍历完成后,其寄存器地址0x18上的Sebordinate Bus Number,Secondary Bus Number,Primary Bus Number也就确定了;后续RC发送基于ID路由(BNF:Bus number,Device number,Funciton number)的CFG包,都会和SWITCH上的Bus Number作比较,决定路由方向。
因为本系列中VIP作为RC,DUT作为EP,且是唯一的一个device,所以不涉及对整个拓扑机构的建立过程。具体拓扑机构的建立不在举例,可参考Mindshare中的Single Root Enumeration Example一节。

配置空间
PCIE协议规定的每个EP设备有4KB的配置空间;其中前64DW为了和PCI兼容,保持一致。剩下的为PCIE扩展能力空间;Capability空间为能力寄存器,可选择实现,如MSI/MSIX功能。
前64DW由16DW Header空间+48DW Capability空间组成;Header依据类型不同,分为Type0:EP和Type1:RC/Swith两种格式;


能力寄存器
对寄存器的访问都是通过发送CFG TLP;CFG TLP基于BNF的ID路由,除了需要BNF外,还需要寄存器地址;Header寄存器的基地址从0开始;而能力寄存器,则是基于链表的结构。
每一种能力由一个ID区分,每种能力下包含实现该能力的一组寄存器,这组寄存器的第一个寄存器的[7:0]域为该能力寄存器的Capability ID,[15:8]域为下一个能力寄存器的基地址Next Capability Pointer。所以访问某一个能力寄存器时,先确定Capability ID是否符合预期,如果不符合,则通过Next Capability Pointer访问一个能力寄存器,遍历直到访问到预期的能力寄存器。链表结构中的最后一个能力寄存器的Next Capability Pointer值为0。

链表的起始地址为Type0 Header中的地址0x34,Capabilities Pointer Register:表明链表中的第一个能力寄存器的基地址

PCIE扩展能力寄存器的起始地址为'h100。
BAR空间
PCIe设备内部的空间,在被HOST CPU访问之前,需要映射到主机的内存空间中。RC会访问EP获取BAR空间大小,然后在配置设备的BAR地址。BAR寄存器位于Header空间,其中EP具有6个BAR寄存器,RC/SWITCH具有2个BAR寄存器;Type1 Header中的Memory Limit和Memory Base可用于采用地址路由的MEM/IO TLP的判断条件。
BAR空间的大小在配置RTL代码时,就已通过coreConsultant配置好了,可参考第一篇:
BAR寄存器含义:
bit[0]: 表示MEM空间还是IO空间
bit[2:1]: 表示bar为64bit BAR还是32bit BAR;必须是相邻的两个bar组成一个64bit BAR
bit[3]:表示是预取还是非预取的内存空间

步骤如下:
- 未初始化的BAR,高bit为不定态,低bit提前被固化为0;
- RC发起CFG_WR TLP,写全1;被固化的bit位值不会改变;
- RC再发起CFG_RD TLP,读取的值其低12bit为0,则是一个4KB(2的12次方)空间
- RC发起CFG_WR TLP,将分配的4KB空间的基地址写入高20bit,这一定是4KB对齐的地址

VIP CFG TLP
VIP提供svt_pcie_driver_app_cfg_request_sequence,可发起RC对EP的CFG TLP;
svt_pcie_driver_app_cfg_request_sequence 可配置的变量与TLP Header类似:
bdf Bus number,Device number,Funciton number
register_number 配置寄存的地址
Last DW BE 为0,因为CFG TLP大小都是一个DW,只有1st DW BE有效
cfg_type 1: Type1 0: Type0
transaction_type CFG_WR or CFG_RD


可将svt_pcie_driver_app_cfg_request_sequence的调用封装为task:

枚举流程
在链路训练完成后,发送正常的MEM TLP之前,需要RC完成枚举步骤,总结如下几步:
(实际的PCIe枚举实现代码,可参考PCIe驱动代码;VIP也提供了svt_pcie_device_virtual_ep_enumeration_sequence,供直接调用;本节通过构造基本的CFG TLP,最简化的演示枚举流程)

第一步:确认vendor id和type类型
VENDOR_ID和HEADER_TYPE都位于Header空间,地址分别为0x0, 0xc

如下是对VENDOR_ID的CfgRd0,CplD返回数据为c316cdab;该数值为PCIE标准组织分配给synopsys的ID

第二步:分配BAR空间
本篇配置的bar0,bar1为32bit bar,bar2,bar4为64bit bar;u_cdm/cfg_bar_xxx下的信号为生效的地址:


第三步:配置相应的能力寄存器
如MSI/MSI-X能力寄存器可参考:🔗PCIE集成验证(五)MSI/MSI-X中断
第四步:配置MPS,使能MEM/IO/BUS
PCIe能力寄存器中的Device Capabilities Register [2:0]域为Max_Payload_Size Supported,为EP最大支持的值;



PCIe能力寄存器中的 Link Capabilities Register [7:5]域为Max_Payload_Size,[14:12]域为Max_Read_Request_Size

VIP侧的cfg配置:

最后将Command Register的[2:0]置为1,后面就可以正常发送MEM/IO TLP了。

922

被折叠的 条评论
为什么被折叠?



