Verilog 배열과 메모리: 다차원 데이터 구조 완벽 마스터
Verilog에서 넷이나 변수의 배열 선언은 스칼라/벡터 모두 가능하며, 식별자 뒤에 주소 범위를 추가해 여러 차원을 만들 수 있습니다. reg, wire, integer, real 타입 모두 배열 생성 가능.
배열 선언 예시
reg y1 [11:0]; // 스칼라 reg 배열, 깊이 12, 각 1비트
wire [0:7] y2 [3:0]; // 8비트 벡터 넷 배열, 깊이 4
reg [7:0] y3 [0:1][0:3]; // 2차원 배열: 2행 4열, 각 8비트
배열 요소 접근 및 할당
모든 차원의 인덱스를 지정해야 하며, 표현식 사용 가능. 배열 전체를 한 번에 할당 불가 (각 요소별로 해야 함).
y1 = 0; // 불법: 전체 할당 불가
y2[0] = 8'ha2; // 인덱스 0에 0xA2 할당
y2[2] = 8'h1c; // 인덱스 2에 0x1C 할당
y3[1][2] = 8'hdd; // 행 1, 열 2에 0xDD 할당
y3[0][0] = 8'haa; // 행 0, 열 0에 0xAA 할당
주의: 1비트 reg 배열 n개 ≠ n비트 벡터 reg. 전자는 개별 플립플롭 배열, 후자는 단일 벡터 레지스터.
종합 예제: 1D/2D 배열 모델링
module des();
reg [7:0] mem1; // 8비트 벡터
reg [7:0] mem2 [0:3]; // 8비트 벡터 배열, 깊이 4
reg [15:0] mem3 [0:3][0:1]; // 16비트 벡터 2D 배열, 4행 2열
int i, j;
initial begin
mem1 = 8'ha9;
$display("mem1 = 0x%0h", mem1);
mem2[0] = 8'haa; mem2[1] = 8'hbb; mem2[2] = 8'hcc; mem2[3] = 8'hdd;
for (i = 0; i < 4; i++) $display("mem2[%0d] = 0x%0h", i, mem2[i]);
for (i = 0; i < 4; i++) for (j = 0; j < 2; j++) begin
mem3[i][j] = i + j;
$display("mem3[%0d][%0d] = 0x%0h", i, j, mem3[i][j]);
end
end
endmodule
메모리 (Memories)
디지털 저장 요소(RAM, ROM)를 모델링할 때 1차원 reg 배열을 사용하며 이를 메모리라 부릅니다. 각 요소가 한 워드를 나타내며 단일 인덱스로 접근.
레지스터 벡터 방식 (단일 워드 저장)
module des (
input wire clk,
input wire rstn,
input wire wr,
input wire sel,
input wire [15:0] wdata,
output wire [15:0] rdata
);
reg [15:0] register;
always @(posedge clk) begin
if (!rstn) register <= 0;
else if (sel && wr) register <= wdata;
end
assign rdata = (sel && !wr) ? register : 0;
endmodule
합성 시 16비트 플롭 1개 + 제어 로직으로 구현.
배열 방식 (멀티 워드 메모리)
module des (
input wire clk,
input wire rstn,
input wire [1:0] addr,
input wire wr,
input wire sel,
input wire [15:0] wdata,
output wire [15:0] rdata
);
reg [15:0] register [0:3];
integer i;
always @(posedge clk) begin
if (!rstn) for (i = 0; i < 4; i++) register[i] <= 0;
else if (sel && wr) register[addr] <= wdata;
end
assign rdata = (sel && !wr) ? register[addr] : 0;
endmodule
합성 시 16비트 플롭 4개 + 주소 디코더 + 멀티플렉서로 구현. 이 방식이 실제 RAM/ROM 모델링에 적합.
핵심 차이 요약
| 구현 방식 | 구조 | 용도 |
| 단일 레지스터 벡터 | 1개 플롭 | 상태 레지스터, 단일 값 저장 |
| reg 배열 (메모리) | 다중 플롭 + 주소 디코딩 | RAM, ROM, 레지스터 파일, FIFO |