사전적 규약
C프로그래밍과 매우 유사하다.
주석
주석은 가독성과 문서화를 위해 코드에 들어간다. 주석을 사용하는 방법은 두가지가 있다. 한 줄 주석은 //로 시작하고, 여러줄 주석은 /*로시작해 */로 끝난다.
연산자
연산자는 단항, 이항, 삼항 세 가지 형이 있다.
수 표현
Verilog는 크기 지정 기능과 크기 지정 불가능 형태의 두 가지 수 표현이 있다.
크기 지정 가능 수
형식 : <크기>'<기본형식><숫자>
<크기>는 숫자의 비트 수의 개수를 나타내고, 오직 10진수만 가능하다. <기본형식>은 10진수(d), 16진수, 2진수(b) 등이 있다.
크기 지정 불가능 수
<기본형식>을 지정하지 않은 숫자는 기본적으로 10진수이다. <크기>가 지정되지 않은 숫자는 시뮬레이터나 기계마다 다른 기본값을 갖는다.(최소한 32bit는 된다.)
X, Z값
Verilog는 알 수 없는 값(unknown)과 하이 임피던스(high impedance)값을 나타내는 기호를 제공한다.
음수
음수는 숫자의 <크기> 앞에 음수 부호를 붙이면 된다. 부호와 상관없이 <크기>는 항상 양의 값을 갖는다.
언더스코어 문자와 물음표
언더스코어 _는 가독성을 높여준다. 물음표 ?는 <숫자>에서 z와 같은 역할을 한다.
식별자와 키워드
키워드는 언어 구조를 정의하기 위해 미리 예약된 특별한 식별자이다.
데이터 형
Verilog에 사용되는 데이터형을 알아본다.
논리값 집합
Verilog는 실제 하드웨어의 기능을 모델로 한 4개의 논리값을 지원한다.
넷(Nets)
넷은 하드웨어 요소 사이에 연결을 나타낸다. 넷은 연결되어 있는 장치의 출력으로 유도되는 연속적인 값을 갖는다. 다음 그림은 출력 out이 and 게이트의 출력으로 연결되어 있는 것을 볼 수 있는데 이는 out이 게이트 AND21에 의해 생성된 출력 in1&in2를 연속적으로 갖게 된다.
넷은 키워드 wire에 의해 정의된다. 넷의 크기를 정하는 벡터를 지정하지 않으면, 기본적으로 1bit 넷이 선언된다. 넷의 기본값은 z이다.
wire in1; // 위의 회로에서 넷 i1을 정의
wire in2; // 위의 회로에서 넷 i2를 정의
wire d = 1'b0 // 넷 d는 논리값 0으로 선언
레지스터
레지스터는 데이터를 저장할 수 있다. 또한 다른 논리값이 들어오기 전까지는 그 값을 유지할 수 있다. Verilog에서 말하는 레지스터는 실제 하드웨어 레지스터와 다르며 단지 값을 저장할 수 있는 변수를 의미한다. 넷과 달리 레지스터는 신호의 유도를 필요로 하지 않는다. 키워드 reg에 의해 정의된다.
reg reset;
initial begin
reset = 1'b1;
#100 reset = 1'b0;
end
벡터
넷과 reg데이터형은 벡터(여러 비트폭을 가진)로 선언될 수 있다. 만약 폭이 선언되어 있지 않으면 기본값은 스칼라(1bit)이다.
벡터는 [높은수:낮은수] 또는 [낮은수:높은수]로 나타낼 수 있다. 그러나 항상 왼쪽에 있는 것이 최상위 비트를 나타낸다.
벡터 부분 선택
아래의 벡터 선언처럼, 주소 비트 또는 벡터의 일부분을 나타낼 수 있다.
가변 벡터 부분 선택
Verilog는 벡터의 가변 부분 선택도 제공한다. 이는 다양한 벡터의 일부분을 선택하기 위해 루프를 집어넣는 부분 선택을 할 수 있다.
[<시작 비트>+:폭] - 시작비트부터 부분 선택 증가
[<시작 비트>-:폭] - 시작비트부터 부분 선택 감소
정수, 실수, 시간 레지스터 데이터형
Verilog는 정수, 실수, 시간 레지스터 데이터형을 지원한다. 이것들은 오직 testbench에서 사용된다.
정수
키워드 integer에 의해 선언되며, 양을 다루기 위한 일반적인 범용 레지스터 데이터형이다. 변수보단 카운트 같은 목적을 위해 정수를 사용하는 것이 편한다. reg로 선언되는 레지스터는 음수 사용이 불가능하지만 inteager는 가능하다.
실수
키워드 real에 의해 선언되며 십진표기법(3.14) 또는 과학적 표기법(3e6)으로 나타낼 수 있다.
real delta;
initial begin
delta = 4e10;
delta = 2.13
end
integer i;
initial i = delta;
시간
Verilog 시뮬레이션은 시뮬레이션 시간을 고려하면서 동작한다. 시뮬레이션 시간을 지정하기 위해 Verilog는 시간 레지스터 데이터형을 사용한다. 시간값은 키워드 time에 의해 선언된다.
배열
Verilog는 reg, integer, time, real, realtime그리고 벡터 레지스터 데이터형의 배열을 제공한다. 다차원 배열은 어떠한 차원으로도 선언된다. 넷의 배열 또한 생성된 인스턴스의 연결포트에 사용될 수 있다.
형식 : <배열 이름>[<서브스크립트>]
배열과 벡터의 차이점
- 벡터는 n-bit의 폭을 가지는 하나의 원소이다.
- 배열은 1-bit 또는 n-bit를 가지는 여러 원소이다.
메모리
Verilog에서 메모리는 단순히 레지스터의 배열로 만들어진다. 배열의 각 원소는 워드이다. 각 워드는 1또는 여러 비트가 될 수 있다. 대부분 배열의 사용은 메모리에서 사용된다.
파라미터
키워드 parameter로 모듈 내에서 상수를 정의할 수 있다. 파라미터는 변수로 사용할 수 없다.
parameter port_id = 5
각 모듈 인스턴스의 파라미터값은 컴파일 시 개별적으로 대치 된다. 이러한 방법으로 모듈 인스턴스를 개별적으로 조절할 수 있는데 나중에 살펴보자. 키워드 localpara은 파라미터 값이 절대 변해서는 안될 때 사용한다.
문자열
문자열은 reg에 저장될 수 있다. 레지스터 변수의 폭은 문자열을 저장할 수 있을 만큼 커야된다. 각 문자는 1byte를 차지.
시스템 태스크와 컴파일러 지시어
이 절에서는 시스템 태스크와 컴파일러 지시어라는 Verilog에서 사용하는 두 가지 특별한 개념을 소개한다.
시스템 태스크
모든 시스템 태스크는 $<키워드> 형태로 나타낸다. 시스템 태스크에 의한 연산은 화면에 출력하고, 넷의 값을 모니터링하고, 멈추고, 끝내는 것들이다.
화면 출력 태스크
$display는 변수의 값 또는 문자열 또는 수식을 출력하기 위한 주요 시스템 태스크이다. C의 printf와 유사하다.
모니터링 태스크
$monitor태스크로 신호의 값이 변할 때마다 그 신호를 출력할 수 있다. 변수 또는 파라미터에 지정된 신호의 값을 계속 모니터링하고, 리스트의 어느 한 변수나 신호가 변할 때마다 모든 파라미터를 출력한다.
시뮬레이션 중단과 종료 태스크
$stop : 시뮬레이션을 중단한다. (상호 작용 모드(디버깅) 시뮬레이션에서 사용된다.)
$finish : 시뮬레이션을 끝내기 위해 사용된다.
initial begin
clock = 0;
reset = 1;
#100 $stop;
#1000 $finish;
end
컴파일러 지시어
'define
'define 지시어는 Verilog에서 텍스트 매크로를 정의하는데 사용한다. C에서 #define과 유사하다.
'include
'include 지시어는 다른 Verilog 파일에 있는 Verilog 소스 파일의 전체 내용을 컴파일하는 동안 포함하게 해준다. C의 #include와 유사하다.
'UVM & RTL > Verilog HDL' 카테고리의 다른 글
[Verilog HDL] CH6 dataflow 모델링 (0) | 2022.06.14 |
---|---|
[Verilog HDL] CH4 모듈과 포트 (0) | 2022.06.14 |
[Verilog HDL] Instruction (0) | 2022.06.10 |
[33] Verilog HDL 순차회로 설계과제 ( FSM ) (0) | 2022.03.07 |
[32] Verilog HDL 순차회로( FSM ) (0) | 2022.03.06 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!