Verilog assign 문으로 조합 논리 설계하기: 반가산기부터 디코더까지
assign 문은 wire 타입 신호를 연속 구동해 조합 논리를 합성하는 표준 방식입니다. 주요 조합 회로 설계 예제를 통해 패턴을 익혀보세요.
예제 1: 기본 조합 논리 (5입력)
module combo (input a, b, c, d, e, output z);
assign z = ((a & b) | (c ^ d) & ~e);
endmodule
합성 시 AND, XOR, NOT, OR 게이트 조합으로 구현. 테스트벤치로 32가지 입력 조합 전수 검증 가능.
예제 2: 반가산기 (Half Adder)
module ha (input a, b, output sum, cout);
assign sum = a ^ b; // XOR: 합
assign cout = a & b; // AND: 캐리
endmodule
2비트 덧셈의 기본 블록. 4가지 입력 케이스 검증.
예제 3: 전가산기 (Full Adder)
module fa (input a, b, cin, output sum, cout);
assign sum = (a ^ b) ^ cin;
assign cout = (a & b) | ((a ^ b) & cin);
endmodule
캐리 입력을 받아 3비트 덧셈 수행. 반가산기 2개로도 구성 가능하지만 단일 모듈로 최적화.
예제 4: 2:1 멀티플렉서
module mux_2x1 (input a, b, sel, output c);
assign c = sel ? a : b; // 삼항 연산자
endmodule
sel로 입력 선택. 삼항 연산자는 합성 시 멀티플렉서로 매핑됨.
예제 5: 1:4 디멀티플렉서
module demux_1x4 (input f, input [1:0] sel, output a, b, c, d);
assign a = f & ~sel[1] & ~sel[0];
assign b = f & sel[1] & ~sel[0];
assign c = f & ~sel[1] & sel[0];
assign d = f & sel[1] & sel[0];
endmodule
단일 입력을 셀렉트에 따라 4개 출력 중 하나로 라우팅. 각 출력이 별도 assign으로 구동 (동일 신호 다중 assign은 일반적으로 비권장).
예제 6: 4:16 디코더 (3:8 디코더 확장)
module dec_3x8 (input en, input [3:0] in, output [15:0] out);
assign out = en ? (1 << in) : 0;
endmodule
en 활성 시 in 값에 해당하는 비트만 1 설정 (원-핫 인코딩). 시프트 연산자(<<) 활용한 간결한 구현.
테스트벤치 공통 패턴
module tb;
// 입력 reg, 출력 wire 선언
// DUT 인스턴스화 (이름 기반 연결)
initial begin
// 입력 초기화
$monitor("...", signals); // 변경 시마다 출력
for (i = 0; i < combinations; i++) begin
{inputs} = i; // 비트 결합으로 입력 벡터 생성
#10; // 시간 경과
end
end
endmodule
설계 팁
assign 기반 조합 논리는 글리치 발생 가능 → 출력 레지스터로 래치하거나 동기식 설계 권장
- 복잡한 조합 논리는
always @(*) 블록으로 작성해 가독성 확보 (다음 기사 참조)
- 파라미터화로 비트 폭 일반화:
parameter WIDTH = 8;
- 합성 후 넷리스트 확인으로 의도한 게이트 구조 매핑됐는지 검증