문서 ID: 000092741 콘텐츠 형태: 정오표 마지막 검토일: 2023-08-15

F-tile Ethernet 인텔® FPGA Hard IP의 멀티레인 PTP 변형에 대한 설계 예제에 있는 스크립트를 사용할 때 rx_tam_adjust에 대해 계산된 값이 올바르지 않은 이유는 무엇입니까?

환경

    인텔® Quartus® Prime Pro Edition
BUILT IN - ARTICLE INTRO SECOND COMPONENT
설명

인텔® Quartus® Prime Pro Edition 소프트웨어 버전 22.3의 문제로 인해 F-타일 이더넷 인텔® FPGA Hard IP의 다중 레인 PTP 변형에 대한 설계 예에 제공된 "ptp_fw.tcl" 스크립트가 잘못된 rx_tam_adjust 값을 생성할 수 있습니다.

해결 방법

이 문제를 해결하려면 다음과 같이 하십시오.

  1. <생성된 예제 디자인 폴더>/hardware_test_design/hwtest/altera/ptp/ptp_fw.tcl에 있는 PTP 펌웨어 스크립트를 엽니다.
  2. 다음 코드 줄을 찾아 바꿉니다.
보낸 사람받는 사람

# b) 펄스 조정 계산

{set fl 0} {$fl < $::FL} {incr fl} {
set rx_xcvr_if_pulse_adj($fl) [형식 0x%X $rx_fec_cw_pos_fl($fl)]
}

# b) 펄스 조정계산 하고 동일한 트랜시버 레인에서 수신한 FEC 레인 간 FEC의 cw_pos 롤오버 확인

{set fl 0} {$fl < $::FL} {incr fl} {
fl_minus 설정 [expr $fl - [expr $fl % $::P L_FL_MAP]]
설정 cond1a [expr ($rx_fec_cw_pos_fl($fl) >= $rx_fec_cw_pos_fl($fl_minus))] 설정
cond1b 설정 [expr (($rx_fec_cw_pos_fl($fl) - $rx_fec_cw_pos_fl($fl_minus)) > 0x4E20)]

설정 cond2a [expr ($rx_fec_cw_pos_fl($fl_minus) > $rx_fec_cw_pos_fl($fl))] 설정
cond2b 설정 [expr (($rx_fec_cw_pos_fl($fl_minus) - $rx_fec_cw_pos_fl($fl)) > 0x4E20)]

if {$cond 1a && $cond 1b} {
{$::FEC == 2} {
# 한국문화위원회(KRFEC)
set rx_xcvr_if_pulse_adj($fl) [expr 0x5280 - $rx_fec_cw_pos_fl($fl)]
} elseif {($::FEC == 3) || ($::FEC == 4)} {
# KP/LLFEC
set rx_xcvr_if_pulse_adj($fl) [expr 0x5500 - $rx_fec_cw_pos_fl($fl)] 설정
}
rx_xcvr_if_pulse_adj_sign($fl) 0x1 설정
} elseif {$cond 2a && $cond 2b} {
{$::FEC == 2} {
# 한국문화위원회(KRFEC)
set rx_xcvr_if_pulse_adj($fl) [expr 0x5280 + $rx_fec_cw_pos_fl($fl)] 설정
} elseif {($::FEC == 3) || ($::FEC == 4)} {
# KP/LLFEC
설정 rx_xcvr_if_pulse_adj($fl) [expr 0x5500 + $rx_fec_cw_pos_fl($fl)]
}
rx_xcvr_if_pulse_adj_sign($fl) 0x0 설정
} 다른 {
set rx_xcvr_if_pulse_adj($fl) [형식 0x%X $rx_fec_cw_pos_fl($fl)]
rx_xcvr_if_pulse_adj_sign($fl) 0x0 설정
}
}

반환 [배열 가져 오기 rx_xcvr_if_pulse_adj]

set l_rx_xcvr_if_pulse_adj [array get rx_xcvr_if_pulse_adj]
set l_rx_xcvr_if_pulse_adj_sign [array get rx_xcvr_if_pulse_adj_sign]

return [목록 $l_rx_xcvr_if_pulse_adj $l_rx_xcvr_if_pulse_adj_sign]

