반응형

구조 설계 및 계층 구조

Verilog의 구조 설계는 원하는 기능을 생성하기 위해 상위 모듈 내에 하위 시스템을 포함하는 것을 말합니다. 이것을 계층 구조라고 하며 디자인 분할을 가능하게 하기 때문에 좋은 디자인 방법입니다. 순전히 구조적 설계는 신호 할당과 같은 모듈의 동작 구성을 포함하지 않고 대신 다른 하위 시스템의 인스턴스화 및 상호 연결을 포함합니다. Verilog의 하위 시스템은 단순히 상위 수준 모듈에 의해 호출되는 또 다른 모듈입니다. 호출되는 각 하위 레벨 모듈은 호출 모듈에 의해 동시에 실행됩니다.

 

구조 설계 구성

저수준 모듈 인스턴스화

인스턴스화라는 용어는 시스템 내에서 하위 레벨 모듈을 사용하거나 포함하는 것을 말합니다. Verilog에서 하위 모듈을 인스턴스화하는 구문은 다음과 같습니다.

 

module_name <instance_identifier> (port mapping. . .);

 

인스턴스화의 첫 번째 부분은 호출되는 모듈 이름입니다. 대소문자를 포함하여 하위 수준 모듈 이름과 정확히 일치해야 합니다. 인스턴스화의 두 번째 부분은 선택적 인스턴스 식별자입니다. 인스턴스 식별자는 동일한 하위 모듈의 여러 인스턴스를 인스턴스화할 때 유용합니다. 인스턴스화의 마지막 부분은 포트 매핑입니다. 하위 레벨 모듈의 포트에 신호를 연결하는 두 가지 기술(명시적 및 위치적)이 있습니다.

 

1.    명시적 포트 매핑

명시적 포트 매핑에서 하위 수준 하위 시스템의 포트 이름은 연결되는 신호와 함께 제공됩니다. 하위 레벨 포트 이름 앞에는 마침표(.)가 있고 연결 중인 신호는 괄호로 묶입니다. 연결의 세부 사항(, 포트 이름에서 신호 이름으로)이 명시적이므로 포트 연결은 임의의 순서로 나열될 수 있습니다. 각 연결은 쉼표로 구분됩니다. 명시적 포트 매핑 구문은 다음과 같습니다.

 

module_name <instance identifier> (.port_name1(signal1), .port_name2(signal2), etc.);

 

다음은 두 개의 하위 모듈로 구성된 계층적 시스템의 Verilog 모델을 설계하는 방법을 보여줍니다.

 

 

1.    위치 포트 매핑

위치 포트 매핑에서 하위 레벨 모듈의 포트 이름은 명시적으로 나열되지 않습니다.

대신 하위 시스템에 연결될 신호가 하위 시스템에서 정의된 포트와 동일한 순서로 나열됩니다. 각 신호 이름은 쉼표로 구분됩니다. 이 접근 방식은 연결을 설명하는 데 필요한 텍스트가 적지만 신호 순서의 부주의한 실수로 인해 연결이 잘못될 수도 있습니다. 위치 포트 매핑 구문은 다음과 같습니다.

 

module_name : <instance_identifier> (signal1, signal2, etc.);

 

다음 그림은 동일한 구조의 Verilog 모델을 생성하지만 대신 위치 포트 매핑을 사용하는 방법을 보여줍니다.

 

 

게이트 레벨 프리미티브

Verilog는 프리미티브를 사용하여 기본 논리 기능을 모델링하는 기능을 제공합니다. 프리미티브는 명시적 모델링이 필요하지 않을 만큼 간단한 논리 연산입니다. 이 동작의 예는 기본 논리 게이트 또는 진리표일 수 있습니다. Verilog는 간단한 논리 연산을 모델링하기 위해 일련의 게이트 수준 기본 요소를 제공합니다. 이러한 게이트 레벨 프리미티브는 not(), and(), nand(), or(), nor(), xor(), xnor()입니다. 이러한 각 기본 요소는 위치 포트 매핑이 있는 하위 수준 하위 시스템으로 인스턴스화됩니다.

 

각 프리미티브의 포트 순서에는 출력이 먼저 나열되고 입력이 뒤따릅니다. 출력과 각 입력은 스칼라입니다. 게이트 레벨 프리미티브는 Verilog 표준의 일부로 제공되므로 명시적으로 생성할 필요가 없습니다. 게이트 레벨 프리미티브를 사용하는 이점 중 하나는 각 프리미티브가 증가하는 입력 수를 자동으로 수용할 수 있으므로 입력 수를 쉽게 확장할 수 있다는 것입니다.

 

