반응형

순차 기능 모델링

동시 시스템의 동작은 현재 값에만 의존하는 출력을 가지기 때문에 조합 논리에 적합했습니다. 이는 신호 할당을 지속적으로 수행하는 모델이 이 회로 동작의 정확한 모델을 제공한다는 것을 의미합니다.

 

순차 회로(: D-플립플롭, 레지스터, 유한 상태 기계 및 카운터)를 살펴보기 시작하면 이러한 장치는 이벤트, 가장 자주는 클록 신호의 에지를 기반으로 출력만 업데이트합니다.

 

절차적 할당

Verilog는 이벤트를 기반으로 하는 신호 할당을 모델링하기 위해 절차적 할당을 사용합니다. 이벤트는 가장 일반적으로 신호의 전환입니다. 이는 클록 에지에서 할당을 트리거하여 D 플립플롭 및 유한 상태 머신과 같은 순차 논리 회로를 모델링하는 기능을 제공합니다. 절차적 할당은 가변 데이터 유형(: reg, 정수, 실수 및 시간)만 구동할 수 있습니다. 따라서 저장 장치를 모델링하는 데 이상적입니다. 절차적 신호 할당은 나열된 순서대로 평가할 수 있습니다. 따라서 순차적 할당을 모델링할 수 있습니다.

 

절차 할당은 모델에 대한 입력이 변경될 때 신호 할당을 수행하여 조합 논리 회로를 모델링하는 데 사용할 수도 있습니다. 할당의 왼쪽이 절차 할당에서 와이어 유형이 될 수 없음에도 불구하고 최신 합성기는 적절하게 설계된 조합 논리 모델을 인식하고 올바른 회로 구현을 생성합니다. 절차 할당은 또한 if-else 결정, 케이스 문 및 루프와 같은 표준 프로그래밍 구성을 지원합니다. 이것은 Verilog에서 절차적 할당을 강력한 모델링 접근 방식으로 만들고 디지털 시스템을 설계하고 테스트 벤치를 생성하기 위한 가장 일반적인 기술입니다.

 

절차 블록

모든 절차적 신호 할당은 절차적 블록 내에 포함되어야 합니다. Verilog에는 initial always의 두 가지 유형의 절차 블록이 있습니다.

 

1.    initial 블록

initial 블록은 시뮬레이션 시작 시 블록 안에 포함된 모든 명령문을 한 번 실행합니다. initial 블록은 합성 가능한 동작을 모델링하는 데 사용되지 않습니다. 대신 테스트 벤치 내에서 반복적인 신호의 초기 값을 설정하거나 단일 전환 세트만 있는 신호의 동작을 모델링하는 데 사용됩니다.

 

다음은 initial 블록의 구문입니다.

 

initial

begin

signal_assignment_1
signal_assignment_2
        :

end

 

테스트 벤치에서 리셋 라인을 모델링하기 위해 initial 블록이 어떻게 사용되는지에 대한 간단한 모델을 살펴보겠습니다.

 

다음 예에서 신호 "Reset_TB" DUT로 구동됩니다. 시뮬레이션 시작 시 Reset_TB의 초기 값은 논리 0으로 설정됩니다. 두 번째 할당은 15ns 단위 지연 후에 이루어집니다. 두 번째 할당 문은 Reset_TB를 논리 1로 설정합니다. 이 예의 할당은 지연 연산자로 인해 나열된 순서대로 순서대로 평가됩니다. initial 블록은 한 번만 실행되기 때문에 Reset_TB는 나머지 시뮬레이션 동안 마지막 할당 값을 유지합니다.

 

initial
begin
  Reset_TB =
1’b0;
  #15 Reset_TB =
1’b1;
end

 

2.    always 블록

always 블록은 영원히 또는 시뮬레이션 기간 동안 실행됩니다. always 블록을 사용하여 테스트 벤치에서 합성할 수 없는 동작 외에 합성 가능한 회로를 모델링할 수 있습니다.

 

다음은 always 블록의 구문입니다.

always
begin
  signal_assignment_1
  signal_assignment_2
            :
end

 

