트랜시버 재구성 \'reconfig_busy\' 출력 포트가 고정되어 리셋 어설션 후 높은 것으로 주장될 수 있습니다. 영향을 받는 재구성 컨트롤러에 연결된 트랜시버 채널도 재설정에 갇혀 있을 수 있습니다. 재구성 컨트롤러를 재설정한 후에도 \'reconfig_busy\' 출력 포트가 고정되어 있습니다. 장치를 다시 프로그래밍하는 것만으로 문제를 해결할 수 있습니다.
이 증상은 트랜시버 재구성 컨트롤러의 내부 재설정 구조로 인해 발생할 수 있습니다. M20K RAM의 주소 버스를 구동하는 로직에 대한 비동기 재설정 어설션으로 비동기 로직 전파가 발생할 수 있습니다. 이로 인해 M20K에 여러 주소선이 동시에 어설션될 수 있으며, 이로 인해 비트 셀 간에 충전 공유가 발생하여 M20K의 내용물이 손상될 수 있습니다.
이 손상은 PMA 보정에 사용되는 Nios® II 프로세서가 포함되어 있고 프로세서\의 프로그램 코드가 M20K RAM에 저장되므로 Stratix® V 및 Arria® V GZ 장치 트랜시버 재구성 컨트롤러에 영향을 미칩니다. Nios® II 프로그램 메모리 내에서 손상이 발생하면 프로세서가 잠기게 되어 reconfig_busy 출력 포트가 높게 고정될 수 있습니다. M20K 콘텐츠는 장치 프로그래밍 중에만 로드되기 때문에 이 상황에서 복구는 장치를 다시 프로그래밍해야만 가능합니다.
이 문제에 대한 수정사항은 트랜시버 재구성 컨트롤러의 내부 리셋 컨트롤러와 재설정 구조를 변경하여 동기화 리셋을 사용할 뿐만 아니라 재설정 조건 중 M20K clock_enable 포트를 선제적으로 해제합니다.
수정 사항은 Quartus® II 소프트웨어의 향후 버전에서 사용할 수 있습니다. mySupport에서 서비스 요청을 제출하여 Quartus II 소프트웨어의 이전 버전에 대한 패치를 제공할 수 있습니다. 솔루션이 즉시 필요한 경우 다음 지침을 사용하여 수동으로 수정을 적용할 수 있습니다.
추가 또는 수정해야 하는 파일은 9개 있습니다.
-
altera_reset_controller_early_ce_mod.v(추가)
-
altera_reset_synchronizer_early_ce_mod.v(추가)
-
트랜시버 재구성 컨트롤러와 관련된 QIP 파일(수정)
-
alt_xcvr_reconfig.sv(수정)
-
alt_xcvr_reconfig_soc.sv(수정)
-
alt_xcvr_reconfig_cpu.v(수정)
-
alt_xcvr_reconfig_cpu_ram.sv(수정)
-
sv_xrbasic_lif_csr.sv(수정)
-
sv_xcvr_reconfig_mif_avmm.sv(수정)
이 9개 파일은 트랜시버 재구성 컨트롤러가 생성된 디렉토리에 있어야 합니다.
altera_reset_controller_early_ce_mod.v를 다운로드하여 트랜시버 재구성 파일이 보관된 디렉토리에 배치합니다.
다운로드 altera_reset_synchronizer_early_ce_mod.v 트랜시버 재구성 파일이 보관되는 디렉토리에 배치합니다.
이 두 파일을 설계에 추가하려면 Transceiver 재구성 컨트롤러 인스턴스와 관련된 .qip 파일을 찾아 수정하고 다음 두 줄을 파일에 추가합니다.
set_global_assignment -library "LIBRARY_NAME" -name VERILOG_FILE [파일 조인 $::quartus(qip_path) "LIBRARY_PATH/altera_reset_controller_early_ce_mod.v"]
set_global_assignment -library "LIBRARY_NAME" -name VERILOG_FILE [파일 조인 $::quartus(qip_path) "LIBRARY_PATH/altera_reset_synchronizer_early_ce_mod.v"]
위의 두 줄에서 트랜시버 재구성 컨트롤러의 .qip 파일의 다른 항목과 일치하도록 LIBRARY_NAME 수정하고 LIBRARY_PATH.
alt_xcvr_reconfig.sv의 경우 다음을 수정하십시오.
-
alt_xcvr_resync 모듈 인스턴스화를 찾아 'd'와 '재설정' 포트 간의 연결을 반전합니다. 수정되면 인스턴스화는 다음과 같습니다.
alt_xcvr_resync #(
. INIT_VALUE (1)
) inst_reconfig_reset_sync (
.clk(mgmt_clk_clk),
.d(mgmt_rst_reset),
.reset(1\'b0),
.q(r_mgmt_rst_reset)
);
alt_xcvr_reconfig_soc.sv의 경우 다음을 수정하십시오.
모듈 상단 부근에 다음 와이어 정의를 추가합니다.
와이어 cpu_reset_req;
alt_xcvr_reconfig_cpu 모듈의 인스턴스화를 찾아 다음 포트를 추가합니다.
.ram_ce(cpu_reset_req),
alt_xcvr_reconfig_cpu_ram 모듈의 인스턴스화를 찾아 다음 포트를 추가합니다.
.ram_ce(cpu_reset_req),
alt_xcvr_reconfig_cpu.v의 경우 다음을 수정하십시오.
-
최상위 수준에 다음 포트를 추가합니다.
출력 와이어 ram_ce,
-
모듈에 다음 코드를 추가합니다.
와이어 m20k_gate;
와이어 altera_ram_clock_enable;
할당 altera_ram_clock_enable = ~ m20k_gate;
할당 ram_ce = altera_ram_clock_enable;
-
altera_reset_controller 인스턴스화를 찾아 이를 altera_reset_controller_early_ce_mod 인스턴스화로 변경합니다. 이 인스턴스화에 m20k_gate 포트를 추가하고 m20k_gate 신호에 연결합니다. 이러한 수정을 한 후 인스턴스화는 다음과 같이 보일 것입니다.
altera_reset_controller_early_ce_mod #(
. NUM_RESET_INPUTS(1),
. OUTPUT_RESET_SYNC_EDGES("deassert"),
. SYNC_DEPTH (2)
) rst_controller (
.reset_in0(~reset_reset_n), // reset_in0.reset
.clk(clk_clk), // clk.clk
.reset_out(reconfig_ctrl_reset_reset), // reset_out.reset
.m20k_gate(m20k_gate),
.reset_in1(1\'b0), //(종료됨)
.reset_in2(1\'b0), //(종료됨)
.reset_in3(1\'b0), //(종료됨)
.reset_in4(1\'b0), //(종료됨)
.reset_in5(1\'b0), //(종료됨)
.reset_in6(1\'b0), //(종료됨)
.reset_in7(1\'b0), //(종료됨)
.reset_in8(1\'b0), //(종료됨)
.reset_in9(1\'b0), //(종료됨)
.reset_in10(1\'b0), //(종료됨)
.reset_in11(1\'b0), //(종료됨)
.reset_in12(1\'b0), //(종료됨)
.reset_in13(1\'b0), //(종료됨)
.reset_in14(1\'b0), //(종료됨)
.reset_in15(1\'b0) //(종료)
);
alt_xcvr_reconfig_cpu_ram.sv 파일의 경우 다음을 수정합니다.
-
다음 입력 포트를 추가합니다.
입력 ram_ce,
-
altsyncram 인스턴스화를 찾아 클럭엔0 포트를 수정하여 새로운 ram_ce 입력 포트에 연결합니다.
.clocken0(ram_ce),
-
defparam clock_enable_input/output_a/b 정의를 다음과 같이 수정합니다.
altsyncram_component.clock_enable_input_a = "NORMAL",
altsyncram_component.clock_enable_input_b = "NORMAL",
altsyncram_component.clock_enable_output_a = "NORMAL",
altsyncram_component.clock_enable_output_b = "NORMAL",
sv_xrbasic_lif_csr.sv 파일의 경우 다음을 수정합니다.
-
논리 채널 주소를 제어하는 순차적 블록 을 찾습니다. 이 블록은 항상 위의 "// 논리 채널 레지스터"라는 주석으로 식별할 수 있습니다. 감도 목록에서 재설정 조건을 제거합니다. 수정되면 항상 블록의 시작은 다음과 같습니다.
논리 채널 레지스터
항상 @(reconfig_clk 포즈) 시작
경우(Reset == 1) 시작
...
-
네이티브 재구성 주소 레지스터를 제어하는 순차적 블록 을 찾습니다. 이 블록은 항상 "// 네이티브 재구성 주소 레지스터, 채널 오프셋 주소 또는 물리적 주소로 해석될 수 있습니다"라는 주석으로 식별할 수 있습니다. 감도 목록에서 재설정 조건을 제거합니다. 수정되면 항상 블록의 시작은 다음과 같습니다.
네이티브 재구성 주소 레지스터, 채널 오프셋 주소 또는 실제 주소로 해석될 수 있습니다.
항상 @(포즈 reconfig_clk) 시작
경우(Reset == 1) 시작
...
sv_xcvr_reconfig_mif_avmm.sv 파일의 경우 트랜시버 재구성 컨트롤러 Megawizard GUI에서 채널 또는 PLL 재구성이 활성화된 경우에만 이 변경이 필요합니다. 다음을 수정하십시오.
-
위에 "// Avalon 출력 및 내부 스토리지" 주석이 있는 순차적 블록 을 찾아 감도 목록에서 재설정 상태를 제거합니다. 수정되면 항상 블록의 시작은 다음과 같습니다.
Avalon 출력 및 내부 스토리지
항상 @(posedge clk)
시작
(재설정) 시작하는 경우
...
이러한 모든 변경 사항이 변경되면 설계를 다시 컴파일해야 합니다.