원래 Verilog 표준(IEEE 1364)은 1995년에 만들어진 이후 여러 번 업데이트되었습니다.
가장 중요한 업데이트는 IEEE 1394-2001이라는 제목의 2001년에 발생했습니다. 2005년에는 표준에 약간의 개선 사항이 추가되어 IEEE 1394-2005가 되었습니다.
Verilog의 기능(예: 연산자, 신호 유형, 기능)은 Verilog 표준 내에서 정의됩니다. 따라서 설계가 IEEE 1394 패키지를 사용하고 있다고 명시적으로 명시할 필요는 없습니다. 이는 Verilog 사용에 내재되어 있기 때문입니다.
Verilog는 대소문자를 구분합니다. 또한 각 Verilog 할당, 정의 또는 선언은 세미콜론(;)으로 종료됩니다. 따라서 줄 바꿈이 허용되며 할당, 정의 또는 선언의 끝을 의미하지 않습니다. 줄 바꿈을 사용하여 Verilog를 더 읽기 쉽게 만들 수 있습니다.
Verilog의 주석은 두 가지 방식으로 지원됩니다.
첫 번째 방법은 줄 주석이라고 하며 앞에 두 개의 슬래시(예: //)가 붙습니다. 슬래시 뒤의 모든 것은 줄 끝까지 주석으로 간주됩니다.
두 번째 주석 접근 방식은 블록 주석이라고 하며 /*로 시작하여 */로 끝납니다. /*와 */ 사이의 모든 것은 주석으로 간주됩니다. 블록 주석은 여러 줄에 걸쳐 있을 수 있습니다.
Verilog의 모든 사용자 정의 이름은 숫자가 아닌 알파벳 문자로 시작해야 합니다. 사용자 정의 이름은 Verilog 키워드와 동일할 수 없습니다.
데이터 타입
Verilog에서 모든 신호, 상수, 변수 및 기능에는 데이터 유형이 할당되어야 합니다. IEEE 1394-2005 표준은 미리 정의된 다양한 데이터 유형을 제공합니다. 일부 데이터 유형은 합성할 수 있지만 다른 데이터 유형은 추상 동작을 모델링하기 위한 것입니다.
다음은 Verilog 언어에서 가장 일반적으로 사용되는 데이터 유형입니다.
Value 유형
Verilog는 신호가 취할 수 있는 4가지 기본 값인 0, 1, X, Z를 지원합니다. Verilog에서 미리 정의된 대부분의 데이터 유형은 이러한 값을 저장합니다.
지원되는 각 값에 대한 설명은 다음과 같습니다.
Value |
Description |
0 |
A logic zero, or false condition. |
1 |
A logic one, or true condition. |
x or X |
Unknown or uninitialized. |
z or Z |
High impedance, tri-stated, or floating. |
Verilog에서 이러한 값에는 관련 강도도 있습니다. 강도는 신호가 여러 소스에 의해 구동될 때 신호의 값을 해결하는 데 사용됩니다. 이름, 구문 및 상대적인 강점은 다음과 같습니다.
Strength |
Description |
Strength level |
supply1 |
Supply drive for VCC |
7 |
supply0 |
Supply drive for VSS, or GND |
7 |
strong1 |
Strong drive to logic one |
6 |
strong0 |
Strong drive to logic zero |
6 |
pull1 |
Medium drive to logic one |
5 |
pull0 |
Medium drive to logic zero |
5 |
large |
Large capacitive |
4 |
weak1 |
Weak drive to logic one |
3 |
weak0 |
Weak drive to logic zero |
3 |
medium |
Medium capacitive |
2 |
small |
Small capacitive |
1 |
highz1 |
High impedance with weak pull-up to logic one |
0 |
highz0 |
High impedance with weak pull-down to logic zero |
0 |
신호가 여러 드라이버에 의해 구동될 때 가장 강도가 높은 드라이버의 값을 취합니다. 두 드라이버의 강도가 같으면 값을 알 수 없습니다. 강도를 지정하지 않으면 기본적으로 강한 드라이브 또는 레벨 6이 됩니다.
Net 데이터 유형
Verilog 내의 모든 신호는 데이터 유형과 연결되어야 합니다. 네트 데이터 유형은 구성요소 간의 상호 연결(일명 네트)을 모델링하고 0, 1, X 및 Z 값을 가질 수 있는 유형입니다. 네트 데이터 유형의 신호는 항상 구동되어야 하고 값을 업데이트해야 합니다.
드라이버 값이 변경될 때 Verilog에서 가장 일반적으로 합성 가능한 순 데이터 유형은 유선입니다. 동일한 네트워크에 대해 여러 드라이버가 있는 복잡한 디지털 시스템을 모델링하는 다양한 고급 네트워크 데이터 유형이 있습니다.
모든 Verilog net 데이터 유형에 대한 구문과 설명은 아래에 나와 있습니다.
Type |
Description |
wire |
A simple connection between components. |
wor |
Wired-OR. If multiple drivers, their values are OR’d together. |
wand |
Wired-AND’d. If multiple drivers, their values are AND’d together. |
supply0 |
Used to model the VSS, (GND), power supply (supply strength inherent). |
supply1 |
Used to model the VCC power supply (supply strength inherent). |
tri |
Identical to wire. Used for readability for a net driven by multiple sources. |
trior |
Identical to wor. Used for readability for nets driven by multiple sources. |
triand |
Identical to wand. Used for readability for nets driven by multiple sources. |
tri1 |
Pulls up to logic one when tri-stated. |
tri0 |
Pulls down to logic zero when tri-stated. |
trireg |
Holds last value when tri-stated (capacitance strength inherent). |
이러한 각 네트 유형에는 관련된 추진력도 있을 수 있습니다. 강도는 여러 드라이버에 연결될 때 네트의 최종 값을 결정하는 데 사용됩니다.
Variable 데이터 유형
Verilog에는 스토리지를 모델링하는 데이터 유형도 포함되어 있습니다. 이를 가변 데이터 유형이라고 합니다. 가변 데이터 유형은 0, 1, X 및 Z 값을 가질 수 있지만 연관된 강도는 없습니다. 변수 데이터 유형은 다음 할당까지 할당된 값을 유지합니다. Verilog 변수 데이터 유형에 대한 구문 및 설명은 아래에 나와 있습니다.
Type |
Description |
reg |
A variable that models logic storage. Can take on values 0, 1, X, and Z. |
integer |
A 32-bit, 2’s complement variable representing whole numbers between 2,147,483,64810 and +2,147,483,647. |
real |
A 64-bit, floating point variable representing real numbers between – (2.2 10308)10 and +(2.2 10308)10. |
time |
An unsigned, 64-bit variable taking on values from 010 to +(9.2 1018). |
realtime |
Same as time. Just used for readability. |
벡터
Verilog에서 벡터는 요소의 1차원 배열입니다. 변수 유형 reg 외에도 모든 순 데이터 유형을 사용하여 벡터를 형성할 수 있습니다. 벡터를 정의하는 구문은 다음과 같습니다.
<type> [<MSB_index>:<LSB_index>] vector_name
모든 범위의 인덱스를 사용할 수 있지만 LSB 인덱스를 0에서 시작하는 것이 일반적입니다.
와이어 유형의 "Sum"이라고 하는 8비트 벡터를 정의합니다. MSB는 인덱스 7이 지정되고 LSB는 인덱스 0이 지정됩니다.
wire [7:0] Sum;
reg 유형의 "Q"라고 하는 16비트 벡터를 정의합니다.
reg [15:0] Q;
벡터 내의 개별 비트는 해당 인덱스를 사용하여 주소를 지정할 수 있습니다. 인덱스 범위를 사용하여 비트 그룹에 액세스할 수 있습니다.
다음은 위에서 정의한 벡터 "Sum"의 최하위 비트입니다.
Sum[0];
다음은 위에서 정의한 16비트 벡터 "Q"의 상위 8비트입니다.
Q[15:8];
배열
배열은 요소의 다차원 배열입니다. 이것은 또한 "벡터의 벡터"로 생각할 수 있습니다.
배열 내의 벡터는 모두 동일한 차원을 갖습니다. 배열을 선언하려면 요소 유형과 차원을 먼저 정의한 다음 배열 이름과 차원을 정의합니다. 차원을 정의할 때 ":"의 왼쪽에 배열의 시작 인덱스를 배치하는 것이 일반적입니다.
배열 생성 구문은 다음과 같습니다.
<element_type> [<MSB_index>:<LSB_index>] array_name [<array_start_index>:
<array_end_index>];
4096, reg 유형의 8비트 벡터 배열을 정의합니다.
reg[7:0] Mem[0:4095];
100개의 정수 배열을 정의합니다.
integer A[1:100];
배열에 접근할 때 배열의 이름이 먼저 주어지고 그 다음에 요소의 인덱스가 주어집니다. 요소의 인덱스를 추가하여 배열 내의 개별 비트에 액세스하는 것도 가능합니다.
다음은 "Mem"이라는 배열 내의 세 번째 요소입니다. 이 구문은 reg 유형의 8비트 벡터를 나타냅니다.
Mem[2];
다음은 "Mem"이라는 배열 내 세 번째 요소의 MSB입니다. 이 구문은 reg 유형의 단일 비트를 나타냅니다.
Mem[2][7];
다음은 "A"라는 배열 내의 두 번째 요소입니다. A는 시작 인덱스 1로 선언되었음을 기억하십시오. 이 구문은 32비트 부호 있는 정수를 나타냅니다.
A[2];
다른 기반를 사용하여 숫자 표현하기
구문을 식별하지 않고 Verilog에 단순히 숫자를 입력하면 정수로 처리됩니다.
그러나 Verilog는 다른 기반에서 숫자 정의를 지원합니다. Verilog는 또한 숫자의 선택적 비트 크기 및 부호를 지원합니다. 배열의 값을 정의할 때 가독성을 높이기 위해 숫자 사이에 "_"를 삽입할 수 있습니다. Verilog 컴파일러는 "_"를 무시합니다. 숫자 값은 대문자 또는 소문자로 입력할 수 있습니다(예: b 또는 B, f 또는 F). 숫자의 밑을 지정하는 구문은 다음과 같습니다.
<size_in_bits>’<base><value>
크기 지정은 선택 사항입니다. 생략하면 숫자는 필요에 따라 선행 0이 추가된 32비트 벡터로 기본 설정됩니다. 지원되는 기반은 다음과 같습니다.
Syntax |
Description |
‘b |
Unsigned binary. |
‘o |
Unsigned octal. |
‘d |
Unsigned decimal. |
‘h |
Unsigned hexadecimal. |
‘sb |
Signed binary. |
‘so |
Signed octal. |
‘sd |
Signed decimal. |
‘sh |
Signed hexadecimal. |
10 // This is treated as decimal 10, which is a 32-bit signed vector.
4’b1111 // A 4-bit number with the value 1111.
8’b1011_0000 // An 8-bit number with the value 10110000.
8’hFF // An 8-bit number with the value 11111111.
8’hff // An 8-bit number with the value 11111111.
6’hA // A 6-bit number with the value 001010. Note that leading zeros were added to make
the value 6-bits.
8’d7 // An 8-bit number with the value 00000111.
32’d0 // A 32-bit number with the value 0000_0000.
‘b1111 // A 32-bit number with the value 0000_000F.
8’bZ // An 8-bit number with the value ZZZZ_ZZZZ.
다른 유형 간 할당
Verilog는 약한 유형의(또는 느슨한 유형의) 언어라고 합니다. 즉, 서로 다른 데이터 유형 간의 할당을 허용합니다. 이것은 신호 할당이 유사한 유형 사이에서만 허용되는 강력한 유형의 언어(예: VHDL)와 반대입니다.
Verilog가 다른 유형 간의 할당을 허용하는 이유는 모든 유형을 비트 그룹으로 취급하기 때문입니다.
서로 다른 유형 간에 할당할 때 Verilog는 할당 작업을 수행하는 데 필요한 선행 비트를 자동으로 자르거나 추가합니다.
다음 예는 Verilog가 서로 다른 유형 간의 몇 가지 할당을 처리하는 방법을 보여줍니다. ABC_TB라는 변수가 reg[2:0] 유형으로 선언되었다고 가정합니다.
ABC_TB는 3'b000으로 지정됩니다. 선행 비트가 자동으로 추가됩니다.
ABC_TB = 2’b00;
ABC_TB는 3'b101로 지정됩니다. 정수는 3비트로 잘립니다.
ABC_TB = 5;
ABC_TB는 3'b000으로 지정됩니다. 정수는 3비트로 잘립니다.
BC_TB = 8;