또한 이 접근 방식을 사용한 모델링은 본질적으로 게이트 수준 넷리스트를 제공하므로 기술 매핑을 위해 준비된 매우 낮은 수준의 상세한 게이트 수준 구현을 나타냅니다.

 

 

사용자 정의 프리미티브

UDP(사용자 정의 기본 요소)는 논리 테이블을 사용하여 하위 수준 구성 요소의 동작을 설명하는 시스템입니다. 이것은 여러 번 사용할 조합 논리 기능을 만드는 데 매우 유용합니다. UDP는 기능을 표 형식으로 나열하는 것이 더 편리한 대형 진리표에도 유용합니다. UDP UPD가 자체 파일에서 생성되어야 한다는 점을 제외하고 게이트 수준 기본 요소와 마찬가지로 상위 수준 모듈에서 인스턴스화되도록 의도된 하위 수준 하위 시스템입니다. UDP 구문은 다음과 같습니다.

 

primitive primitive_name (output output_name, input input_name1, input_name2, ...);
table
  in1_val in2_val ... : out_val;
  in1_val in2_val ... : out_val;
            :
endtable
endprimitive

 

UDP는 포트 정의에서 먼저 출력을 나열해야 합니다. 또한 포트에 대해 유형을 정의할 필요가 없습니다. 조합 논리 UDP의 경우 모든 포트는 와이어 유형으로 간주됩니다.

다음 예제는 조합 논리 회로를 구현하기 위해 사용자 정의 프리미티브를 설계하는 방법을 보여줍니다.

 

프리미티브에 지연 추가

지연은 프리미티브에 추가할 수 있습니다. 지연은 기본 이름 뒤에 삽입되지만 인스턴스 이름 앞에 삽입됩니다.

 

지연이 2인 인버터의 게이트 레벨 프리미티브.

not #2 U0 (An, A);

 

지연이 3 AND 게이트의 게이트 레벨 프리미티브.

and #3 U3 (m0, An, Bn, Cn);

 

1의 지연이 있는 UDP.

SystemX_UDP #1 U0 (F, A, B, C);

반응형
반응형

Verilog 연산자

Verilog 표준에는 다양한 사전 정의된 연산자가 있습니다. 연산자는 특정 데이터 유형에 대해 작동하도록 정의되어 있으며 모든 연산자를 합성할 수 있는 것은 아닙니다.

 

할당 연산자

Verilog는 등호(=)를 사용하여 할당을 나타냅니다. 할당의 왼쪽(LHS)은 대상 신호입니다. 우변(RHS)은 입력 인수를 포함하며 신호, 상수 및 연산자를 모두 포함할 수 있습니다.

 

F1에는 신호 A가 할당됩니다.

F1 = A;

 

F2 8비트 벡터이며 10101010 값이 할당됩니다.

F2 = 8’hAA;

 

연속 할당

Verilog는 키워드 assign을 사용하여 지속적인 신호 할당을 나타냅니다. 이 키워드 뒤에 = 기호를 사용하여 할당됩니다. 할당의 왼쪽(LHS)은 대상 신호이며 네트 유형이어야 합니다. 오른쪽(RHS)은 입력 인수를 포함하고 nets, regs, 상수 및 연산자를 포함할 수 있습니다. 연속 할당은 조합 논리를 모델링합니다. 표현식의 RHS가 변경되면 LHS 대상 네트가 업데이트됩니다. 할당되는 네트는 첫 번째 연속 할당 전에 선언되어야 합니다. 동일한 네트에 여러 개의 연속 할당을 수행할 수 있습니다. 이 경우 드라이브 강도가 가장 높은 신호가 포함된 할당이 우선합니다.

 

F1 A가 변경될 때마다 업데이트됩니다. 여기서 A는 신호입니다.

assign F1 = A;

 

F2에 값 0이 할당됩니다.

assign F2 = 1’b0;

 

F3 8비트 벡터이며 10101010 값이 할당됩니다.

assign F3 = 4’hAA;

 

각 개별 할당은 동시에 실행되고 별도의 논리 회로로 합성됩니다. 다음 예를 고려하십시오.

assign X= A;
assign Y = B;
assign Z = C;

 

시뮬레이션할 때 Verilog의 이 3개 라인은 정확히 동시에 3개의 개별 신호를 할당합니다. 이것은 먼저 A X에 할당한 다음 B Y에 할당하고 마지막으로 C Z에 할당하는 프로그래밍 언어와 다릅니다. Verilog에서 이 기능은 3개의 개별 와이어와 동일합니다. 이 설명은 3개의 개별 와이어로 직접 합성됩니다.

 

