【PCIe 实战】SNPS PCIe 开启 SRIS mode

简介: 【PCIe 实战】SNPS PCIe 开启 SRIS mode

1. RTL 配置 SRIS


   phyN_mplla/b_ssc_en = 1,PHY 的寄存器,对于多个 PHY 的 clock 串在一起的情况,所有 PHY 都要配,不是只配第一块 PHY,repeat 过来的 RefClk 没有扩频。


   pipe_rxN_sris_mode_en = 1,该信号从 Controller 外部接进来,接口信号名为 app_sirs_mode,具体可以来源于 PIN 或外部寄存器。


Note: 无需配置 skip_interval (SYMBOL_FILTER_1_OFF 寄存器的 SKP_INT_VAL 字段),配了也不起作用,该字段仅在非 SRIS mode 下有效。




2. VIP 配置 SRIS


参考 pcie_svt_uvm_user_guide chapter 6.7


PL config 中配置如下:


  •    配置 ssc_mode,支持往下扩频及居中扩频,不支持往上扩频。


  •    配置 fixed_ppm_due_to_tx_rx_xo,收发端separate clock 之间的固定频差,± 300 ppm 之间,默认 300 ppm。


  •    配置 ssc_max_spread,默认 5000 ppm,这是 spec 规定的最大 ppm 值。


  •    配置 ssc_modulation_rate,不配的话默认采用 33 KHz 调制频率。


  •    配置 tx skp interval,该参数决定了 VIP 发送 SKP 的符号间隔,该参数不要超过 153,这是 spec 要求的,SRIS mode 下最多间隔 153 个 symbol 就得发 SKP 了(参考 SNPS PCIe EP spec chapter 3.21,see Fig. 1.)。


  •    配置 rx skp interval,VIP会根据该配置检查接收到的 SKP 及其间隔,不符合预期将报错。


ab2f948e3ea24c5ab3b81b7af0f880a6.png

▲Fig.1



注意:


   elastic_buffer_mode 是选择 elastic buffer half-full / empty 模式的,默认配置可工作。


   enable_sris_elastic_buffer_mode,置一后 elastic buffer 深度加大,目前看,不配也能work。


   只有 DUT 开启 SRIS,VIP 不开 SRIS,也能工作。此时 VIP 的 min/max_tx/rx_skp_interval_in_blocks/symbol_times 仍然按照 SRIS 配置。


   以下两项 serdes 相关也必须配置:


   ○ 配置clock tolerance,设置允许的 clock jitter 裕度。


   ○ 开启clock width adjustments,允许 VIP 调整时钟脉宽。



示例代码如下

// 配置 gen1~gen5 的 ssc_mode,支持 down spread, center spread,no up spread
xxx.pcie_cfg.pl_cfg_ssc_mode[0] = svt_pcie_pl_configuration::SSC_MODE_DOWN_SPREAD;
xxx.pcie_cfg.pl_cfg_ssc_mode[1] = svt_pcie_pl_configuration::SSC_MODE_DOWN_SPREAD;
xxx.pcie_cfg.pl_cfg_ssc_mode[2] = svt_pcie_pl_configuration::SSC_MODE_DOWN_SPREAD;
xxx.pcie_cfg.pl_cfg_ssc_mode[3] = svt_pcie_pl_configuration::SSC_MODE_DOWN_SPREAD;
xxx.pcie_cfg.pl_cfg_ssc_mode[4] = svt_pcie_pl_configuration::SSC_MODE_DOWN_SPREAD;
// set max spread of ssc, default 5000 ppm
xxx.pipe_cfg.pl_cfg.ssc_max_spread = 5000;
// set ssc modulation rate, default 33 KHz
xxx.pcie_cfg.pl_cfg.ssc_modulation_rate = 2’b11; // default use 33 KHZ
// set tx rx osc fre , -300 ~ 300 ppm
xxx.pcie_cfg.pl_cfg.fixed_ppm_due_to_tx_rx_xo = 300; // should be -300 ~ 300
// set tx skp interval, max should less than 153
xxx.pcie_cfg.pl_cfg.min_tx_skp_interval_in_symbol_times = 153;
xxx.pcie_cfg.pl_cfg.max_tx_skp_interval_in_symbol_times = 153;
xxx.pcie_cfg.pl_cfg.min_tx_skp_interval_in_blocks = 37;
xxx.pcie_cfg.pl_cfg.max_tx_skp_interval_in_blocks = 37;
// set rx side skip interval to check received skip symbol
xxx.pcie_cfg.pl_cfg.min_rx_skp_interval_in_symbol_times = 1;
xxx.pcie_cfg.pl_cfg.max_rx_skp_interval_in_symbol_times = 153;
xxx.pcie_cfg.pl_cfg.min_rx_skp_interval_in_blocks = 1;
xxx.pcie_cfg.pl_cfg.max_rx_skp_interval_in_blocks = 37;
// enlarge  clock tolerance, 5600 ppm, SER_GEN_0 means lane0
defparam spd_0.SVT_PCIE_UI_SERIAL_CLK_TOLERANCE = 0.005600;
defparam spd_0.m_ser.port0.SER_GEN_0.serdes.CLK_TOLERANCE = 0.005600;
defparam spd_0.m_ser.port0.SER_GEN_1.serdes.CLK_TOLERANCE = 0.005600;
defparam spd_0.m_ser.port0.SER_GEN_2.serdes.CLK_TOLERANCE = 0.005600;
defparam spd_0.m_ser.port0.SER_GEN_3.serdes.CLK_TOLERANCE = 0.005600;
...
// allow clock width adjustment
defparam spd_0.m_ser.port0.SER_GEN_0.serdes.ALLOW_CLK_WIDTH_ADJUSTMENT = 1;
defparam spd_0.m_ser.port0.SER_GEN_1.serdes.ALLOW_CLK_WIDTH_ADJUSTMENT = 1;
defparam spd_0.m_ser.port0.SER_GEN_2.serdes.ALLOW_CLK_WIDTH_ADJUSTMENT = 1;
defparam spd_0.m_ser.port0.SER_GEN_3.serdes.ALLOW_CLK_WIDTH_ADJUSTMENT = 1;
...



