inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Verilog Master Season 1 của 설계독학 (Tự học thiết kế) (Bước nhảy vọt trong sự nghiệp kỹ sư thiết kế kỹ thuật số hoàn thiện thông qua các bài toán kiểm tra lập trình thực tế)

[L1-P11] Clock Gating : 👑 Câu hỏi phỏng vấn thường gặp! Kỹ thuật thiết yếu để thiết kế năng lượng thấp (Low Power)

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

23

ksh79533954

65 câu hỏi đã được viết

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

Câu trả lời 2

0

ETA

안녕하세요 김상현님,

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

아마

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

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

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

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

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

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

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

화이팅!

0

communityai8509

안녕하세요, 인프런 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이 바뀌지 않도록 하기 위해 이러한 구조를 사용합니다.

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

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

1

15

2

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

1

80

2

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

1

71

1

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

1

69

2

Windows 기능 켜기

1

89

2

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

0

76

2

환경설정 문

2

120

2

환불 문의

1

162

2

[LV1_P4_REGISTER ] Non-Blocking

1

106

2

조건문에서 if 연속 사용

1

130

2

vivado 설치

2

154

1

LV1-21 Edge Detector 구현 방법 질문

1

137

1

학교에서 사용하는 툴

1

141

2

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

1

168

4

fsm 설계 방식에 대한 질문

1

131

2

Level0_P12_verification_testbench

1

125

2

mobaxterm 완전 삭제법

1

408

2

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

1

134

2

build 오류

1

175

2

VIVADO 환경

1

151

2

코딩테스트

1

120

2

vscode 환경세팅 방법

2

278

2

L1-P12 인터럽트 제어 질문

2

137

2

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

2

119

2