반응형

Verilog 관계 연산자

Verilog는 두 이진수를 비교하는 관계 연산자를 지원하고 두 피연산자를 비교한 후 참('1') 또는 거짓('0') 값을 반환합니다.

 

다음 표는 관계 연산자를 설명합니다.

Operator Name Functionality
> Greater than To compare two numbers
>= Greater than or equal to To compare two numbers
< Less than To compare two numbers
<= Less than or equal to To compare two numbers

 

module Relational_operators (

input [7:0] a_in,
input [7:0] b_in,
output reg y1_out, y2_out, y3_out, y4_out);

always@ (a_in, b_in )
begin
  // less than < operator
  y1_out = a_in < b_in;
  // less than equal to <= operator
  y2_out = a_in <= b_in;
  // greater than > operator
  y3_out = a_in > b_in;
  // greater than equal to >= operator
  if (a_in >= b_in)
    y4_out = 1;
  else
    y4_out =0;
end
endmodule

 

 

Verilog 연결 및 복제 연산자

Verilog는 모든 바이너리 문자열에 대한 집중 및 복제를 지원합니다.

 

다음 표는 집중 및 복제 연산자의 기능을 설명합니다.

Operator Name Functionality
{ } Concatenation To concatenate two binary strings
{m, { }} Replication To replicate the string m times

 

module concatenation_operator (

input [2:0] a_in,
input [2:0] b_in,
output reg [15:0] y_out );
parameter c_in = 3'b010;