遇到的坑:


  1.    不要开 sris_mode_enable,目前仅用于控制 compliance pattern 发送,开了后 training 不起来。


  1.    min_tx_skp_interval_in_symbol_times 及 min_tx_skp_interval_in_blocks 一定不能设置为 1,建议设置得跟 max 值一样。设置为 1 后,VIP 规划 SKP interval 不太友好,L0 后一直发 SKP,Tx DLLP Queue 中的数据无法发出。




  •    如果设置 enable_sris_elastic_buffer_mode=1,log 提示能 link up 能起来,但是只有PL link up 成功,DL link up没起来。LTSSM 也能走到 L0,但是 DUT 发给 VIP INIT_FC1_* 后 VIP 不回任何 INIT_FC 相关,DUT 就一直发INIT_FC1,整个卡死了。


  •    如果设置 enable_sris_elastic_buffer_mode=0,log 提示能 link up 能起来,DL、PL 均 link up成功,LTSSM 也能走到 L0,但是收发完INIT_FC1后 DUT 发给 VIP INIT_FC2_*, VIP 不回 INIT_FC2 相关,DUT 就一直发INIT_FC2,卡死。


  •    整体来看 enable_sris_elastic_buffer_mode 配不配都行,配能够加大elastic buffer 深度。



目录
相关文章
|
物联网 定位技术
M.2或MINIPCIE或PCIE XX设备调试记录
M.2或MINIPCIE或PCIE XX设备调试记录
|
缓存 移动开发 JavaScript
PCIe 参考时钟架构 (Refclk Architecture)
PCIe 参考时钟架构 (Refclk Architecture)
5232 0
PCIe 参考时钟架构 (Refclk Architecture)
【PCIe 协议】听说你做 PCIe 很多年,还不知道 PCIe Hierarchy ID 是什么 ???
【PCIe 协议】听说你做 PCIe 很多年,还不知道 PCIe Hierarchy ID 是什么 ???
711 0
【PCIe 协议】听说你做 PCIe 很多年,还不知道 PCIe Hierarchy ID 是什么 ???
如何在低功耗模式下debug MCU?
如何在低功耗模式下debug MCU?
|
7月前
|
开发工具 芯片 Perl
【ZYNQ】裸机 PS + PL 双网口实现之 ZYNQ 配置
【ZYNQ】裸机 PS + PL 双网口实现之 ZYNQ 配置
1007 0
|
缓存 开发工具 内存技术
ZYNQ-使用自定义AXI总线IP核进行DDR读写测试(二)
ZYNQ-使用自定义AXI总线IP核进行DDR读写测试
818 0
ZYNQ-使用自定义AXI总线IP核进行DDR读写测试(二)
|
芯片
Bust Mode(降压模式)和Boost Mode(升压模式)
升压与降压一般是指电源电路的工作模式,有些电源IC可以同时支持升压和降压模式。
376 0
|
存储
深入理解AMBA总线(六)AHB-lite Slave响应和其它控制信号
深入理解AMBA总线(六)AHB-lite Slave响应和其它控制信号
865 0
linux3.10使用PCIE-USB警告处理:needs XHCI_TRUST_TX_LENGTH quirk?
linux3.10使用PCIE-USB警告处理:needs XHCI_TRUST_TX_LENGTH quirk?
167 0
linux3.10使用PCIE-USB警告处理:needs XHCI_TRUST_TX_LENGTH quirk?
RK3399平台开发系列讲解(PCI/PCI-E)5.53、PCIE RC侧 地址映射
RK3399平台开发系列讲解(PCI/PCI-E)5.53、PCIE RC侧 地址映射
220 0
RK3399平台开发系列讲解(PCI/PCI-E)5.53、PCIE RC侧 地址映射