다음은 Verilog의 연속 신호 할당이 순차적으로 실행되는 프로그래밍 언어와 어떻게 다른지에 대한 또 다른 예입니다.

assign A = B;
assign B = C;

 

Verilog 시뮬레이션에서 C에서 B, B에서 A로의 신호 할당은 동시에 발생합니다.

이는 합성 중에 이 기능이 직렬로 연결된 두 개의 와이어를 설명하기 때문에 신호 B가 설계에서 제거된다는 것을 의미합니다. 자동화된 합성 도구는 이 불필요한 신호 이름을 제거합니다.

이것은 이 예제가 순차적으로 실행되는 컴퓨터 프로그램으로 구현된 경우와 동일한 기능이 아닙니다. 컴퓨터 프로그램은 먼저 B A에 할당한 다음 C의 값을 B에 할당합니다. 이러한 방식으로 B C로 업데이트되기 전에 A로 전달되는 스토리지 요소를 나타냅니다.

 

논리 연산자를 사용한 연속 할당

합성 가능한 논리를 모델링할 때 Verilog는 프로그래밍 언어가 아니라 하드웨어 설명 언어라는 것을 기억하는 것이 중요합니다. 프로그래밍 언어에서 코드 라인은 소스 파일에 나타나는 대로 순차적으로 실행됩니다. Verilog에서 코드 라인은 실제 하드웨어의 동작을 나타냅니다. 따라서 별도로 명시되지 않는 한 할당은 동시에 실행됩니다.

 

지연이 있는 연속 할당

Verilog는 연속 할당을 사용할 때 게이트 지연을 모델링하는 기능을 제공합니다. #은 지연된 할당을 나타내는 데 사용됩니다. 조합 논리 회로의 경우 지연은 모든 전환, 상승 및 하강 전환에 대해 개별적으로, 상승, 하강 및 값 off로의 전환에 대해 별도로 지정할 수 있습니다. 꺼짐으로의 전환은 Z로의 전환을 의미합니다. 하나의 지연 매개변수만 지정된 경우 모든 지연을 모델링하는 데 사용됩니다. 두 개의 지연 매개변수가 지정된 경우 첫 번째 매개변수는 상승 시간 지연에 사용되고 두 번째 매개변수는 하강 시간 지연을 모델링하는 데 사용됩니다. 세 개의 매개변수가 지정되면 세 번째 매개변수를 사용하여 전환을 off로 모델링합니다. 괄호는 선택 사항이지만 여러 지연 매개변수를 사용할 때 권장됩니다.

모든 전환에서 1의 지연.

 

상승 전환의 경우 2, 하강의 경우 3의 지연.

assign #1 F = A;

 

상승의 경우 2, 하강의 경우 3, f의 지연 4

assign #(2, 3) F = A;

 

상승의 경우 2, 하강의 경우 3, 지연의 경우 4 오프 전환.

assign #(2, 3, 4) F = A;

 

 

반응형
반응형

Verilog 모듈 구조

Verilog 디자인은 단일 파일에 단일 시스템을 설명합니다. 파일에는 *.v 접미사가 있습니다. 파일 내에서 시스템 설명은 모듈 내에 포함됩니다. 모듈에는 시스템에 대한 인터페이스(, 입력 및 출력)와 동작 설명이 포함됩니다.

 

다음 그림은 Verilog 파일의 묘사를 보여줍니다.

 

모듈

Verilog의 모든 시스템은 모듈 내부에 캡슐화되어 있습니다. 모듈은 계층적 디자인을 지원하기 위해 하위 수준 모듈의 인스턴스화를 포함할 수 있습니다. 키워드 module endmodule은 시스템 설명의 시작과 끝을 나타냅니다. 대규모 디자인에서 작업할 때 각 모듈을 동일한 이름의 자체 파일에 배치하는 것이 일반적입니다.

 

module module_name (port_list);

// port_definitions

// module_items

endmodule

 

module module_name (port_list and port_definitions);

endmodule

 

포트 정의

모듈 내의 첫 번째 항목은 입력 및 출력 또는 포트에 대한 정의입니다. 각 포트에는 사용자 정의 이름, 방향 및 유형이 있어야 합니다. 사용자 정의 포트 이름은 대소문자를 구분하며 알파벳 문자로 시작해야 합니다.

 