always@ (a_in, b_in )
begin
  // use of concatenation{ } and replication n{} operator
  y_out = { a_in, b_in , {3{c_in}}, 3'b111};
end
endmodule

 

 

 

Verilog 감소 연산자

Verilog는 축소 연산자를 지원하고 비트 축소 후 단일 비트 값을 반환합니다.

 

다음 표는 감소 연산자를 설명합니다.

Operator Name Functionality
& Reduction AND For performing the bitwise reduction
~& Reduction NAND For performing the bitwise reduction
| Reduction OR For performing the bitwise reduction
~| Reduction NOR For performing the bitwise reduction
^ Reduction XOR For performing the bitwise reduction
~^ or ^~ Reduction XNOR For performing the bitwise reduction

 

module reducon_operators (

input [3:0] a_in,
output reg [5:0] y_out);

always@ (a_in)
begin
  // reducon AND
  y_out[0] = & a_in;
  // reducon NAND
  y_out[1] = ~& a_in;
  // reducon OR
  y_out[2] = | a_in;
  // Reducon NOR
  y_out[3] = ~| a_in;
  // Reducon XOR
  y_out[4] = ^ a_in;
  // Reducon XNOR
  y_out[5] = ~^ a_in;
end
endmodule

 

 

Verilog 시프트 연산자

Verilog는 시프트 연산자를 사용하며 두 개의 피연산자가 필요합니다. 이 연산자는 이동 작업을 수행하는 데 사용됩니다.

 

다음 표는 시프트 연산자의 기능을 설명합니다.

Operator Name Functionality
<< Shift left To perform logical shift left
>> Shift right To perform logical shift right

 

module shift_operators (input [3:0] a_in, output reg [3:0] y1_out, y2_out);

parameter b_in = 2;

always@ (a_in)
begin
  // use of left shift operator
  y1_out = a_in << b_in;
  // use of right shift
operator
  y2_out = a_in >> b_in;
end
endmodule

 

 

반응형
반응형

Verilog 논리 연산자

Verilog는 원하는 논리 연산을 수행하기 위해 논리 AND, OR 및 부정 연산자를 지원합니다. 논리 연산자는 연산이 끝날 때 단일 비트 값을 반환하는 데 사용됩니다.

 

다음 표는 논리 연산자의 기능적 사용을 설명합니다.

Operator Name Functionality
&& Logical AND To perform logical AND on two binary operands
|| Logical OR To perform logical OR on two binary operands
! Logical negation To perform logical negation for the given binary number

 

module logical_operators( input [2:0] a_in, b_in,c_in,d_in,e_in, f_in, output reg y_out );
always@ (a_in, b_in, c_in,d_in,e_in,f_in)
begin
  if
( (a_in < b_in) && ((c_in ==d_in) || (e_in > f_in)))
    y_out = 1;
  else
    y_out =0;
  end
endmodule

 

 

Verilog 등식 및 부등식 연산자

Verilog 동등 연산자는 두 피연산자를 비교한 후 참 또는 거짓 값을 반환하는 데 사용됩니다.

 

다음 표는 연산자의 기능을 설명합니다.

Operator Name Functionality
== Case equality To compare the two operands
!= Case inequality Used to find out inequality for the two operands
! Logical negation To perform logical negation for the given binary number

 

module Equality_operator(

input [7:0] a_in, b_in,
output reg y1_out, y2_out,
output reg [7:0] y3_out );

always@ (a_in, b_in )
begin
  // use of equality operator
  y1_out = (a_in == b_in);


  // use of inequality operator
  y2_out = (a_in != b_in);
 

// use of operator in if condition
 if ( a_in ==b_in)
   y3_out =a_in;
 else
   y3_out = b_in;
 end
endmodule

 

 

Verilog 서명 연산자

Verilog는 연산자 양수 '+' 또는 '-'를 지원하여 피연산자에 부호를 할당합니다.

 

다음 표는 부호 피연산자를 설명합니다.

Operator Name Functionality
+ Unary sign plus To assign positive sign to singular operand
- Unary sign minus To assign negative sign to singular operand

 

module sign_operators (

input [1:0] a_in, b_in,
output reg [3:0] y1_out, y2_out
);


always@ (a_in, b_in )
begin
  // use of sign operator
  y1_out = (-a_in) + b_in;

// use of sign operator
y2_out = a_in * (-b_in);

end
endmodule

 

 

Verilog 비트 연산자

Verilog는 비트 연산을 지원합니다. 논리 비트 연산자는 두 개의 단일 또는 다중 비트 피연산자를 사용하고 다중 비트 값을 반환합니다. Verilog NAND, NOR를 지원하지 않습니다.

 

다음 표는 비트 연산자의 기능과 사용을 설명합니다.

Operator Name Functionality
& Bitwise AND To perform bitwise AND on two binary operands
| Bitwise OR To perform bitwise OR on two binary operands
^ Bitwise XOR To perform bitwise XOR on two binary operands

 

module bit_wise_operators (

input [6:0] a_in,
input [5:0] b_in,
output reg [6:0] y_out );

always@ (a_in, b_in )
begin
  // bit wise AND
  y_out[0] = a_in[0] & b_in[0];
  // bit wise NAND
  y_out[1] = !( a_in[1] & b_in[1]);
  // bit wise OR
  y_out[2] = a_in[2] | b_in[2];
  // bit wise NOR
  y_out[3] = !( a_in[3] | b_in[3]);
  // bit wise XOR
  y_out[4] = a_in[4] ^ b_in[4];
  // bit wise XNOR
  y_out[5] = ( a_in[5] ~^ b_in[5]);
  // bit wise NOT
  y_out[6] = ! a_in[6];
end
endmodule

 

 

반응형

'프로그래밍 언어 > Verilog' 카테고리의 다른 글

[Verilog 학습] 논리 게이트  (0) 2022.04.07
[Verilog 학습] Verilog 연산자 3  (0) 2022.04.06
[Verilog 학습] Verilog 연산자 1  (0) 2022.04.04
[Verilog 학습] Test Benches  (0) 2022.04.03
[Verilog 학습] System Tasks  (0) 2022.04.02
반응형

동시성과 Verilog 연산자의 개념

Verilog의 사용 및 적용에 대한 더 나은 이해를 위해서는 해당 언어에서 지원하는 다양한 연산자에 초점을 맞출 필요가 있습니다. Verilog는 다양한 연산자를 지원하며 설계 중에 유용합니다.

 

정확히 우리에게 필요한 것은 의도한 논리를 추론하기 위한 산술, 논리, 비트, 시프트, 등호 연산자입니다.

 

모델 설계에 대한 연속 할당 사용

연속 할당은 조합 논리를 모델링하는 데 사용됩니다. 조합 설계에서 출력은 현재 입력의 함수입니다.

assign 키워드는 오른쪽에 논리식이 있는 조합 설계를 모델링하는 데 사용됩니다. 연속 할당은 블럭킹 또는 논블록킹이 아니며 입력 또는 중간 네트워크 중 하나에 이벤트가 있을 때 실행됩니다. 이러한 할당은 활성 이벤트 대기열에서 업데이트됩니다.

 

RTL에서 여러 개의 연속 할당이 있는 경우 모든 할당이 동시에 실행되고 주로 할당 구성을 사용하여 글루 로직을 모델링합니다.

 

다음 예제는 연속 할등을 사용한 반가산기입니다.

module half_adder( input a_in, b_in, output sum_out, carry_out);
//concurrent execusi
on of multiple assign constructs
assign sum_out = a_in ^ b_in;
assign carry_out = a_in & b_in;
endmodule

 

다음 그림은 RTL 스케메틱입니다.

 

조합 설계를 구현하기 위해 항상 절차적 블록 사용

Verilog의 진정한 아름다움은 항상 강력한 합성 가능한 구조입니다.

절차 블록은 항상 @로 지정된 경우 조합 논리를 모델링하는 데 사용됩니다.

예를 들어 항상 @(a-in, b_in)을 고려하면 절차적 always 블록은 입력 a_in, b_in 중 하나에 이벤트가 있을 때 호출합니다. 이벤트는 0에서 1 또는 1에서 0으로의 전환을 나타냅니다.

 

이제 입력이 a_in, b_in이고 출력이 diff_out, borrow_out인 반감산기의 설계를 살펴보겠습니다.

a_in b_in diff_out borrow_out
0 0 0 0
0 1 1 1
1 0 1 0
1 1 0 0

 

따라서 RTL 디자인에는 diff_out = a_in XOR b_in, borrow_out = NOT(a_in) AND b_in 기능이 있어야 합니다.

RTL은 다중 Always procedural 블록을 사용하여 코딩됩니다. 첫 번째 항상 절차 블록은 차등 출력의 기능을 코딩하는 데 사용되며 다른 절차 블록은 차용 출력의 기능에 사용됩니다.

 

module combo_design(input a_in, b_in, output reg diff_out, borrow_out);
// Functionality of half subtractor di
ff_out is XOR of a_in , b_in
always @ ( a_in, b_in)
  if ( a_in==b_in)
    di
ff_out = 0;
  else
    diff_out =1;


// Functional description of the logic for borrow_out that is ~a_in & b_in
always @(a_in , b_in)
  if ( a_in ==0 && b_in==1)
    borrow_out = 1;
  else
    borrow_out = 0;
endmodule

 

다음 그림은 RTL 스케메틱입니다

 

 

 

동시성의 개념

Verilog의 강력한 기능은 동시 실행이며, 여러 개의 Always procedural 블록과 연속 할당이 동시에 실행됩니다.

다음 예제는 always 절차 블록 및 할당은 동시에 실행되고 병렬 조합 논리를 유추합니다.

 

module combo_design(input a_in, b_in, output reg diff_out, output borrow_out);
// Functionality of half subtractor di
ff_out is XOR of a_in , b_in
always @ ( a_in, b_in)
  di
ff_out = a_in ^ b_in;

 

// Functional description of the logic for borrow_out that is ~a_in & b_in
assign borrow_out = (~a_in) & b_in;
endmodule

 

 

Verilog 산술 연산자

Verilog는 산술 연산을 수행하기 위해 더하기, 빼기, 곱하기, 나누기 및 모듈러스 연산자를 지원합니다.

 

다음 표는 산술 연산자를 설명합니다.

Operator Name Functionality
+ Binary addition To perform addition of two binary operands
- Binary minus To perform subtraction of two binary operands
* Multiplication To perform multiplication of two binary operands
/ Division To perform division of two binary operands
% Modulus To find modulus from division of two operands

 

module arithmetic_operators (
input [3:0] a_in, b_in,
output reg [4:0] y1_out,
output reg [7:0] y3_out,
output reg [3:0] y2_out, y4_out, y5_out
);


always@ (a_in, b_in)
begin
  y1_out = a_in + b_in;
  y2_out = a_in -b_in;
  y3_out = a_in * b_in;
  y4_out = a_in / b_in;
  y5_out = a_in % b_in;
end
endmodule

 

반응형
반응형

현대 디지털 설계 흐름의 필수 구성 요소 중 하나는 시뮬레이션을 통해 기능을 검증하는 것입니다. 이 기능 검증은 테스트 벤치를 사용하여 수행됩니다. 테스트 벤치는 테스트할 시스템을 하위 시스템으로 인스턴스화하고 하위 시스템으로 구동할 입력 패턴을 생성하고 출력을 관찰하는 Verilog 모델입니다. 테스트 벤치는 시뮬레이션에만 사용되므로 합성할 수 없는 추상 모델링 기술을 사용하여 자극 패턴을 생성할 수 있습니다. Verilog 조건부 프로그래밍 구성 및 시스템 작업을 사용하여 테스트 상태를 보고하고 출력이 올바른지 자동으로 확인할 수도 있습니다.

 

테스트 벤치 개요

테스트 벤치는 입력이나 출력이 없는 Verilog의 파일입니다. 테스트 벤치는 테스트할 시스템을 하위 수준 모듈로 인스턴스화합니다. 테스트 중인 시스템을 device under test(DUT) 또는 unit under test(UUT)라고 합니다.

 

수동 자극 생성

조합 논리 회로에 대한 자극을 생성할 때 절차 블록을 사용하여 DUT, 특히 타이밍 오류를 유발할 수 있는 모든 전환을 구동하기 위해 가능한 모든 입력 패턴을 생성하는 것이 일반적입니다.

 

다음 예제는 SystemX라는 DUT의 작동을 확인하기 위해 간단한 테스트 벤치를 만드는 방법을 보여줍니다. 테스트 벤치에는 입력 또는 출력이 없습니다. 따라서 모듈에 선언된 포트가 없습니다. 그런 다음 SystemX는 테스트 벤치에서 인스턴스화(DUT)됩니다. reg 유형의 내부 신호는 DUT 입력(A_TB, B_TB, C_TB)에 연결하도록 선언되고 와이어 유형의 내부 신호는 DUT 출력(F_TB)에 연결하도록 선언됩니다. 그런 다음 절차 블록을 사용하여 SystemX의 입력을 생성합니다. 절차 블록 내에서 지연 할당은 입력 패턴의 타이밍을 제어하는 ​​데 사용됩니다. 이 예에서 가능한 각 입력 코드는 초기 블록 내에서 생성됩니다. 출력(F_TB)은 시뮬레이션 도구를 사용하여 파형 또는 테이블 목록 형태로 관찰됩니다.

 

 

Verilog 테스트 벤치 내에서 여러 절차 블록을 사용하여 병렬 자극 생성을 제공할 수 있습니다. initial 블록과 always 블록을 모두 사용하면 테스트 벤치가 반복 신호와 비주기 신호를 모두 구동할 수 있습니다. initial always 블록은 시작 값과 반복 패턴을 제공하기 위해 동일한 신호를 구동하는 데 사용할 수도 있습니다.

 

다음 예제는 DUT에 대한 자극 패턴을 생성하기 위해 여러 절차 블록이 사용되는 비동기 활성 LOW 리셋이 있는 상승 에지 트리거 D 플립플롭에 대한 테스트 벤치를 보여줍니다.

 

 

시뮬레이터 성적표에 결과 인쇄

과거 테스트 벤치 예제에서 입력 및 출력 값은 시뮬레이터 도구 내의 파형 또는 목록 도구를 사용하여 관찰되었습니다. 각 명령문이 처리될 때 시뮬레이션을 추적하기 위해 시뮬레이션 값을 스크립트 창에 인쇄하는 것도 유용합니다. 텍스트 출력 시스템 작업을 사용하여 DUT의 입력 및 출력 외에 시뮬레이션 상태를 보여주는 메시지를 인쇄할 수 있습니다.

 

다음 예제는 입력과 출력을 시뮬레이션 도구의 사본에 인쇄하는 테스트 벤치를 보여줍니다. 테스트 벤치는 DUT에 지연이 포함되지 않은 경우에도 출력을 평가하기 전에 어느 정도 지연을 기다려야 합니다.

 

루프를 사용하여 자극 생성

계산과 같은 규칙적인 패턴을 따르는 자극을 생성할 때 루프는 입력 벡터를 생성하는 효과적인 방법이 될 수 있습니다. for 루프는 조합 논리 회로에 대한 철저한 자극 패턴을 생성하는 데 특히 유용합니다. 정수 루프 변수는 for 루프 내에서 증가할 수 있으며 DUT 입력에 reg 유형으로 할당됩니다. Verilog에서 정수가 reg 유형의 변수에 할당되면 reg의 크기와 일치하도록 잘립니다. 이를 통해 for 루프 내에서 증가하는 정수 루프 변수를 사용하여 입력 자극 패턴에 대해 바이너리 카운트를 생성할 수 있습니다.

 

다음 예제는 조합 논리 회로에 대한 자극이 for 루프를 사용하여 생성될 수 있는 방법을 보여줍니다.

 

 

자동 결과 확인

테스트 벤치는 이 책의 앞부분에서 설명한 조건부 프로그래밍 구성을 사용하여 결과를 자동으로 검사할 수도 있습니다.

 

다음 예제는 if-else 문을 사용하여 DUT의 출력을 확인하고 성적표에 PASS/FAIL 메시지를 인쇄하는 테스트 벤치의 예를 보여줍니다.

 

 

테스트 벤치에서 외부 파일 사용

테스트 벤치의 결과를 외부 파일에 기록해야 하는 경우가 종종 있는데, 그 이유는 육안 검사를 하기에 너무 장황하거나 시스템 검증에 대한 저장된 기록이 필요하기 때문입니다. Verilog는 파일 I/O 시스템 작업(: $fdisplay(), $fwrite(), $fstrong() $fmonitor())을 통해 외부 파일에 쓸 수 있습니다.

 

다음 예제는 입력 벡터와 DUT의 출력이 $fdisplay() 시스템 작업을 사용하여 외부 파일에 기록되는 테스트 벤치를 보여줍니다.

 

 

입력 벡터가 너무 커서 수동으로 입력하거나 별도의 프로그램에서 생성한 경우가 많습니다. 두 경우 모두 테스트 벤치에서 유용한 기술은 외부 파일에서 입력 벡터를 읽는 것입니다.

 

다음 예제는 DUT에 대한 입력 자극 벡터가 $readmemb() 시스템 작업을 사용하여 외부 파일에서 읽는 예를 보여줍니다.

 

 

 

반응형

+ Recent posts