Menu
Coddy logo textTech

연속 할당

Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 37번째.

하드웨어에서 연결은 회로의 두 점을 잇는 물리적 배선입니다. 와이어가 일단 배치되면 연결은 영구적이며 always 활성 상태가 됩니다. 한쪽 끝이 바뀌면 다른 쪽 끝도 즉시 바뀝니다.

Verilog에서는 이러한 동작을 모델링하는 방법이 필요합니다. 어떤 값을 wire에 전달하고 이를 영구적으로 연결된 상태로 유지하고자 합니다. 이렇게 하는 과정을 continuous assignment(연속 할당)라고 합니다.

Continuous assignment는 assign 키워드를 사용하여 wireexpression 사이에 영구적인 연결을 생성합니다. wire는 물리적 전선과 마찬가지로 expression의 값을 continuously 취합니다.

값을 한 번 기록하는 것이 아니라 선(wire)을 납땜하는 것으로 생각하세요.

구문

assign wire_name = expression;
부분의미
assign`continuous` `assignment`를 시작하는 키워드
wire_name구동되는 `wire` (`reg`일 수 없음)
expression`wire`를 구동하는 값

간단한 예제

wire out;
assign out = a & b;

이것은 out이 always a AND b와 equal함을 의미합니다. a 또는 b가 변경될 때마다 out은 즉시 변경됩니다.

작동 방식

값을 저장하는 reg와 달리, continuous assignment가 있는 wirecontinuously update됩니다:

module continuous_demo;
  reg a, b;
  wire c;
  
  assign c = a & b;   // c는 항상 a AND b를 따릅니다
  
  initial begin
    a = 0; b = 0;
    #10 $display("a=%d, b=%d, c=%d", a, b, c);  // c=0
    
    a = 1;
    #10 $display("a=%d, b=%d, c=%d", a, b, c);  // c=0 (1&0=0)
    
    b = 1;
    #10 $display("a=%d, b=%d, c=%d", a, b, c);  // c=1 (1&1=1)
    
    $finish;
  end
endmodule

출력:

a=0, b=0, c=0
a=1, b=0, c=0
a=1, b=1, c=1

a 또는 b가 변경될 때마다 c가 자동으로 업데이트됩니다.

Multiple Assignments

하나의 module 내에 여러 개의 continuous assignment를 가질 수 있습니다:

module multiple_assign (
  input a, b, c,
  output x, y
);
  assign x = a & b;
  assign y = x | c;   // y는 x에 의존합니다
endmodule

모든 할당(assignment)은 병렬로 연속적으로(continuously) 실행됩니다.

일반적인 용도

연속 할당(Continuous assignment)은 다음 용도로 사용됩니다:

  • 단순 조합 논리 (AND, OR, XOR)
  • 선(wire)들을 서로 연결
  • 삼상 버퍼(tri-state buffer) 생성
  • 조합 표현식으로부터 출력 구동
challenge icon

챌린지

수행할 작업:

  1. zx AND y와 같게 만드는 누락된 continuous assignment를 추가하세요.

직접 해보기

module continuous_challenge (
  input x,
  input y,
  output z
);
  
  // TODO: z가 x AND y와 같아지도록 누락된 continuous assignment를 추가하세요
  

endmodule
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