FPGA 설계에서의 동기 및 비동기 리셋 이해

FPGA 설계에서 리셋은 시스템의 초기 상태를 설정하고 예상치 못한 동작을 방지하는 데 필수적인 부분입니다. Xilinx는 일반적으로 동기 리셋을 권장하며, 이는 FPGA 아키텍처와의 통합 용이성과 유연성 측면에서 여러 이점을 제공하기 때문입니다.

리셋의 필요성과 Xilinx 권장 사항

Xilinx의 "UltraFast Design Methodology Guide for FPGAs and SoCs (UG949)"에 따르면, Xilinx FPGA는 구성 완료 시 전용 전역 설정/리셋(GSR) 신호를 통해 모든 플립플롭에 초기 값을 할당합니다. 특별히 지정하지 않으면 대부분의 시퀀스 로직은 기본값 0으로 초기화되며, FDSE 및 FDPE와 같은 특정 소자는 논리 1로 초기화됩니다. 따라서 전원 인가 시 초기화를 위한 별도의 전역 리셋 코드는 대부분의 경우 불필요합니다.

하지만 제어 가능한 리셋이 필요한 소프트 리셋의 경우, 외부 핀이나 Zynq 시리즈 FPGA의 PS(Processing System)를 통해 특정 로직 회로를 리셋하기 위해 사용자 정의 리셋 회로를 설계해야 할 수 있습니다.

Xilinx는 리셋 설계 시 신중한 판단을 강조하며, 일반적으로 제어 로직에는 리셋이 필요하지만 데이터 로직에는 일반적으로 필요하지 않다고 언급합니다. 이는 데이터 신호의 유효성이 종종 제어 신호(예: enable 또는 valid 신호)에 의해 결정되기 때문입니다.

리셋 신호 사용을 최소화하는 것은 다음과 같은 이점을 제공합니다.

  • 리셋 신호선의 팬아웃(fan-out) 제한
  • 리셋 라우팅에 필요한 상호 연결 감소
  • 리셋 경로의 타이밍 단순화
  • 전반적인 성능, 면적 및 전력 소모 개선

동기 리셋 vs. 비동기 리셋

Xilinx는 동기 리셋을 선호하는 몇 가지 주요 이유가 있습니다.

  • 자원 통합: 동기 리셋은 FPGA 아키텍처 내의 더 많은 자원과 직접 매핑될 수 있습니다.
  • 성능 영향: 비동기 리셋은 일반적인 로직 구조의 성능에 영향을 줄 수 있습니다. 모든 Xilinx FPGA의 범용 레지스터는 비동기 또는 동기 리셋으로 프로그래밍될 수 있지만, 비동기 리셋을 사용하면 제어 세트(control set)가 증가하지 않더라도 모든 레지스터에 리셋 신호를 라우팅해야 하므로 라우팅 복잡성이 증가합니다.
  • 유연성: 더 높은 집적도 또는 미세 조정을 위해 동기 리셋은 제어 세트를 재매핑하는 데 더 많은 유연성을 제공합니다. 더 최적화된 슬라이스(slice)에서 호환되지 않는 리셋이 발견되면, 동기 리셋은 레지스터의 데이터 경로로 재매핑될 수 있습니다. 이를 통해 필요한 라우팅 자원 사용률을 줄이고 집적도를 높여 성능을 개선할 수 있습니다.
  • 다중 사이클 단언: 비동기 리셋은 회로가 올바르게 리셋되고 안정화되도록 보장하기 위해 다중 사이클 단언(multi-cycle assertion)이 필요할 수 있지만, 동기 리셋은 이러한 요구 사항이 없습니다.
  • 메모리 손상 위험: 비동기 리셋이 활성 상태일 때 Block RAM, LUTRAM 및 SRL의 메모리 내용이 손상될 가능성이 더 높습니다. 이는 특히 Block RAM, LUTRAM 및 SRL의 입력 핀에 연결된 비동기 리셋 레지스터에서 두드러집니다.
  • 자원 제약: DSP48 및 Block RAM과 같은 일부 자원은 블록 내 레지스터에 대해 동기 리셋만 지원합니다. 이러한 자원과 관련된 레지스터에 비동기 리셋을 사용하면 기능을 손상시키지 않고 이러한 블록으로 직접 푸시(push)하지 못할 수 있습니다.

Verilog 코드 예시 (동기 및 비동기 리셋)

동기 리셋: 민감도 목록에 클럭만 포함됩니다.

always @(posedge clk) begin
    if (rst) begin
        // 리셋 시 동작
    end else begin
        // 정상 동작
    end
