Do sự cố với các biến thể IP cứng Altera® cho PCI® Express sử dụng Bộ điều khiển đặt lại mềm (SRC), nó có thể không rời khỏi trạng thái đặt lại nóng trong thời gian yêu cầu.
Lưu ý: Các thiết kế Gen2 trong Quartus bản phát hành 13.1 trở lên và tất cả các thiết kế Gen 3, đối với các thiết bị Stratix® V và Arria® V GZ, đều yêu cầu sử dụng SRC. Các thiết bị khác không sử dụng SRC.
Trình tự thiết lập lại nóng như sau:
- Máy chủ PCIe bắt đầu thiết lập lại nóng và chuyển sang trạng thái đặt lại nóng.
- IP cứng vào trạng thái đặt lại nóng.
- Khi máy chủ PCIe rời khỏi trạng thái đặt lại nóng, IP cứng sẽ vẫn ở chế độ đặt lại nóng thêm 2ms và sau đó thoát ra Detect.Quiet, theo đặc tả PCIe.
Tuy nhiên, trong các thiết kế sử dụng SRC, thời gian chờ 2ms sẽ được khởi động lại nếu bộ thu chuyển đổi locked_to_data trên bất kỳ làn nào đang hoạt động. Nếu tiếng ồn quá mức tồn tại trên bất kỳ làn đường nào, máy thu có thể chuyển locked_to_data. Mỗi lần chuyển đổi locked_to_data khiến bộ đếm 2ms được khởi động lại, có khả năng là mãi mãi, khiến IP cứng ở trạng thái đặt lại nóng liên tục.
Để khắc phục sự cố này, hãy thực hiện các bước sau.
Mở tệp altpcie_rs_serdes.v,
Tìm và bình luận mã bên dưới
dl_ltssm_r <= LTSSM;
dl_ltssm_rr <= dl_ltssm_r;
Nếu ((dl_ltssm_r == 5\'h14) &&; (rx_signaldetect_sync[7:0]==8\'h0) &&; (hotreset_cnt>20\'h0)) bắt đầu
hotreset_cnt <= hotreset_cnt-20\'h1;
Cuối
khác bắt đầu
hotreset_cnt <= (test_sim==1\'b1)?20\'h10:(rc_inclk_eq_125mhz==1\'b1)?20\'h3D091:20\'h7A121;
Cuối
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;
Chèn các dòng sau:
dl_ltssm_r <= LTSSM;
dl_ltssm_rr <= dl_ltssm_r;
nếu((dl_ltssm_r == 5\'h14) &&; (dl_ltssm_rr != 5\'h14)) bắt đầu
hotreset_cnt <= (test_sim==1\'b1)?20\'h10:(rc_inclk_eq_125mhz==1\'b1)?20\'h3D091:20\'h7A121;
Cuối
nếu(hotreset_2ms == 1\'b1) bắt đầu
exits_hotreset <= 1\'b0;
Cuối
else if ((dl_ltssm_r == 5\'h14) &&; (rx_signaldetect_sync[7:0]==8\'h0)) bắt đầu
exits_hotreset <= 1\'b1;
Cuối
Nếu ((exits_hotreset == 1\'b1) &&; (hotreset_cnt > 20\'h0)) bắt đầu
hotreset_cnt <= hotreset_cnt-20\'h1;
Cuối
hotreset_2ms <= (hotreset_cnt==20\'h1)?1\'b1:1\'b0;