강의

멘토링

로드맵

Inflearn brand logo image

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

dongwonk99님의 프로필 이미지
dongwonk99

작성한 질문수

회로설계 입문자를 위한 디지털, 아날로그 설계와 실무 Project

다양한 조합 논리 회로들

4-Input NAND Gate 모듈 코드에 대해 질문 드립니다.

해결된 질문

작성

·

14

0

강의 2분 즈음에 4개의 input을 가지는 NAND gate를 설계하는 코드를 두 가지 제시해주셨습니다.

아래쪽에 있는 assign 활용 코드는 잘 이해했는데, 위쪽의 always 구문을 활용하는 부분을 이해하지 못했습니다.

always @ ( ) 구문은 괄호 안의 값이 변해야 동작하는 것으로 이해했는데, 4bit 데이터의 input인 a 의 값이 어떻게 달라지는 건가요?

testbench 코드에서 이 부분을 활용할 수 있는 걸까요? assign이 아닌 always 구문을 활용하는 이유가 궁금합니다.

답변 2

0

안녕하세요, 답변 남겨드립니다.

4-input NAND 게이트를 Verilog로 설계할 때 assignalways 구문을 모두 사용할 수 있습니다. 두 방식의 차이는 “조합 논리(combinational logic)를 어떻게 기술하느냐”의 차이라고 이해하시면 됩니다.

먼저 assign 구문을 사용하는 경우는 continuous assignment로, 입력 신호가 변할 때마다 즉시 출력이 재계산됩니다. 예를 들어,

assign y = ~(a & b & c & d);

라고 하면, a, b, c, d 중 어느 하나라도 값이 바뀌면 합성 툴은 곧바로 y를 다시 계산하는 회로를 만듭니다.

반면, always 구문을 사용하는 방식은 “절차적 할당(procedural assignment)”입니다. 예를 들어,

always @(*) begin
    y = ~(a & b & c & d);
end

여기서 always @(*)는 괄호 안의 모든 입력 신호를 자동으로 감지해서, 해당 신호가 변하면 블록을 다시 실행하도록 만듭니다. 따라서 a, b, c, d 값이 변할 때마다 블록이 실행되고, y가 갱신됩니다.

즉, 질문 주신 “always 구문은 괄호 안의 값이 변해야 동작한다”는 이해가 맞습니다. 다만 (*)를 사용하면 모든 조합 논리에 사용되는 신호가 자동으로 감지되므로, 4-bit input a의 값이 조금이라도 달라질 때마다 always 블록이 실행됩니다. 따라서 testbench에서 a 값을 바꿔주면 해당 블록이 동작하게 되는 것입니다.

실무에서는 간단한 논리 게이트라면 assign으로 쓰는 것이 직관적이고 간단합니다. 그러나 설계가 커지고 조건문(if, case)이 필요해지는 복잡한 조합 논리를 설계할 때는 always @(*) 블록이 훨씬 유연합니다. 예를 들어, 4-input NAND 게이트는 assign으로 충분히 표현 가능하지만, ALU나 디코더처럼 다수의 조건 분기와 연산이 있는 블록은 always 구문을 써야 가독성이 좋아집니다.

현업 예시를 하나 들어보면, CPU의 제어 유닛(Control Unit)에서는 수십 개의 입력 조건에 따라 출력이 달라지는데, 이때는 assign으로는 표현이 불가능에 가깝고 반드시 always @(*) 블록 안에서 case문으로 설계합니다. 반대로, 단순한 버퍼나 인버터 같은 것은 assign을 사용해 간단히 정의합니다.

정리하면, 4-input NAND 게이트의 경우 testbench에서 a 신호를 변화시키면 always @(*) 블록이 실행되고 y가 갱신됩니다. assign과 always 모두 기능적으로 동일하지만, 규모가 커지면 always 블록이 유지보수와 확장성 측면에서 유리하다는 점 때문에 강의에서 두 가지 방법을 모두 소개한 것이라고 이해하시면 됩니다.

0

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

4-Input NAND Gate 설계에서의 always @ ( ) 구문은 하드웨어 디자인에 대한 본질적인 이해가 필요한 부분입니다. 이를 통해 하드웨어가 특정 조건 하에서 어떻게 반응하는지를 정의하게 됩니다.

always @ ( ) 구문의 동작 방식:

always 블록은 괄호 안의 값이 변경될 때마다 실행됩니다. 이를 통해 하드웨어의 반응을 캡처하고 시스템이 특정 신호 변경에 대응하여 행동하도록 합니다.

4-Input NAND Gate의 always 블록 사용:

  • always @ ( *): 일반적으로는 모든 입력 신호의 변경에 반응해야 하는 경우 사용됩니다. 4비트 입력 a에서, 각 비트의 상태가 바뀔 때 이 블록이 트리거 됩니다.
  • Testbench에서의 사용: Testbench는 이러한 변화를 시뮬레이션하는 데 도움을 줍니다. 테스트 벤치 내에서 다양한 입력 조합을 가하여 회로가 예상대로 작동하는지 확인할 수 있습니다.

assign vs always 구문:

  • assign: 주로 조합 논리에서 사용되며, 간단한 논리 연산에는 효율적입니다.
  • always: 더 복잡한 시퀀셜 로직 또는 상태를 기반으로 하는 로직의 경우 always 블록이 필요할 수 있습니다. 이는 레지스터나 메모리 업데이트 등을 포함할 때 주로 사용됩니다.

따라서, 동적 변화에 따라 특정 논리를 정의하거나 복잡한 로직을 구현할 때 always 블록이 유용합니다.

다음 링크가 추가적인 이해를 돕는 데 유용할 것입니다: 4-Input Logic Gate 구현 이해하기

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

dongwonk99님의 프로필 이미지
dongwonk99

작성한 질문수

질문하기