Skip to content
DevBJ
Go back

비동기 reset은 왜 해제할 때 동기화해야 할까

Updated:
Editor

비동기 reset은 언제든 assert할 수 있지만, 해제(deassert)는 각 clock domain에 맞춰 동기화하는 편이 안전하다. reset 해제 시점이 clock edge와 가까우면 recovery/removal 조건을 위반해 register 상태가 불안정해질 수 있다.

active-low reset synchronizer

다음 회로는 reset을 비동기로 assert하고, 두 개의 register를 거쳐 동기적으로 deassert한다.

module reset_sync (
  input  logic clk,
  input  logic arst_n,
  output logic srst_n
);
  (* ASYNC_REG = "TRUE" *) logic release_meta;
  (* ASYNC_REG = "TRUE" *) logic release_sync;

  always_ff @(posedge clk or negedge arst_n) begin
    if (!arst_n) begin
      release_meta <= 1'b0;
      release_sync <= 1'b0;
    end else begin
      release_meta <= 1'b1;
      release_sync <= release_meta;
    end
  end

  assign srst_n = release_sync;
endmodule

arst_n이 low가 되면 두 register는 비동기로 초기화된다. 해제 후에는 release_meta와 release_sync가 clock edge마다 차례로 1이 되므로 srst_n은 두 단계 뒤에 올라간다.

ASYNC_REG은 AMD FPGA 도구에서 synchronizer register를 식별하는 attribute다. ASIC 또는 다른 FPGA 도구에서는 해당 도구의 권장 attribute와 reset synchronizer cell을 확인한다.

설계할 때 확인할 점

  1. 각 destination clock domain에 reset synchronizer를 따로 둔다.
  2. 해제된 reset을 여러 domain에서 그대로 공유하지 않는다.
  3. downstream logic이 active-low asynchronous reset을 요구하는지, 동기 reset을 요구하는지 확인한다.
  4. reset 입력의 polarity와 최소 pulse 폭, 대상 register의 reset 요구사항을 확인한다.
  5. FPGA에서는 직접 만든 회로 대신 vendor primitive가 적합한지 확인한다.

AMD Vivado에서는 XPM_CDC_ASYNC_RST가 비동기 입력을 동기 reset 출력으로 변환하는 선택지다. 파라미터와 polarity는 사용하는 Vivado 버전의 문서를 기준으로 설정한다.

관련 글

공식 자료

원문 기록

한 줄 요약

비동기 reset은 assert를 비동기로 허용하되, 해제는 각 clock domain에서 synchronizer를 거쳐 안정적으로 전달한다.


Share this post on:

Previous Post
Tcl 리스트에서 여러 값을 안전하게 제외하는 방법
Next Post
AXI4 burst에서 AxSIZE와 AxLEN 계산하기