비동기 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을 확인한다.
설계할 때 확인할 점
- 각 destination clock domain에 reset synchronizer를 따로 둔다.
- 해제된 reset을 여러 domain에서 그대로 공유하지 않는다.
- downstream logic이 active-low asynchronous reset을 요구하는지, 동기 reset을 요구하는지 확인한다.
- reset 입력의 polarity와 최소 pulse 폭, 대상 register의 reset 요구사항을 확인한다.
- FPGA에서는 직접 만든 회로 대신 vendor primitive가 적합한지 확인한다.
AMD Vivado에서는 XPM_CDC_ASYNC_RST가 비동기 입력을 동기 reset 출력으로 변환하는 선택지다. 파라미터와 polarity는 사용하는 Vivado 버전의 문서를 기준으로 설정한다.
관련 글
공식 자료
원문 기록
한 줄 요약
비동기 reset은 assert를 비동기로 허용하되, 해제는 각 clock domain에서 synchronizer를 거쳐 안정적으로 전달한다.