포트 방향은 입력, 출력 및 입력의 세 가지 유형 중 하나로 선언됩니다. 포트는 이전에 설명한 모든 데이터 유형을 사용할 수 있지만 와이어, 레지스터 및 정수만 합성할 수 있습니다.

유형과 방향이 같은 포트 이름은 쉼표로 구분하여 같은 줄에 나열할 수 있습니다.

 

Verilog에서 지원되는 두 가지 다른 포트 정의 스타일이 있습니다. Verilog-2001 릴리스 이전에는 포트 이름이 모듈 이름 뒤의 괄호 안에 나열되었습니다. 그런 다음 모듈 내에서 포트의 방향과 유형이 나열되었습니다.

 

Verilog-2001 릴리스부터 포트 방향 및 유형은 모듈 이름 뒤의 괄호 안에 포트 이름과 함께 포함될 수 있습니다. 이 접근 방식은 시스템에 입력/출력을 전달하는 ANSCI-C 접근 방식을 더 많이 모방했습니다.

 

다음 그림은 모듈과 해당 포트를 정의하기 위한 여러 접근 방식을 보여줍니다.

 

시그널 선언

시스템 내에서 내부 연결에 사용되는 신호는 처음 사용하기 전에 모듈 내에서 선언됩니다. 각 신호는 해당 유형과 사용자 정의 이름을 나열하여 선언해야 합니다. 같은 유형의 신호 이름은 쉼표로 구분된 같은 줄에 선언할 수 있습니다. 위에서 설명한 모든 법적 데이터 유형은 신호에 사용할 수 있습니다. 그러나 net, reg integer 유형만 직접 합성됩니다.

 

신호 선언 구문은 다음과 같습니다.

 

<type> name;

 

wire 유형의 "node1"이라는 신호를 선언합니다.

wire node1;

 

reg 유형의 "Q2", "Q1" "Q0"이라는 세 가지 신호를 선언합니다.

reg Q2, Q1, Q0;

 

모든 비트 유형이 wire "bus1"이라는 64비트 벡터를 선언합니다.

wire [63:0] bus1;

 

"i" "j"라는 두 개의 정수 선언

integer i, j;

 

Verilog는 계층적 설계 접근 방식을 지원하므로 하위 시스템 내에서 신호 이름이 충돌 없이 상위 수준의 것과 동일할 수 있습니다.

 

매개변수(parameter) 선언

매개변수 또는 상수는 아키텍처에서 여러 번 사용될 수량을 나타내는 데 유용합니다. 매개변수 선언 구문은 다음과 같습니다.

 

parameter <type> constant_name = <value>;

 

유형은 선택 사항이며 정수, 시간, 실수 또는 실시간만 될 수 있습니다. 유형이 제공되면 매개변수는 같은 시간의 변수와 동일한 속성을 갖습니다. 유형이 제외되면 매개변수는 할당된 값의 유형을 사용합니다.

 

parameter BUS_WIDTH = 64;

parameter NICKEL = 8’b0000_0101;

 

일단 선언되면 모듈 전체에서 상수 이름을 사용할 수 있습니다.

 

다음 예제는 상수를 사용하여 벡터의 크기를 정의하는 방법을 보여줍니다. 상수를 벡터의 실제 너비(, 32비트)로 정의했기 때문에 인덱스(, [31:0])를 정의할 때 값에서 1을 빼야 합니다.

wire [BUS_WIDTH-1:0] BUS_A;

 

컴파일러 지시문

컴파일러 지시문은 Verilog 모델을 해석하는 방법에 대한 추가 정보를 시뮬레이션 도구에 제공합니다. 컴파일러 지시문은 모듈 정의 앞에 배치되고 백틱( ` )이 앞에 옵니다.

 

가장 일반적으로 사용되는 컴파일러 지시문은 다음과 같습니다.

 

Syntax Description
`timescale <unit>, <precision> Defines the timescale of the delay unit and its smallest precision.
`include <filename> Includes additional files in the compilation.
`define <macroname> <value> Declares a global constant.

 

시간 단위가 1ps의 정밀도로 1ns임을 선언합니다. 정밀도는 시간이 걸릴 수 있는 가장 작은 양입니다.

 

예를 들어, 다음 지시문을 사용하면 숫자 0.001 0.001ns 또는 1ps로 해석됩니다.

그러나 숫자 0.0001은 최소 정밀도 값보다 작기 때문에 0으로 해석됩니다.

‘timescale 1ns/1ps

반응형
반응형

원래 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 ORd together.
wand Wired-ANDd. If multiple drivers, their values are ANDd 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, 2s 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;

반응형

+ Recent posts