프로젝트/FPGA

[FPGA] Verilog 문법

잡학다식을꿈꾼다 2025. 5. 15. 15:23
반응형

 

Verilog HDL은 C 스타일의 회로를 다루는 프로그래밍 언어이다. 차이점은 프로그램의 경우, 절차적으로 수행되지만 Verilog의 경우 실행과 동시에 모든 코드가 병렬로 수행된다는 것이다. => 코드로 회로를 설계한다!!

 

Module 

하나의 module은 하나의 블록을 의미한다. 입력과 출력에 대한 정의, 내부 동작을 포함한다.

module moudle_name(
	input wire a,
    input wire b,
    output wire y
);
	
    assign y = a&b;

endmodule

 

 

모듈 정의

module 모듈 시작 키워드
endmodule 모듈 종료 키워드
input, output, inout 입출력 포트 정의
wire(연결된 회로망을 의미, 조합회로), reg(값이 저장되는 변수, 순차회로) 내부 신호 정의

 

데이터 타입 설명

정의 시 : <Direction><Data Type><Size><portName>

wire 연결된 회로망을 의미. 조합 회로에서 사용
reg 값이 저장되는 변수. 순차 회로에서 주로 사용
integer 정수값 저장용 변수
real 실수값 저장용 변수

 

연산자

분류  연산자 기호 설명    비고
산술 연산자 + 덧셈 부호 있음/없음 모두 가능
  - 뺄셈  
  * 곱셈 합성 가능하지만 자원 소모 많음
  / 나눗셈 정수 나눗셈, 나머지는 버려짐
  % 나머지 연산  
비트 연산자 & AND 각 비트별 AND 연산
  ` ` OR
  ^ XOR 각 비트별 XOR 연산
  ~ NOT 비트 반전
  ~& NAND NOT (AND)
  `~ ` NOR
  ~^ 또는 ^~ XNOR NOT (XOR)
논리 연산자 && 논리 AND 전체 값이 0인지 아닌지 판단 후 연산
  `   `
  ! 논리 NOT 전체 값이 0이면 1, 아니면 0
관계 연산자 == 같음 비교 비교 결과는 1비트 (1 또는 0)
  != 다름 비교  
  === 동일 비교 (x, z 포함) 정확히 일치해야 참
  !== 동일하지 않음 (x, z 포함)  
  > 크다 signed/unsigned 주의
  < 작다  
  >= 크거나 같다  
  <= 작거나 같다  
시프트 연산자 << 왼쪽 시프트 (zero-fill) 부호 없음
  >> 오른쪽 시프트 (zero-fill)  
  <<< 왼쪽 시프트 (부호 유지) Arithmetic shift
  >>> 오른쪽 시프트 (부호 유지) Arithmetic shift
감소/증가 연산자 ++ 증가 (단항) Verilog-2001 이후 문법
  -- 감소 (단항)  
조건 연산자 ? : 조건 연산 (삼항 연산) C언어와 동일
결합 연산자 {} 집합 (concatenation) 여러 비트를 하나로 결합
  {{}} 복제 (replication) 동일 비트 패턴을 여러 번 반복
할당 연산자 = 블로킹 할당 순서대로 실행
  <= 넌블로킹 할당 동시에 실행, 주로 순차 회로에서 사용
블로킹(=) a = b; 한 문장 실행 후 다음 실행
넌블로킹(<=) a <= b; 병렬적으로 동시에 실행됨 (레지스터 회로 설계시 필수)

조합 논리와 순차 논리(컴퓨터 구조에서 그 combinational, logical이다.)

조합 논리 : assign 키워드로 구현하다. 입력이 바뀌면 즉시 출력이 바뀌는 회로를 의미, reg와 wire 모두 사용 가능

assign y = a & b;

 

순차 논리 : always 블록을 사용한다. 감지 조건에 따라 동작한다. 클럭 등 이벤트에 동기화되어 동작하는 회로를 의미, 반드시 reg여야 한다.

always @(condition) begin
    q <= d;
end

 

블럭 구조 

initial 시뮬레이션 시작 시 1회 실행 (테스트벤치에서 주로 사용)
always 감지 조건에 따라 반복 실행 (순차 논리 회로)
begin ... end 여러 문장을 하나의 블록으로 묶음, 중괄호 역할

 

조건문과 반복문

IF 조건문

if (a == 1) begin
    y = 1;
end else begin
    y = 0;
end

 

CASE 조건문

case (sel)
    2'b00: y = a;
    2'b01: y = b;
    2'b10: y = c;
    default: y = 0;
endcase

 

반복문

for (i = 0; i < 8; i = i + 1) begin
    mem[i] = 0;
end

 

모듈 인스턴스화 

모듈을 다른 모듈 내에서 사용할 수 있다.

and_gate u1 (
    .a(a_sig),
    .b(b_sig),
    .y(y_sig)
);

 

시뮬레이션 예제(모듈을 테스트하는 예제)

module testbench;
    reg a, b;
    wire y;

    and_gate uut (
        .a(a),
        .b(b),
        .y(y)
    );

    initial begin
        a = 0; b = 0;
        #10 a = 1;
        #10 b = 1;
        #10 a = 0;
        #10 $finish;
    end
endmodule

 

일단 정리는 해두었고 실습으로 익숙해지는 것이 좋겠다! 더 필요한 내용이 있으면 추가하겠다!

반응형