Inflearn brand logo image

인프런 커뮤니티 질문&답변

미래를위한큰그림님의 프로필 이미지
미래를위한큰그림

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

[HDL 16장] HW 의 동작을 제어하는 FSM 을 이해해보자. (실습편)

Latch에 관련한 질문

해결된 질문

작성

·

59

1

안녕하세요 🙂

[1. 질문 챕터] :

4장 내용 / 16장의 7분 50초

[2. 질문 내용] :

"Latch가 발생하면 안된다" 라는 개념이 잘 이해가 안 됩니다. 엄밀히 말하면 아래 두개가 헷갈립니다.

  • clock base로 동작하는 reg가 특정 값일 때 고정되는 경우

    • e.g.
      if( r_test[9] == 1 )begin
      r_test = r_test;
      end
      else r_test = r_test + 1;
      이 경우 "Latch 된다"고 표현되는 것으로 아는데, 맛비님 강의에서 사용하면 안된다는 것이 이러한 것인지.. 궁금합니다.

  • clock base로 동작하지 않는 reg

    • 헷갈리고 궁금해진 이유는 아래와 같습니다.
      - 7:56의 to prevent latch 구문은 "clock base로 동작하지 않는 reg"가 "특정 값일 때 고정되는 경우" 둘 다 해당하는 것으로 보이기도 했고,
      - 52~62 줄은 clock base로 동작하지 않기에 (c_state 값의 변화는 clock base기에 clock base라 볼 수 있는 것인지?) 결국 latch 구문인지? 도 궁금합니다.

[3. 시도했던 내용, 그렇게 생각하는 이유] :
Latch 라는 개념이 "f/f 처럼 clock based가 아닌 경우" 와 "한 값으로 고정되는 경우" 두 개가 있어서 충돌되는 것 같습니다... 다른 질문을 보고 왔는데도 잘 이해가 안가서 질문을 남겨둡니다.

늘 감사드리며, 좋은 주말 되십시오.

답변 2

0

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요 🙂
Latch 개념에서 혼란스러울 수 있는 지점들을 하나 씩 정리해 드릴게요.


1. "Latch가 발생하면 안된다"는 말의 의미

디지털 설계에서 latch는 조합 논리 안에서 조건문(if, case 등)을 사용할 때 모든 경우를 완전히 명시하지 않으면 암묵적으로 생기는 비동기 기억소자입니다.

즉, clock이 없는 상태에서 특정 조건이 충족되지 않을 때 값을 유지하려는 구조가 되면, synthesis 도구가 "아 이거 값을 유지해야 하니까 latch로 만들자"라고 판단하게 됩니다. 그래서 의도치 않게 latch가 생성되는 것이 문제입니다.


2. 질문 예제 분석

if( r_test[9] == 1 ) begin

r_test = r_test;

end

else begin

r_test = r_test + 1;

end

 

이 구조는 clock block 안이라면, r_test = r_test;는 아무 의미 없는 self-assignment입니다.
그런데 이 구조가 combinational block (always @(*)) 안에 들어가 있다면,
r_test[9] == 1 조건이 거짓일 때만 값이 갱신되고, 참일 때는 값을 유지하게 되므로 synthesis tool은 이를 latch로 처리하게 됩니다.

즉, clock에 기반하지 않은 reg가 값을 유지하려고 하면 latch가 생깁니다.


3. clock 기반 reg가 특정 값일 때 고정되는 경우는 latch인가?

아닙니다.
예를 들어 다음과 같은 구조는 clock 기반 flip-flop입니다.

always @(posedge clk) begin

if (r_test[9] == 1)

r_test <= r_test;

else

r_test <= r_test + 1;

end

 

이건 r_test <= r_test;라고 해도 latch가 아닙니다.
항상 clock에 반응해서 동작하고 있으므로 latch로 synthesis 되지 않습니다.

다만 이런 코드가 실질적으로는 아무 일도 안 하므로 불필요한 코드이며, 혼동을 줄 수 있으니 피하는 것이 좋습니다. 써도 문제가 되지는 않아요.


4. 결론적으로 latch가 발생하는 경우는?

  • always @(*) 같은 combinational 블록에서

  • ifcase모든 조건을 명시하지 않고, 특정 조건에서 값을 유지하려는 경우

  • synthesis tool이 그걸 latch로 판단하고 생성함


5. 질문에서 말한 52~62줄은 latch인가요?

질문 주신 16장 예제 기준으로 보면:

  • 만약 해당 라인이 always @(posedge clk) 내부라면 latch 아님

  • 하지만 always @(*) 내부에서 어떤 조건에서 c_state 값을 유지하려는 구조라면 latch 발생 가능성 있음

핵심은 블록이 clock 기반인지 여부 + 모든 조건을 다 명시했는지 여부입니다.


질문처럼 latch라는 단어가 "비동기 메모리 소자"와 "값 유지하려는 상태"를 혼용해서 쓰이다 보니 헷갈릴 수 있어요.
하지만 디지털 설계에서는 '의도치 않은 비동기 기억소자(latch)가 합성되는 걸 방지하자'는 게 핵심입니다.

 

즐공하세요 🙂

synthesis 과정에서 발생하는 Latch 회로 생성의 유/무가 중요한 것이라 이해가 되네요. 깔끔한 정리와 답변 감사합니다.

0

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

Latch와 관련하여 질문 주신 내용을 잘 읽었습니다. Verilog HDL에서 Latch가 발생하는 경우와 이를 방지해야 하는 이유에 대해 간단히 설명드리겠습니다.

Latch와 관련된 개념

  1. 시퀀셜 로직 (Sequential Logic): 클럭을 기반으로 동작하며, 플립플롭(F/F)이 대표적인 예입니다. 클럭의 에지(위/아래)에 따라 상태가 변합니다.

  2. 콤비네이셔널 로직 (Combinational Logic): 입력에 대한 출력이 즉각적으로 결정됩니다. 클럭에 관계없이 입력의 변화에 바로 반응합니다. 여기에서 모든 입력 조건을 처리하지 않으면 예상치 못한 latch가 발생할 수 있습니다.

Latch란 무엇인가?

Latch는 주로 콤비네이셔널 로직에서 발생할 수 있는 문제로, 입력 조건이 완전히 정의되지 않으면 출력이 이전 상태를 유지하게 됩니다. 이런 경우 의도치 않은 상태를 유지하는 상황이 발생할 수 있습니다.

질문과 관련된 내용 설명

  • Clock Base로 동작하는 reg가 특정 값으로 고정되는 경우: 이는 일종의 시퀀셜 로직에서 입력 조건 미스에 의해 발생할 수 있는 문제입니다. F/F에서는 기본적으로 이전 값을 유지하는 특성이 있으나, 이 경우 명시적으로 latch를 방지하기 위한 fully assigned condition이 필요할 수 있습니다.

  • Clock Base로 동작하지 않는 reg: 콤비네이셔널 로직에서 모든 입력 조건을 정확히 처리하지 않으면 latch가 발생할 수 있습니다. 강의에서 언급한 “to prevent latch”는 바로 이런 경우를 예방하기 위한 것입니다.

관련 질문 링크

김동한님께 도움이 될 수 있는 기존 사례들을 확인해 보시기 바랍니다:

Latch 방지를 위해선 코드 작성 시 모든 가능한 입력 조건에 대해 출력이 결정되도록 구조를 만드는 것이 중요합니다. 이는 주로 기본값 할당 및 default 케이스 제공을 통해 가능합니다.

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

미래를위한큰그림님의 프로필 이미지
미래를위한큰그림

작성한 질문수

질문하기