end

비동기 리셋: 민감도 목록에 클럭과 리셋 신호가 모두 포함됩니다.

always @(posedge clk or posedge rst) begin
    if (rst) begin
        // 리셋 시 동작
    end else begin
        // 정상 동작
    end
end

비동기 리셋의 동기 처리

일반적으로 FPGA 로직의 전역 비동기 리셋 신호로 "비동기" 리셋 신호를 직접 사용하는 것은 권장되지 않습니다. 두 가지 주요 이유가 있습니다.

  1. 비동기 리셋의 "비동기" 특성은 각 로직의 리셋이 비동기적으로 발생하게 하여 설계 문제를 일으킬 수 있습니다.
  2. 비동기 리셋은 더 많은 FPGA 배치 및 라우팅 자원을 소비하여 타이밍 성능 요구 사항을 충족하기 어렵게 만들 수 있습니다.

설계에 비동기 리셋이 꼭 필요한 경우, 비동기 리셋 신호를 먼저 "동기 처리"한 후 사용하는 것이 좋습니다.

Verilog 코드 예시 (비동기 리셋 동기 처리)

비동기 리셋 신호를 동기 처리하여 새로운 동기식 리셋 신호를 생성합니다.

// input i_rst_n; // 외부 비동기 리셋 신호 (active low)
// input i_clk;   // 클럭 신호
// output r_rst_n_sync; // 동기 처리된 리셋 신호 (active low)

reg r_rst_n_sync;

always @(posedge i_clk) begin
    r_rst_n_sync <= i_rst_n; // 클럭의 양의 에지에서 외부 리셋 신호 샘플링
end

// 이제 r_rst_n_sync를 사용하여 동기 리셋 로직을 구현합니다.
always @(posedge i_clk) begin
    if (r_rst_n_sync) begin // 동기 처리된 리셋이 활성 상태일 때
        // 리셋 시 동작
    end else begin
        // 정상 동작
    end
end

비동기 리셋의 동기 해제 (Asynchronous Reset Synchronous Release)

이 기법은 비동기 리셋의 장점을 활용하면서 단점을 완화하는 데 도움이 됩니다. Verilog로 구현하면 다음과 같습니다.

// input clk;
// input arst_n; // 비동기 리셋 신호 (active low)
// output rst_n; // 동기 해제된 리셋 신호 (active low)

// 메인 로직용 레지스터
reg rff1;
reg rst_n; // 동기 해제된 리셋

// 비동기 리셋 및 동기 해제를 위한 플립플롭
always @(posedge clk or negedge arst_n) begin
    if (!arst_n) begin // 비동기 리셋이 활성 상태이면
        {rst_n, rff1} <= 2'b0; // 리셋 신호와 메인 레지스터 초기화
    end else begin       // 비동기 리셋이 비활성 상태이면
        {rst_n, rff1} <= {rff1, 1'b1}; // 메인 레지스터 업데이트 (예시)
    end
end

// 동기 리셋을 사용하는 메인 로직
always @(posedge clk or negedge rst_n) begin // 동기 해제된 리셋 사용
    if (!rst_n) begin // 동기 해제된 리셋이 활성 상태이면
        // 리셋 시 동작
    end else begin
        // 정상 동작
    end
end

이 리셋 설계는 다음 이점을 제공합니다.

  • 복구 시간 문제 완화: 비동기 리셋이 활성화되면 플립플롭이 리셋되고 후속 레지스터에 영향을 줍니다. 그러나 리셋이 해제될 때(클럭 에지에 동기화됨) 플립플롭의 출력은 한 클럭 사이클 후에 다시 1로 복원됩니다. 이로 인해 후속 레지스터의 복구 시간 요구 사항을 충족하지 못하거나 이전 레지스터의 복구 시간 요구 사항을 위반하는 문제를 방지할 수 있습니다.
  • 짧은 리셋 펄스 포착: 클럭 주기보다 짧은 지속 시간을 가진 리셋 신호도 안정적으로 포착할 수 있습니다.

주의할 점은 이 리셋 방식은 리셋 출력이 이전 상태에 의존하지 않지만, 리셋 해제 신호는 클럭에 의존한다는 것입니다. 따라서 전원 인가 시 리셋 또는 게이트 클럭 회로와 같이 정상적으로 작동하는 클럭이 없을 때는 이 리셋 회로가 작동하지 않을 수 있습니다.

태그: FPGA Verilog 동기 리셋 비동기 리셋 디지털 설계

9월 8일 10:16에 게시됨