inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

설계독학's Verilog 마스터 Season 1 (실전 코딩 테스트 문제로 완성하는 디지털 설계 엔지니어의 커리어 도약)

[L1-P11] Clock Gating : 👑 면접 단골! 저전력(Low Power) 설계를 위한 필수 테크닉

enable_latch가 F/F이 아니라 래치인 이유가 궁금합니다.

15

김상현

작성한 질문수 65

1

강사님 안녕하세요. 강의 보다가 궁금한 것이 생겨서 질문 드립니다.


[1. 질문 챕터] : LV1-11. Clock gating 5:26 모범답안 설명


[2. 질문 내용] : enable_latch가 왜 래치로 생성되는지 궁금합니다.


[3. 시도했던 내용, 그렇게 생각하는 이유] : enable_latch 신호는 clk_in에 동기화되어서 출력이 변경되는데 왜 F/F이 아니라 래치인 이유가 궁금합니다.

저는 아래처럼 작성해야 래치가 되는거라 생각했습니다.

`timescale 1ns / 1ps
module clock_gating(
   input wire clk_in,
    input wire rst_n,
    input wire enable,
    input wire [7:0] data_in,
    output reg [7:0] data_out
);

wire w_clk_in;
reg l_enable;

 //TODO
always @(posedge w_clk_in or negedge rst_n) begin
    if (!rst_n) data_out <= 8'd0;
    else data_out <= data_in;
end

always @(*) begin
    if (!clk_in) begin
        l_enable = enable;
    end
end

assign w_clk_in = clk_in & l_enable;

endmodule



verilog-hdl system-verilog

답변 2

0

ETA

안녕하세요 김상현님,

열심히 달리고 계시는군요!

아마

"그래서 여기서 보시는 것처럼 negedge clk 에 enable 를 래치로 채서 & 처리하면 글리치가 생기지않겠죠?"

라고 제가 헷갈리게 말씀드린 부분 때문에 다르게 이해하신 것 같습니다.

정정 하자면 아래와 같습니다.

"그래서 여기서 보시는 것처럼 negedge clk 에 enable_latch 로 채서 & 처리하면 글리치가 생기지않겠죠?"

즉 선언된 레지스터 이름을 언급드린거며, 래치가 아니라 리셋이없는 플립플롭이맞습니다.

따라서 김상현님께서 이해하신게 맞습니다!

열심히 달리시다가 또 다른 질문 있으시면 언제든지 말씀 부탁 드립니다!

화이팅!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 김상현님.

enable_latch가 F/F이 아니라 래치로 합성되는 이유는 always @(*) 블록에서 clk_in이 Low일 때만 값을 대입하고, High일 때는 대입하지 않기 때문입니다.

always @(*) begin
    if (!clk_in) begin
        l_enable = enable;
    end
end

위 코드는 다음과 같이 동작합니다.

  • clk_in == 0: l_enable이 enable을 따라감
  • clk_in == 1: l_enable에 새로운 값을 대입하지 않고 기존 값을 유지함

즉, clk_in이 High가 되면 l_enable은 마지막 값을 저장해야 하므로, 합성 도구가 이를 레벨 센서티브 래치로 해석합니다.

중요한 점은 clk_in의 변화에 반응한다고 해서 F/F이 되는 것은 아니라는 점입니다.

  • F/F: posedge 또는 negedge와 같은 클럭 엣지에서만 값을 샘플링
  • Latch: 특정 클럭 레벨 동안 입력을 통과시키고, 반대 레벨에서는 값을 유지

따라서 위 코드의 l_enable은 clk_in이 Low인 동안에는 enable의 변화가 그대로 반영됩니다. clk_in의 상승 엣지에서 한 번만 저장되는 구조가 아니므로 F/F이 아니라 래치입니다.

이 래치를 사용하는 이유는 클럭 게이팅에서 clk_in이 High인 동안 enable이 변해 게이트 클럭에 글리치가 발생하는 것을 방지하기 위해서입니다. clk_in이 Low인 구간에만 enable을 반영하고, High 구간에서는 값을 고정하여 다음과 같은 게이트 클럭을 안정적으로 생성합니다.

assign w_clk_in = clk_in & l_enable;

질문자님께서 작성하신 코드처럼 always @(posedge w_clk_in or negedge rst_n)로 작성한 data_out은 상승 엣지에서 동작하는 F/F입니다. 반면 l_enable을 생성하는 always @(*) 블록은 조건이 만족되지 않을 때 값을 유지하므로 래치가 됩니다.

관련 개념은 아래 기존 답변에서도 확인하실 수 있습니다.

  • Latch에 관련한 질문
    조합 논리에서 조건에 따라 값을 대입하지 않으면 래치가 생성되는 이유와, 클럭 기반 F/F과의 차이를 설명합니다.

  • c_state와 n_state의 F/F, Latch
    always @(posedge clk)에서 동작하는 상태 레지스터와 always @(*)에서 계산되는 조합 논리의 차이를 다룹니다.

정리하면, enable_latch는 clk_in에 동기화된 F/F이 아니라 clk_in의 Low 레벨 동안 투명하고 High 레벨 동안 값을 유지하는 래치입니다. 클럭 게이팅에서는 클럭이 High일 때 enable이 바뀌지 않도록 하기 위해 이러한 구조를 사용합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

인터럽트 컨트롤러 요청 처리와 처리 완료 구문 중 이해가 안되는 내용이 있습니다.

0

6

0

output.txt가 이상하게 나옵니다.

1

78

2

season 2 코딩테스트 강의에 대한 문의드립니다.

1

71

1

4:1먹스 구현방식에 대한 질문입니다.

1

69

2

Windows 기능 켜기

1

86

2

[L1-P02] 멀티플렉서 실전 결과 확인하는데 시간이 너무 걸립니다.

0

76

2

환경설정 문

2

119

2

환불 문의

1

162

2

[LV1_P4_REGISTER ] Non-Blocking

1

106

2

조건문에서 if 연속 사용

1

130

2

vivado 설치

2

153

1

LV1-21 Edge Detector 구현 방법 질문

1

135

1

학교에서 사용하는 툴

1

141

2

[L1-P16 clog2 with memory] clog2 function 질문

1

168

4

fsm 설계 방식에 대한 질문

1

131

2

Level0_P12_verification_testbench

1

124

2

mobaxterm 완전 삭제법

1

407

2

155ns 타이밍 이슈에 관한 궁금증(?)

1

134

2

build 오류

1

175

2

VIVADO 환경

1

151

2

코딩테스트

1

120

2

vscode 환경세팅 방법

2

276

2

L1-P12 인터럽트 제어 질문

2

136

2

L0-P03 design에 예제 코드가 그대로 실려있습니다.

2

119

2