เนื่องจากปัญหาในซอฟต์แวร์ Intel® Quartus® Prime Pro Edition เวอร์ชัน 22.3 สคริปต์ "ptp_fw.tcl" ที่มีให้ในตัวอย่างการออกแบบสําหรับตัวแปร PTP แบบหลายเลนของ Intel® FPGA Hard IP อีเธอร์เน็ต F-tile อาจให้ค่า rx_tam_adjust ที่ไม่ถูกต้อง
เมื่อต้องการหลีกเลี่ยงปัญหานี้ ให้ทําตามขั้นตอนต่อไปนี้:
- เปิดสคริปต์เฟิร์มแวร์ PTP ที่โฟลเดอร์ตัวอย่างการออกแบบ<>/hardware_test_design/hwtest/altera/ptp/ptp_fw.tcl
- ค้นหาและแทนที่บรรทัดของรหัสต่อไปนี้:
จาก | ถึง |
# b) คํานวณ การปรับพัลส์ สําหรับ {set fl 0} {$fl < $::FL} {incr fl} { |
# b) คํานวณการปรับพัลส์และตรวจสอบ การโรลโอเวอร์ cw_pos ของ FEC ระหว่างเลน FEC ที่ได้รับจากเลนตัวรับส่งสัญญาณเดียวกัน สําหรับ {set fl 0} {$fl < $::FL} {incr fl} { set cond2a [expr ($rx_fec_cw_pos_fl($fl_minus) > $rx_fec_cw_pos_fl($fl)] ถ้า {$cond 1a & $cond 1b} { |
ส่งคืน [รับ rx_xcvr_if_pulse_adj อาร์เรย์] |
ตั้งค่า l_rx_xcvr_if_pulse_adj [รับ rx_xcvr_if_pulse_adj อาร์เรย์] ส่งคืน [list $l_rx_xcvr_if_pulse_adj $l_rx_xcvr_if_pulse_adj_sign] |
determine_rx_ref_lane proc {lst_rx_xcvr_if_pulse_adj VL rx_pcs_bitslip_cnt rx_pcs_dlpulse_aligned l_rx_apulse_offset l_rx_apulse_offset_sign l_rx_apulse_wdelay l_rx_apulse_time ip_inst_base_addr} { # # อาร์กิวเมนต์: # ส่งคืน: 'array-list' สําหรับ rx spulse offset (+sign bit) rx ref pl/vl/fl
ชุดอาร์เรย์ rx_apulse_offset $l_rx_apulse_offset ชุดอาร์เรย์ rx_apulse_offset_sign $l_rx_apulse_offset_sign ชุดอาร์เรย์ rx_apulse_wdelay $l_rx_apulse_wdelay ชุดอาร์เรย์ rx_apulse_time $l_rx_apulse_time ชุดอาร์เรย์ rx_xcvr_if_pulse_adj $lst_rx_xcvr_if_pulse_adj
print_info_time "กําหนดเลนอ้างอิง RX" # a) กําหนด ออฟเซตพัลส์ซิงค์ (Alignment Marker) ด้วยการอ้างอิงไปยังพัลส์ async ถ้า {$::FEC > 0} { print_out "\tVariant : FEC>0" สําหรับ {set fl 0} {$fl < $::FL} {incr fl} { ตั้งค่า fl_minus [expr $fl - [expr $fl % $::P L_FL_MAP]] ตั้งค่า val0 [รูปแบบ 0x%X [expr $rx_xcvr_if_pulse_adj($fl_minus) &0x0000001F]] ตั้งค่า val1 [รูปแบบ 0x%X [expr $rx_xcvr_if_pulse_adj($fl) + $val 0]]
ถ้า {$val 1 > $rx_xcvr_if_pulse_adj ($fl_minus)} { ตั้งค่า rx_spulse_offset_sign($fl) 0 ตั้งค่า rx_spulse_offset_0 [รูปแบบ 0x%lX [expr [expr ($rx_xcvr_if_pulse_adj($fl) - $rx_xcvr_if_pulse_adj ($fl_minus)) + $val 0] * $ui * $::P L_FL_MAP]] ตั้งค่า rx_spulse_offset_1 [รูปแบบ 0x%lX [expr $rx_spulse_offset_0 &0x7FFFFFFFFFF]] ; # 43'rx_spulse_offset_0 ตั้งค่า rx_spulse_offset($fl) [รูปแบบ 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]] } อื่นๆ { ตั้งค่า rx_spulse_offset_sign($fl) 1 ตั้งค่า rx_spulse_offset_0 [รูปแบบ 0x%lX [expr [expr ($rx_xcvr_if_pulse_adj($fl_minus) - $rx_xcvr_if_pulse_adj($fl)) - $val 0] * $ui * $::P L_FL_MAP]] ตั้งค่า rx_spulse_offset_1 [รูปแบบ 0x%lX [expr $rx_spulse_offset_0 &0x7FFFFFFFFFF]] ; # 43'rx_spulse_offset_0 ตั้งค่า rx_spulse_offset($fl) [รูปแบบ 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]] } |
proc determine_rx_ref_lane {lst_rx_xcvr_if_pulse_adj lst_rx_xcvr_if_pulse_adj_sign VL ui rx_pcs_bitslip_cnt rx_pcs_dlpulse_aligned l_rx_apulse_offset l_rx_apulse_offset_sign l_rx_apulse_wdelay l_rx_apulse_time ip_inst_base_addr} { # # อาร์กิวเมนต์: # ส่งคืน: 'array-list' สําหรับ rx spulse offset (+sign bit) rx ref pl/vl/fl
ชุดอาร์เรย์ rx_apulse_offset $l_rx_apulse_offset ชุดอาร์เรย์ rx_apulse_offset_sign $l_rx_apulse_offset_sign ชุดอาร์เรย์ rx_apulse_wdelay $l_rx_apulse_wdelay ชุดอาร์เรย์ rx_apulse_time $l_rx_apulse_time ชุดอาร์เรย์ rx_xcvr_if_pulse_adj $lst_rx_xcvr_if_pulse_adj ชุดอาร์เรย์ rx_xcvr_if_pulse_adj_sign $lst_rx_xcvr_if_pulse_adj_sign
print_info_time "กําหนดเลนอ้างอิง RX" # a) กําหนด ออฟเซตพัลส์ซิงค์ (Alignment Marker) ด้วยการอ้างอิงไปยังพัลส์ async ถ้า {$::FEC > 0} { print_out "\tVariant : FEC>0" สําหรับ {set fl 0} {$fl < $::FL} {incr fl} { ตั้งค่า fl_minus [expr $fl - [expr $fl % $::P L_FL_MAP]] ตั้งค่า val0 [รูปแบบ 0x%X [expr $rx_xcvr_if_pulse_adj($fl_minus) &0x0000001F]] ตั้งค่า val1 [รูปแบบ 0x%X [expr $rx_xcvr_if_pulse_adj($fl) + $val 0]]
ถ้า {$rx_xcvr_if_pulse_adj_sign ($fl) == 1} { ตั้งค่า rx_spulse_offset_sign($fl) 1 ตั้งค่า rx_spulse_offset_0 [รูปแบบ 0x%lX [expr $rx_xcvr_if_pulse_adj($fl) * $ui * $::P L_FL_MAP]] ตั้งค่า rx_spulse_offset_1 [รูปแบบ 0x%lX [expr $rx_spulse_offset_0 &0x7FFFFFFFFFF]] ; # 43'rx_spulse_offset_0 ตั้งค่า rx_spulse_offset($fl) [รูปแบบ 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]] } อื่นๆ { ถ้า {$val 1 > $rx_xcvr_if_pulse_adj ($fl_minus)} { ตั้งค่า rx_spulse_offset_sign($fl) 0 ตั้งค่า rx_spulse_offset_0 [รูปแบบ 0x%lX [expr [expr ($rx_xcvr_if_pulse_adj($fl) - $rx_xcvr_if_pulse_adj ($fl_minus)) + $val 0] * $ui * $::P L_FL_MAP]] ตั้งค่า rx_spulse_offset_1 [รูปแบบ 0x%lX [expr $rx_spulse_offset_0 &0x7FFFFFFFFFF]] ; # 43'rx_spulse_offset_0 ตั้งค่า rx_spulse_offset($fl) [รูปแบบ 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]] } อื่นๆ { ตั้งค่า rx_spulse_offset_sign($fl) 1 ตั้งค่า rx_spulse_offset_0 [รูปแบบ 0x%lX [expr [expr ($rx_xcvr_if_pulse_adj($fl_minus) - $rx_xcvr_if_pulse_adj($fl)) - $val 0] * $ui * $::P L_FL_MAP]] ตั้งค่า rx_spulse_offset_1 [รูปแบบ 0x%lX [expr $rx_spulse_offset_0 &0x7FFFFFFFFFF]] ; # 43'rx_spulse_offset_0 ตั้งค่า rx_spulse_offset($fl) [รูปแบบ 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]] } } |
ชุดอาร์เรย์ rx_xcvr_if_pulse_adj [configure_rx_fec_cw_pos $inst_num $init_pl] |
ถ้า {$::FEC > 0} { ตั้งค่า int_list [configure_rx_fec_cw_pos $inst_num $init_pl] lassign $int_list l_rx_xcvr_if_pulse_adj l_rx_xcvr_if_pulse_adj_sign
ชุดอาร์เรย์ rx_xcvr_if_pulse_adj $l_rx_xcvr_if_pulse_adj ชุดอาร์เรย์ rx_xcvr_if_pulse_adj_sign $l_rx_xcvr_if_pulse_adj_sign ถ้า {$::d ebug} { สําหรับ {set fl 0} {$fl < $::FL} {incr fl} { print_out "\trx_xcvr_if_pulse_adj($fl) : [รูปแบบ 0x%08X $rx_xcvr_if_pulse_adj($fl)]" print_out "\trx_xcvr_if_pulse_adj_sign($fl) : [รูปแบบ 0x%08X $rx_xcvr_if_pulse_adj_sign($fl)] } } |
# ขั้นตอนที่ 3: ระบุเลนอ้างอิง RX ตั้งค่า int_list [determine_rx_ref_lane [อาร์เรย์ได้รับ rx_xcvr_if_pulse_adj]\ $VL\ |
# ขั้นตอนที่ 3: ระบุเลนอ้างอิง RX ตั้งค่า int_list [determine_rx_ref_lane [อาร์เรย์ได้รับ rx_xcvr_if_pulse_adj]\ [อาร์เรย์ได้รับ rx_xcvr_if_pulse_adj_sign]\ $VL |
- บันทึกไฟล์
ปัญหานี้ได้รับการแก้ไขแล้วเริ่มต้นด้วย Intel® Quartus®ซอฟต์แวร์ Prime Pro Edition เวอร์ชัน 22.4