변하지않는 고정된 값
Verilog에서 상수는 코드 내에서 사용하는 고정된 숫자 값이다.
회로의 비트폭, 초기값, 설정값등을 지정할 때 사용한다.
코드에 직접 쓰는 숫자 표현
Verilog에는 숫자를 표현하는 고유한 문법이 존재한다.
비트폭 ' [s] 진법 값
│ │ │ │
│ │ │ └── 실제 숫자(값)
│ │ └────── 진법 표시 (b, o, d, h)
│ └───────── signed/unsigned (s 가 있으면 signed, 없으면 unsigned)
└─────────────── 몇 비트인지(크기)
위와 같은 문법으로 숫자를 표현한다
8'b1010_0011 // 8비트, 2진법: 10100011 (8비트로 표현 가능)
8'o243 // 8비트, 8진법: 243₈ = 163₁₀ (0b010100011 이므로 8비트로 표현 가능)
8'd163 // 8비트, 10진법: 163 (0b10100011 이므로 8비트로 표현 가능)
8'hA3 // 8비트, 16진법: A3₁₆ = 163₁₀ (0b10110011 이므로 8비트로 표현 가능)
15 // 진법을 생략한 경우, 자동으로 10진수 32비트로 해석된다.
Verilog에서 Unerscore는 가독성만을 위한 것이고, 값에 주는 영향은 없다.
보통 4비트씩 언더스코어(_)로 끊어서 표현하여 가독성을 높인다.
// 읽기 어려움
32'b10110100111010001111000011001010
// 읽기 쉬움 (4비트씩 구분)
32'b1011_0100_1110_1001_1111_0000_1100_1010
// 16진법은 보통 4자리씩
32'hDEAD_BEEF
8'hxx // = 8'bxxxx_xxxx (8비트 모두 x)
8'hzz // = 8'bzzzz_zzzz (8비트 모두 z)
8'h0z // = 8'b0000_zzzz
x,z와 같은 경우에도 위와 같이 축약된 표현이 가능하다.
Verilog에서 음수는 아래와 같이 표현한다
-8'sd5 // ✅ 올바름: -5를 8비트로 (2의 보수: 8'b1111_1011)
8'-d5 // ❌ 문법 오류! 부호는 맨 앞에
헷갈리기 쉬운 포인트가, 부호를 숫자 앞이 아니라 진수 표현 바로 앞, 즉 숫자 리터럴의 가장
앞에 적어줘야한다.
컴파일 지시어는 컴파일 시점에 실행되는 코드이다. (Runtime에 실행되는 코드가 아니다)
`define으로 매크로(=텍스트 치환)를 정의하고, `undef로 기존에 정의한 매크로 정의를 해제할 수 있다.
문법은 아래와 같다
`define WIDTH 32
`define ADD(a,b) ((a)+(b))
`undef WIDTH
define 뒤에 값을 쓰지않고
`define FPGA
이런식으로만 매크로의 이름만 쓸 수도 있다.
C언어의 include와 동일하다. 현재 파일에 헤더 파일을 복붙하는 역할을 수행한다.
문법은 아래와 같다
`include "defs.vh"
마찬가지로 C언어와 동일하다.
특정 매크로가 정의되어 있으면/없으면 코드 블럭을 선택적으로 컴파일하는 기능이다.
문법은 아래와 같다.
`ifdef FPGA
// FPGA용 코드
`elsif ASIC
// ASIC용 코드
`else
// 기본
`endif
마지막에 `endif 를 꼭 적어줘야한다.
# 10 과 같은 시간 지연의 단위를 정할때 사용하는 컴파일 지시어이다.
문법은 아래와 같다.
`timescale 1ns/1ps
여기서 앞은 time unit이고 뒤는 time precison(시간 정밀도=카운트하는 단위) 이다.
코드의 최상단에 적어주면된다.