Verilog 결합(Concatenation) & 복제(Replication) 연산자 실전 가이드
여러 비트 와이어/변수를 { }로 묶어 더 큰 벡터를 만드는 결합, 같은 표현식을 반복하는 복제 연산자를 마스터하세요.
결합 연산자 { }
피연산자: 와이어, 변수, 표현식, 크기 지정된 상수. 각 피연산자 크기를 알아야 전체 크기 계산 가능.
wire a, b;
wire [1:0] res;
assign res = {a, b}; // res[1]=a, res[0]=b
wire [2:0] c;
wire [7:0] res1;
assign res1 = {b, a, c[1:0], 2'b00, c[2]};
// res1[7]=b, [6]=a, [5:4]=c[1:0], [3:2]=0, [1]=c[2], [0]=0 (암시적 패딩?)
작동 예제: 파라미터화된 결합
module des (input [1:0] a, input [2:0] b, output [4:0] out1, output [3:0] out2);
assign out1 = {a, b}; // 2+3=5비트
assign out2 = {a[1], 2'b01, b[2]}; // 1+2+1=4비트, out2[2:1]은 항상 2'b01
endmodule
시뮬레이션으로 동적 변화 확인 가능.
복제 연산자 {n{expr}}
n: 0 이상 상수 (변수, x, z 불가). 표현식 n번 반복.
wire a; wire [6:0] res;
assign res = {7{a}}; // aaaaaaa (7비트)
{2'bz{2'b0}} // 불법: 복제 상수에 z 불가
{2'bx{2'b0}} // 불법: 복제 상수에 x 불가
복제 표현식은 LHS에 올 수 없음, output/inout 포트 직접 연결 불가.
중첩 복제 (Nested Replication)
복제 표현식을 일반 결합 안에 포함 가능.
module des;
reg [1:0] a; reg [2:0] b;
initial begin
a = 2; b = 4;
$display("res=%b", {a, b, 3'b000, {{2{a}}, {3{b}}}});
// a(2비트) + b(3비트) + 000(3비트) + a×2(4비트) + b×3(9비트) = 21비트
end
endmodule
// 출력: a=10, b=100 → res=101000001010100100100
불법 사용 사례
reg [3:0] _var;
assign res = {_var{a}}; // 컴파일 에러: 변수를 복제 상수로 사용 불가
// xmelab: *E,NOTPAR: Illegal operand for constant expression
실무 활용 패턴
- 버스 구성:
assign bus = {addr, data, ctrl};
- 비트 확장:
assign ext = {{16{imm[15]}}, imm}; (부호 확장)
- 패턴 생성:
assign pattern = {8{2'b10}}; (10101010...)
- 파이프라인 레지스터 배열 초기화:
{N{reset_val}}
요약표
| 연산자 | 문법 | 제약 | 용도 |
| 결합 | {a, b, c} | 피연산자 크기 알려져야 함 | 버스 조립, 비트 필드 구성 |
| 복제 | {n{expr}} | n=상수≥0, LHS/포트 연결 불가 | 비트 확장, 패턴 생성, 초기화 |
| 중첩 복제 | {a, {3{b}}} | 복제 안 복제 가능 | 복잡한 비트 패턴 구성 |