由于使用软重置控制器 (SRC) 的 PCI® Express 变体的Altera®硬 IP 存在问题,它可能无法在规定的时间内离开热重置状态。
注意:Quartus 13.1 或更高版本中的 Gen2 设计以及面向 Stratix® V 和 Arria® V GZ 设备的所有 Gen3 设计都需要使用 SRC。其他设备不使用 SRC。
热重置的顺序如下:
- PCIe 主机启动热重置并进入热重置状态。
- 硬 IP 进入其热重置状态。
- 一旦 PCIe 主机离开其热重置状态,硬 IP 应再保持热重置 2 毫秒,然后退出 Detect.Quiet,根据 PCIe 规范。
但是,在使用 SRC 的设计中,如果接收器在任何活动通道上切换locked_to_data,则将重启 2ms 超时。如果任何通道上存在过多的噪音,接收器可能会切换 locked_to_data。 每次切换locked_to_data 都会导致 2ms 计数器重新启动,可能是永远重新启动,使硬 IP 处于持续的热重置状态。
要变通解决此问题,请执行以下步骤。
打开文件 altpcie_rs_serdes.v,
查找并注释掉下面的代码
dl_ltssm_r <= LTSSM;
dl_ltssm_rr <= dl_ltssm_r;
if ((dl_ltssm_r == 5\'h14) && (rx_signaldetect_sync[7:0]==8\'h0) && (hotreset_cnt>20\'h0)) 开始
hotreset_cnt <= hotreset_cnt-20\'h1;
结束
否则开始
hotreset_cnt <= (test_sim==1\'b1)?20\'h10:(rc_inclk_eq_125mhz==1\'b1)?20\'h3D091:20\'h7A121;
结束
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;
插入以下行:
dl_ltssm_r <= LTSSM;
dl_ltssm_rr <= dl_ltssm_r;
if((dl_ltssm_r == 5\'h14) && (dl_ltssm_rr != 5\'h14)) begin
hotreset_cnt <= (test_sim==1\'b1)?20\'h10:(rc_inclk_eq_125mhz==1\'b1)?20\'h3D091:20\'h7A121;
结束
if(hotreset_2ms == 1\'b1) 开始
exits_hotreset <= 1\'b0;
结束
否则如果 ((dl_ltssm_r == 5\'h14) && (rx_signaldetect_sync[7:0]==8\'h0)) 开始
exits_hotreset <= 1\'b1;
结束
if ((exits_hotreset == 1\'b1) && (hotreset_cnt > 20\'h0)) 开始
hotreset_cnt <= hotreset_cnt-20\'h1;
结束
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;