always 블록을 사용하여 테스트 벤치에서 클록 라인을 모델링하는 방법에 대한 간단한 모델을 살펴보겠습니다.

 

다음 예에서 신호 Clock_TB의 값은 10ns 단위마다 논리 값을 지속적으로 변경합니다.

 

always
begin
  #10 Clock_TB =
~Clock_TB;
end

 

자체적으로는 위의 always 블록이 작동하지 않을 것입니다. 시뮬레이션이 시작될 때 Clock_TB에 초기 값이 없으므로 시뮬레이터는 Clock_TB의 값이 시간 0에 있는지 알지 못하기 때문입니다. 또한 시간 단위 10에서 부정 연산(~)의 출력이 무엇인지 알 수 없습니다.

 

다음 예는 initial 블록과 always 블록을 조합하여 클록 신호를 모델링하는 올바른 방법을 보여줍니다. Verilog는 여러 절차 블록에서 동일한 변수에 대한 할당을 허용하므로 다음 예가 유효합니다. 시뮬레이션이 시작되면 Clock_TB에 논리 0이 할당됩니다. 이것은 시간 0에서 신호에 대해 알려진 값을 제공하고 initial 블록 부정이 결정적 값을 가질 수 있도록 합니다.

아래 예는 10ns 단위마다 토글하는 클록 신호를 생성합니다.

 

initial
begin
  Clock_TB
= 1’b0;
end


always
begin
  #10 Clock_TB =
~Clock_TB;
end

 

3.    감지신호 목록

감지신호 목록은 블록 내의 할당이 실행될 때 트리거하기 위해 절차 블록과 함께 사용됩니다. @ 기호는 감지신호 목록을 나타내는 데 사용됩니다. 그런 다음 절차 블록을 트리거할 @ 기호 뒤의 괄호 안에 신호를 나열할 수 있습니다. 다음은 감지심호 목록의 기본 구문입니다.

 

always @ (signal1, signal2)
begin
  signal_assignment_1
  signal_assignment_2
          :
end

 

이 구문에서 괄호 안에 나열된 신호에 대한 전환은 always 블록이 트리거되고 모든 할당이 한 번 발생하도록 합니다. always 블록이 종료되면 다시 트리거할 감지 목록의 다음 신호 전환을 기다립니다.

 

다음 예는 간단한 3입력 AND 게이트를 모델링하는 방법을 보여줍니다. 이 예에서 입력 A, B 또는 C에 대한 전환은 블록이 트리거되고 F에 대한 할당이 발생하도록 합니다.

 

always @ (A, B, C)
begin
  F =
A & B & C;
end

 

Verilog는 또한 상승 에지 또는 하강 에지 전환으로만 블록 트리거를 제한하는 키워드를 지원합니다. 키워드는 posedgenegedge입니다.

 

다음은 에지 감지 블록의 기본 구문입니다. 이 구문에서 신호1의 상승 에지 전환 또는 신호2의 하강 에지 전환만 블록을 트리거합니다.

 

always @ (posedge signal1, negedge signal2)
begin
  signal_assignment_1
  signal_assignment_2
           :
end

 

감지신호 목록에는 동작을 보다 명시적으로 설명하기 위해 부울 연산자가 포함될 수도 있습니다. 다음 구문은 위의 구문과 동일합니다.

 

always @ (posedge signal1 or negedge signal2)
begin
  signal_assignment_1
  signal_assignment_2
          :
end

 

에지 감도를 모델링하는 기능을 통해 순차 회로를 모델링할 수 있습니다.

 

다음 예는 간단한 D-플립플롭을 모델링하는 방법을 보여줍니다.

 

always @ (posedge Clock)
begin
  Q =
D;
end

 

Verilog-2001에서는 블록 내 할당의 오른쪽에 나열된 신호를 기반으로 트리거되는 감지신호 목록을 지원하는 구문이 추가되었습니다. 이 구문은 @*입니다.

 

다음 예는 이 모델링 접근 방식을 사용하여 3입력 AND 게이트를 모델링하는 방법을 보여줍니다.

 

always @*
begin
  F
= A & B & C;
end

반응형
반응형

구조 설계 및 계층 구조

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

반응형

+ Recent posts