Verilog 설계의 모든 행동 코드는 module~endmodule 안에 들어갑니다. 모듈은 입출력 포트로 외부와 통신합니다. 모듈 기본 구조 module testbench; endmodule // 빈 모듈 module dff (input d, clk, rstb, output q); endmodule // 포트 있는 모듈 데이터 타입: reg vs wire 타입비유할당 위치 reg변수 (값 저장)initial, always 블록 내부 wire전선 (연속 구동 필요)assign 문, 포트 연결,
Verilog에는 두 가지 프로시저럴 블록이 있습니다: initial (한 번 실행)과 always (반복 실행). initial 블록은 시뮬레이션 전용으로 합성되지 않습니다. 문법 initial statement; initial begin ... end initial 블록의 용도 시뮬레이션 시작 시 변수/신호 초기화 테스트벤치 자극(Stimulus) 생성: 입력 신호 시퀀스 구동 $display, $monitor, $finish 등 시스템 태스크 호출 메모리/파일 로드: $readmemb, $readmemh
always 블록은 순차 논리(메모리 요소 포함) 구현의 주력 도구입니다. 클럭 에지 기반 상태 업데이트 패턴을 마스터하세요. JK 플립플롭 진리표: J=K=0 유지, J=0/K=1 리셋(0), J=1/K=0 세트(1), J=K=1 토글. module jk_ff (input j, k, rstn, clk, output reg q); always @(posedge clk or negedge rstn) begin if (!rstn) q <= 0; else q <= (j & ~q) | (~k
이전 글에서 assign 문으로 조합 논리를 다뤘다면, 이번엔 always 블록으로 같은 회로들을 구현합니다. always @(*) 패턴이 현대적 표준입니다. 예제 1: 기본 조합 논리 (5입력) module combo (input a, b, c, d, e, output reg z); always @(a or b or c or d or e) begin z = ((a & b) | (c ^ d) & ~e); // 블로킹 할당(=) 사용 end endmodule 중요: 조합 논리 always 블록에서는
always 블록은 Verilog의 프로시저럴(절차적) 블록 중 하나로, 내부 문장들이 순차 실행됩니다. 하드웨어의 동시 동작을 모델링하기 위해 민감도 리스트(sensitivity list) 또는 타이밍 제어로 트리거됩니다. 문법 always @(event) statement; always @(event) begin ... end 민감도 리스트란? @( ... ) 안에 트리거 신호 나열. 나열된 신호 중 값이 변경될 때마다 블록 실행. always @(a or b) begin ... end // a 또는 b 변경 시 실행 (
여러 비트 와이어/변수를 { }로 묶어 더 큰 벡터를 만드는 결합, 같은 표현식을 반복하는 복제 연산자를 마스터하세요. 결합 연산자 { } 피연산자: 와이어, 변수, 표현식, 크기 지정된 상수. 각 피연산자 크기를 알아야 전체 크기 계산 가능. 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], 2b00, c[2]}; // res1[7]=b, [6]
디지털 회로에서 데이터 처리는 필수입니다. 합성 도구가 적절한 하드웨어로 매핑할 수 있는 Verilog 연산자들을 카테고리별로 정리합니다. 산술 연산자 (Arithmetic) 연산자설명비고 a + b덧셈 a - b뺄셈 a * b곱셈DSP 블록 매핑 가능 a / b나눗셈b=0 시 결과 x, 합성 비용 큼 a % b나머지b=0 시 x a ** b거듭제곱피연산자 중 실수 있으면 결과 실수, b=0 시 1 module des; reg [7:0] d1, d2; in
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
wire 타입 신호는 연속적으로 값을 구동해야 합니다. 브레드보드에서 전선이 배터리 전압을 계속 전달하는 것과 같습니다. Verilog에서 이 개념을 구현하는 것이 assign 문(연속 할당)입니다. assign 문법 assign = [drive_strength] [delay] ; LHS: 스칼라/벡터 넷 또는 넷의 결합 (절대 reg 불가) RHS: 상수, 신호 표현식, 레지스터, 함수 호출 가능 드라이브 강도/지연: 데이터플로 모델링용, 합성 시 대부분 무시 동작: RHS 피연산자 중 하나라도 값 변경 시
복잡한 설계는 여러 모듈을 계층적으로 통합해 만듭니다. 모듈 인스턴스화 시 포트 연결은 순서 기반(Ordered)과 이름 기반(Named) 두 가지 방식이 있습니다. 1. 순서 기반 연결 (Ordered List) 포트 리스트 순서대로 매핑. 설계 모듈의 포트 순서를 알아야 하며, 포트 추가/순서 변경 시 연결이 깨지기 쉽습니다. module mydesign (input x, y, z, output o); endmodule module tb_top; wire [1:0] a; wire b, c; mydesign d0
포트는 모듈과 외부 세상을 연결하는 핀(Pin) 역할을 합니다. 모듈을 PCB 위 칩으로 비유하면 포트는 패키지 핀과 같습니다. 포트 방향 3가지 포트방향설명 input외부 → 내부모듈이 외부에서 값만 수신 output내부 → 외부모듈이 외부로 값만 송신 inout양방향양방향 버스 등에서 송수신 모두 가능 포트 기본 타입은 wire (넷)입니다. 포트 선언 문법 input [net_type] [range] port_names; inout [net_type] [range] port_nam
module은 특정 기능을 구현하는 Verilog 코드 블록입니다. 모듈은 다른 모듈 안에 중첩될 수 있으며, 상위 모듈은 하위 모듈의 입출력 포트를 통해 통신합니다. 모듈 문법 module ([port_list]); // 모듈 내용: 변수 선언, 데이터플로 문장, 함수/태스크, 하위 모듈 인스턴스 endmodule // 포트 리스트가 비어도 됨 module name; // 내용 endmodule module~endmodule 사이에 모든 선언/문장 위치 포트 리스트에 선언된 포트는 모듈 본문에서 재선
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비트 배열 요소 접근 및 할당 모든 차원
Verilog는 단일 비트(스칼라)와 비트 그룹(벡터)을 모두 표현해야 합니다. 플립플롭은 1비트지만 16비트 레지스터는 16비트를 저장합니다. 스칼라 vs 벡터 선언 스칼라: 범위 지정 없음 → 1비트 벡터: [MSB:LSB] 범위 지정 → 다중 비트 wire o_nor; // 1비트 스칼라 넷 wire [7:0] o_flop; // 8비트 벡터 넷 reg parity; // 1비트 스칼라 변수 reg [31:0] addr; // 32비트 벡터 변수 (주소 저장용)
Verilog 데이터 타입의 주 목적은 하드웨어 저장 요소(플립플롭의 비트)와 전송 요소(게이트 간 연결 와이어)를 모델링하는 것입니다. 4값 논리 시스템 (Value Set) 거의 모든 데이터 타입이 다음 4가지 값만 가집니다 (real, event 제외). 값의미 0로직 0, 거짓, 그라운드(0V) 1로직 1, 참, 전원 전압(Vdd, 0.8V~3V+) x / X알 수 없음 (0 또는 1일 수 있음). 불 대수의 Dont Care와 다름 z / Z고임피던스 (Hi-Z), 미연결 상태
Verilog의 렉시컬 관례는 C와 유사합니다. 토큰 스트림으로 구성되며, 토큰은 주석, 키워드, 숫자, 문자열, 공백 등이 될 수 있습니다. 모든 문장은 세미콜론(;)으로 끝나야 하며, 대소문자 구분(case-sensitive)됩니다. 주석 한 줄 주석: //부터 줄 끝까지 여러 줄 주석: /* ... */ (중첩 불가) 한 줄 주석은 여러 줄 주석 안에 중첩 가능 // 한 줄 주석 integer a; // 변수 선언 후 주석 /* 여러 줄 주석 */ /* /* 중첩 불가 */ */ // 에러 /* // 이
Verilog 언어 세부 사항을 다루기 전에, 칩 설계의 추상화 계층을 이해하는 것이 필수입니다. 각 계층은 다른 세부 수준에서 설계를 바라봅니다. 추상화 계층 피라미드 1. 시스템 레벨 아키텍처 (최상위) 기능별로 서브 블록을 그룹화하고 최상위 블록으로 캡슐화합니다. 예: 프로세서 클러스터(멀티 코어, 캐시, 코히어런스 로직)를 단일 블록으로 표현, 입출력 신호만 노출. 2. RTL / 행동 모델링 (Hardware Description Language) 각 서브 블록의 기능을 Verilog/VHDL로 기술합니다. 회로도,
일반적인 ASIC(Application Specific Integrated Circuit) 설계 플로우는 여러 단계로 구성되며, 일부는 병렬로, 일부는 순차적으로 진행됩니다. 업계에서 통용되는 전형적인 프로젝트 설계 사이클을 단계별로 살펴봅니다. 1. 요구사항 분석 (Requirements) 반도체 기업의 고객은 보통 해당 칩을 자사 시스템/제품에 탑재할 타 기업입니다. 고객 요구사항을 수집하고, 최종 제품의 시장 가치를 추정하며, 프로젝트에 필요한 리소스(인력, 일정, 예산)를 평가합니다. 2. 사양 정의 (Specificat
초기 집적회로 설계 시절, 엔지니어들은 트랜지스터와 연결을 종이에 직접 그려가며 실리콘 제작용 레이아웃을 설계했습니다. 회로가 복잡해지자 더 나은 설계 방식이 필요해졌고, VHDL이 먼저 등장해 하드웨어 기능을 기술하면 자동화 도구가 게이트 레벨로 변환해주는 흐름을 열었습니다. 이후 Verilog가 더 간결하고 유연한 문법으로 등장해 오늘날 반도체 업계에서 가장 널리 쓰이는 HDL(Hardware Description Language)이 되었습니다. Verilog가 유용한 이유 Verilog는 구현 세부사항을 추상화해 동작(beh
Verilog는 엔지니어가 FPGA와 ASIC용 디지털 로직을 모델링, 시뮬레이션, 합성할 수 있게 해주는 하드웨어 기술 언어(HDL)입니다. 가까운 사촌 VHDL과 함께 Verilog는 학계 커리큘럼과 상용 제품 개발 모두에서 업계 표준 언어입니다. 프로그래머블 로직이나 실리콘 설계가 처음이라면 이 가이드가 Verilog 기초를 안내하고 모든 디지털 시스템의 기초 요소인 간단한 AND 게이트 구축법을 보여줍니다. Java나 C 같은 고수준 소프트웨어 언어와 달리 Verilog는 게이트 레벨에서 하드웨어를 기술합니다. 결과는 실리콘
verilog