Altifigence Academy

21 / 63 · 개념

플립플롭, enable과 제어 우선순위

값을 유지·저장·초기화하는 동작을 다음 상태 식으로 정의하고, 의도하지 않은 클록 게이팅을 피합니다.

레지스터의 다음 상태를 정의하기

클록 에지 직전 값을 QkQ_k, 에지에서 저장하는 입력을 DkD_k, 갱신 후 값을 Qk+1Q_{k+1}로 표기합니다. reset을 먼저 처리하고 그다음 enable을 확인하는 레지스터레지스터 여러 비트의 상태를 저장하는 회로입니다. 이 과정의 동기식 레지스터는 클록 에지에서 정해진 입력을 저장합니다. 자세히 보기의 다음 상태는 다음과 같습니다.

Qk+1={0rk=1Dkrk=0, ek=1Qkrk=0, ek=0Q_{k+1}=\begin{cases} 0 & r_k=1\\ D_k & r_k=0,\ e_k=1\\ Q_k & r_k=0,\ e_k=0 \end{cases}

enable이 0일 때는 입력 D가 변해도 저장값은 유지됩니다. RTL에서 이 유지 경로를 생략하는 것과 조합회로에서 대입을 빠뜨리는 것은 다릅니다. 순차 블록의 유지 동작은 레지스터 명세의 일부입니다.

SystemVerilog
module enabled_register (
  input logic clk, rst, en,
  input logic [7:0] d,
  output logic [7:0] q
);
  always_ff @(posedge clk) begin
    if (rst) q <= 8'b0;
    else if (en) q <= d;
  end
endmodule

이 회로의 reset은 동기식 active-high 방식입니다. reset과 enable이 동시에 1인 에지에서는 0이 저장됩니다. 순서를 바꾸면 다른 기능이 되므로 우선순위를 주석에만 쓰지 말고 코드와 테스트에 함께 남겨야 합니다.

각 열에는 한 상승 에지상승 에지 클록이 0에서 1로 바뀌는 순간입니다. CLK=1인 구간 전체를 뜻하는 레벨과 구별합니다. 자세히 보기에서 관찰한 값을 기록했습니다. 입력은 에지 직전의 값이고, 이름에 after가 붙은 상태는 갱신 직후의 값입니다. 열은 값을 관찰한 순서대로 배치한 것이며, 실제 전파 지연전파 지연 입력이 바뀐 뒤 출력이 올바른 값으로 안정되기까지 걸리는 시간입니다. 논리식의 등가성과 시간 특성은 별개입니다. 자세히 보기을 나타내지는 않습니다. 초기 Q=0xA5입니다. 첫 열은 유지, 두 번째는 쓰기, 세 번째는 reset과 enable 충돌입니다.

reset·enable·hold 우선순위
파형 데이터 보기
파형 데이터: 각 문자는 한 구간, 점은 이전 상태 유지, p는 클록 한 주기입니다.
신호파형버스 값
edge2345E0 → E1 → E2 → E3
reset0.10
enable01.0
D2.343C → 99 → 77
Q after234.A5 → 3C → 00

enable은 클록을 직접 자르는 신호가 아닙니다

gated_clk = clk & en 같은 조합식을 임의로 만들어 클록으로 쓰면 en의 변화가 짧은 펄스나 예상하지 못한 에지를 만들 수 있습니다. clock enable RTL이 실제로 어떤 셀로 구현되는지는 합성·구현 과정에서 결정됩니다. 전력 절감을 위한 clock gating은 적절한 셀과 타이밍 검증을 전제로 별도로 설계합니다.

reset, load, enable 같은 제어 신호가 겹칠 때 우선순위를 확인할 수 있습니다. 제어 신호를 하나씩 켜 보는 것만으로는 충분하지 않습니다. 예를 들어 q=A5에서 en=0, d=3C이면 유지하고, 다음 에지에 en=1이면 3C를 저장해야 합니다.

직접 생각해 보기

q=0xA5에서 rst=1, en=1, d=0x3C인 에지를 지나고, 그다음 rst=0, en=0으로 두면 두 에지 뒤 q는 무엇인가요?

해설 보기

첫 에지에는 reset 우선이므로 0, 다음 에지에는 enable이 0이므로 그대로 0입니다. reset을 en 안쪽 조건으로 구현했다면 en=0인 리셋을 놓칠 수 있으므로 해당 조합도 별도로 검사해야 합니다.

선택은 이 브라우저에만 적용됩니다. 언제든 푸터에서 변경할 수 있습니다.