---
title: "글리치 없는 클록 mux: 깨끗한 두 클록에서 1ns 펄스가 생기는 이유"
author: "브레이브브라우저쓰자"
published_at: "2026-10-10T00:49:01.985Z"
updated_at: "2026-10-05T23:53:07.552Z"
tags: ["글리치 없는 클록 mux"]
canonical_url: "https://ariser.io/@writer_a9817d5a8de0/%EA%B8%80%EB%A6%AC%EC%B9%98-%EC%97%86%EB%8A%94-%ED%81%B4%EB%A1%9D-mux-%EA%B9%A8%EB%81%97%ED%95%9C-%EB%91%90-%ED%81%B4%EB%A1%9D%EC%97%90%EC%84%9C-1ns-%ED%8E%84%EC%8A%A4%EA%B0%80-%EC%83%9D%EA%B8%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0"
ai_assisted: true
---

# 글리치 없는 클록 mux: 깨끗한 두 클록에서 1ns 펄스가 생기는 이유

이 글은 AI가 활용됐습니다.

[원문](https://ariser.io/@writer_a9817d5a8de0/%EA%B8%80%EB%A6%AC%EC%B9%98-%EC%97%86%EB%8A%94-%ED%81%B4%EB%A1%9D-mux-%EA%B9%A8%EB%81%97%ED%95%9C-%EB%91%90-%ED%81%B4%EB%A1%9D%EC%97%90%EC%84%9C-1ns-%ED%8E%84%EC%8A%A4%EA%B0%80-%EC%83%9D%EA%B8%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0)

주파수를 바꾸려고 클록 두 개를 mux에 연결했다. 두 입력 모두 깨끗한 사각파인데 출력에는 아주 짧은 펄스가 생긴다. 선택 신호가 안정적으로 0에서 1로 한 번 바뀌었어도 가능한 일이다. **글리치 없는 클록 mux는 입력 중 하나를 즉시 고르는 회로가 아니라, 이전 클록을 안전하게 멈추고 새 클록의 온전한 펄스로 다시 시작하는 회로**다.

클록을 받는 플립플롭은 펄스의 높이만 보지 않는다. 최소 high·low 폭, 에지 간격과 셀의 내부 동작 조건이 있다. 잘린 펄스는 일부 상태 요소만 반응하게 만들 수 있어, 단순 데이터 mux의 일시적인 흔들림보다 영향이 크다.

## 정상 클록 두 개가 짧은 출력 펄스를 만드는 과정

설명용으로 A 클록은 0ns에 상승해 5ns에 내려가고, 10ns에 다시 상승한다고 하자. B 클록은 3ns에 상승해 7ns에 내려간다. 처음에는 A를 출력한다. 6ns에 select가 B로 바뀌면 A는 0, B는 1이다.

조합 mux는 선택 순간에 출력 0을 1로 바꾼다. B가 내려가는 7ns까지 출력 high 폭은 1ns뿐이다. B 자체의 high 폭은 4ns였지만, 출력은 그 펄스의 끝부분만 가져왔다. select에 글리치가 없어도 두 클록의 위상과 선택 시점만으로 잘린 펄스가 생긴다.

반대로 A가 high인 중간에 low인 B로 바꾸면 A의 출력 펄스를 일찍 끝낼 수 있다. 입력 클록이 항상 정상이라는 조건은 선택 전후의 출력 펄스가 정상이라는 조건과 같지 않다.

## 먼저 닫고, 닫힌 것을 확인한 뒤 열기

안전한 전환의 기본 생각은 각 입력 클록을 gate하고, 두 gate의 활성 구간이 겹치지 않게 만드는 것이다. 이전 클록의 high 펄스가 끝나는 안전한 경계에서 gate를 닫는다. 이전 경로가 닫힌 것을 새 클록 쪽에서 확인한 뒤, 새 경로를 안전한 low 구간에 열어 다음 온전한 상승 에지를 전달한다.

그 과정에서 출력이 low로 머무는 시간이 길어질 수 있다. 이 공백은 잘린 펄스와 구분해야 한다. 목적지 회로가 일시적으로 클록을 기다려도 된다는 전제라면 공백은 허용할 수 있다. 하지만 계속 일정 간격으로 에지를 받아야 하는 회로에는 별도의 시스템 요구가 있다. glitch-free라는 이름이 위상 연속성이나 무중단 전환을 보장하지는 않는다.

[PULP의 공개 clock mux](https://github.com/pulp-platform/common_cells/blob/master/src/cc_clk_mux_glitch_free.sv)는 선택의 동기화, 이전 경로의 비활성 확인, clock gate를 이용한 전환을 설명한다. 원문은 입력 위상을 몰라도 전환할 수 있는 구조를 제시하지만, 전환 중 클록 주기가 안정적이어야 한다는 등의 조건을 함께 둔다.

이런 구현을 단순히 `clk_out = sel ? clk_b : clk_a`로 대체하면 선택 제어의 상태와 확인 절차가 사라진다. 출력 함수가 평소 같아 보여도 전환 구간의 계약은 달라진다.

## select를 자주 바꾸면 요청도 정리해야 한다

A에서 B로 옮기는 동안 select가 다시 A로 돌아오면 회로가 어떤 선택을 최종적으로 반영해야 할까. 입력을 계속 바꾸는 환경에서는 전환 완료와 새로운 요청의 관계가 필요하다. 원문의 PULP 구현 역시 select 안정 시간과 glitch 조건을 명시한다.

따라서 소프트웨어가 주파수 요청을 빠르게 덮어써도 된다고 가정하기 전에, 실제 mux가 중간 요청을 무시하는지, 마지막 선택으로 수렴하는지, 별도의 완료 신호를 요구하는지 확인해야 한다. 선택 신호의 단일 전이가 안전한 것과 임의 속도의 요청 스트림을 처리하는 것은 다른 문제다.

전환에 몇 사이클이 걸리는지도 원천과 새 클록의 주기, 동기화 단계 수에 의존한다. 가상의 100MHz 클록에서 25MHz 클록으로 전환하면 새 영역의 한 사이클 자체가 40ns다. 제어가 새 클록의 여러 에지를 기다린다면 출력 공백은 이전 클록 한 주기보다 훨씬 길 수 있다. 특정 모듈의 정확한 지연은 데이터시트나 구현 조건으로 확인해야 한다.

## 입력 클록이 정지하면 같은 절차가 진행될까

이전 경로를 닫는 제어가 이전 클록의 에지를 필요로 하는 구조에서는, 그 클록이 high에서 멈추면 정상적인 종료 에지를 기다릴 수 없다. 클록을 전환할 수 있는 것과 죽은 클록에서 탈출할 수 있는 것은 같은 기능이 아니다.

따라서 기능 클록을 멈추는 순서와 mux를 전환하는 순서를 함께 정해야 한다. 정지 클록 복구를 지원하는 전용 셀이 있다면 해당 조건을 따르고, 없다면 살아 있는 동안 안전한 클록으로 옮긴 뒤 원래 클록을 멈추는 방식이 필요할 수 있다. 일반적인 glitch-free라는 이름만으로 stopped-clock 동작을 추정하면 안 된다.

reset과 test bypass도 같은 확인이 필요하다. 원문의 특정 reset 모드는 동기화 경로를 우회하므로 reset 중 select 유지 조건을 별도로 둔다. 정상 모드에서 검증한 전환 규칙이 우회 경로에도 적용되는지는 따로 보아야 한다.

## RTL의 안전성을 셀까지 보존하기

동작 모델에서 안전한 enable 관계를 만들었어도, 합성기가 clock gate를 일반 논리로 바꾸거나 경로를 재구성하면 의도한 펄스 조건을 잃을 수 있다. PULP 원문도 전용 clock logic 셀로의 매핑과 보존 설정을 요구한다. 일반 데이터 경로의 Boolean 동치만으로 clock waveform의 품질이 충분히 설명되지는 않는다.

검증에서는 select 위상을 입력 에지 주변으로 이동시키고, 출력 high·low 폭과 gate 중복 활성 여부를 확인한다. 구현 단계에서는 전용 셀 매핑, clock timing과 최소 펄스 폭 검사를 연결한다. 테스트에서 우연히 select가 모두 low 구간에만 바뀌었다면 위험한 전환을 아직 본 것이 아니다.

처음의 1ns 펄스는 입력 클록이 나빠서 생긴 것이 아니었다. 이미 진행 중인 펄스를 중간에서 선택했기 때문이다. **글리치 없는 클록 mux의 가치는 선택의 즉시성 대신 펄스의 완전성을 지키는 데 있다.** 전환 공백, 살아 있는 입력 클록, select와 reset 조건까지 그 계약에 넣어야 안전한 주파수 변경이 된다.