proc determine_rx_ref_lane {lst_rx_xcvr_if_pulse_adj 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} {

#

# 인수:

# 반환: rx 펄스 오프셋(+sign bit)에 대한 'array-lists'. 수신 참조 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) 오프셋 결정

{$::FEC > 0}인 경우 {

print_out "\t변형: FEC>0"

{set fl 0} {$fl < $::FL} {incr fl} {

fl_minus 설정 [expr $fl - [expr $fl % $::P L_FL_MAP]]

set val0 [format 0x%X [expr $rx_xcvr_if_pulse_adj($fl_minus) & 0x0000001F]]

set val1 [format 0x%X [expr $rx_xcvr_if_pulse_adj($fl) + $val 0]]

if {$val 1 > $rx_xcvr_if_pulse_adj($fl_minus)} {

rx_spulse_offset_sign($fl) 0 설정

set rx_spulse_offset_0 [format 0x%lX [expr [expr ($rx_xcvr_if_pulse_adj($fl) - $rx_xcvr_if_pulse_adj($fl_minus)) + $val 0] * $ui * $::P L_FL_MAP]]

set rx_spulse_offset_1 [format 0x%lX [expr $rx_spulse_offset_0 & 0x7FFFFFFFFFF]] ; # 43'rx_spulse_offset_0

set rx_spulse_offset($fl) [format 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]]

} 다른 {

세트 rx_spulse_offset_sign($fl) 1

set rx_spulse_offset_0 [format 0x%lX [expr [expr ($rx_xcvr_if_pulse_adj($fl_minus) - $rx_xcvr_if_pulse_adj($fl)) - $val 0] * $ui * $::P L_FL_MAP]]

set rx_spulse_offset_1 [format 0x%lX [expr $rx_spulse_offset_0 & 0x7FFFFFFFFFF]] ; # 43'rx_spulse_offset_0

set rx_spulse_offset($fl) [format 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} {

#

# 인수:

# 반환: rx 펄스 오프셋(+sign bit)에 대한 'array-lists'. 수신 참조 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) 오프셋 결정

{$::FEC > 0}인 경우 {

print_out "\t변형: FEC>0"

{set fl 0} {$fl < $::FL} {incr fl} {

fl_minus 설정 [expr $fl - [expr $fl % $::P L_FL_MAP]]

set val0 [format 0x%X [expr $rx_xcvr_if_pulse_adj($fl_minus) & 0x0000001F]]

set val1 [format 0x%X [expr $rx_xcvr_if_pulse_adj($fl) + $val 0]]

if {$rx_xcvr_if_pulse_adj_sign($fl) == 1} {

세트 rx_spulse_offset_sign($fl) 1

set rx_spulse_offset_0 [format 0x%lX [expr $rx_xcvr_if_pulse_adj($fl) * $ui * $::P L_FL_MAP]]

set rx_spulse_offset_1 [format 0x%lX [expr $rx_spulse_offset_0 & 0x7FFFFFFFFFF]] ; # 43'rx_spulse_offset_0

set rx_spulse_offset($fl) [format 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]]

} 다른 {

if {$val 1 > $rx_xcvr_if_pulse_adj($fl_minus)} {

rx_spulse_offset_sign($fl) 0 설정

set rx_spulse_offset_0 [format 0x%lX [expr [expr ($rx_xcvr_if_pulse_adj($fl) - $rx_xcvr_if_pulse_adj($fl_minus)) + $val 0] * $ui * $::P L_FL_MAP]]

set rx_spulse_offset_1 [format 0x%lX [expr $rx_spulse_offset_0 & 0x7FFFFFFFFFF]] ; # 43'rx_spulse_offset_0

set rx_spulse_offset($fl) [format 0x%X [expr $rx_spulse_offset_1 >> [expr 28 - 16]]]

} 다른 {

세트 rx_spulse_offset_sign($fl) 1

set rx_spulse_offset_0 [format 0x%lX [expr [expr ($rx_xcvr_if_pulse_adj($fl_minus) - $rx_xcvr_if_pulse_adj($fl)) - $val 0] * $ui * $::P L_FL_MAP]]

set rx_spulse_offset_1 [format 0x%lX [expr $rx_spulse_offset_0 & 0x7FFFFFFFFFF]] ; # 43'rx_spulse_offset_0

set rx_spulse_offset($fl) [format 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 기준 레인 결정

set int_list [determine_rx_ref_lane [array get rx_xcvr_if_pulse_adj]\

$VL\

# 3단계: RX 기준 레인 결정

set int_list [determine_rx_ref_lane [array get rx_xcvr_if_pulse_adj]\

[배열 가져 오기 rx_xcvr_if_pulse_adj_sign] \

$VL

  1. 파일 저장

이 문제는 인텔® Quartus® Prime Pro Edition 소프트웨어 버전 22.4부터 해결되었습니다.

관련 제품

이 문서는 다음 항목에 적용됩니다. 2 제품

인텔® Agilex™ F-시리즈 FPGAs 및 SoC FPGAs
인텔® Agilex™ I-시리즈 FPGAs 및 SoC FPGAs

1

이 페이지의 콘텐츠는 원본 영어 콘텐츠에 대한 사람 번역 및 컴퓨터 번역의 조합으로 완성되었습니다. 이 콘텐츠는 편의와 일반적인 정보 제공을 위해서만 제공되었으며, 완전하거나 정확한 것으로 간주되어선 안 됩니다. 이 페이지의 영어 버전과 번역 간 모순이 있는 경우, 영어 버전이 우선적으로 적용됩니다. 이 페이지의 영어 버전을 확인하십시오.