프로젝트/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
일단 정리는 해두었고 실습으로 익숙해지는 것이 좋겠다! 더 필요한 내용이 있으면 추가하겠다!
반응형