Verilog: value, operators

나는컴공생·2025년 2월 25일

Verilog vs VHDL

Letch (Edge Triggered):

  • Letch엣지 트리거 방식을 사용합니다. 즉, 신호가 변화하는 순간에 동작합니다.
  • 입력 신호의 변화(엣지)에 의해 동작을 시작하는 메모리 요소를 나타냅니다.
  • 일반적으로 순차 회로에서 사용됩니다.

FF (Flip-Flop) (Level Triggered):

  • FF레벨 트리거 방식을 사용합니다. 즉, 특정 레벨이 유지되는 동안 동작합니다.
  • 일반적으로 레벨 감지 방식으로, 지속적인 신호 상태에 따라 동작합니다.

Logic Value (4-Value Logic System)

Verilog는 4-Value Logic System을 지원하며, 이는 디지털 회로의 신호 값을 표현하는 다양한 상태를 포함합니다.

각 Logic 값의 의미

  • 0: false, ground, low, VSS, negative assertion (부정적인 신호 또는 낮은 전압)
  • 1: true, high, Power, VDD, VCC, positive assertion (긍정적인 신호 또는 높은 전압)
  • x: bus 충돌(unknown state) 또는 미초기화된 상태. 이 값은 여러 신호가 동시에 충돌할 때 나타날 수 있습니다.
  • z: High Impedance (Hi-Z) 상태를 나타냅니다. 이는 세트되지 않거나 연결되지 않은 상태로, 일반적으로 Tri-state 버퍼에서 사용됩니다.

1. Data Types

Nets

  • Nets는 회로의 물리적 연결을 나타냅니다. 예를 들어, wire는 물리적인 연결을 의미하며, 신호가 흐를 수 있는 경로를 정의합니다.
  • wire, tri, supply1, supply0, wand, wor, triand 등 여러 가지 타입이 있으며, 주로 연결된 신호를 표현할 때 사용됩니다.

Register

  • Register추상적인 저장 요소입니다. reg, integer, real, time 등 다양한 데이터 타입이 포함될 수 있습니다.

  • 순차 회로에서 값을 저장하는 데 사용됩니다. 예를 들어 플립플롭(FF)레지스터는 상태를 유지해야 할 때 사용됩니다.

    중요: FF나 letch는 단순히 하드웨어에서 상태를 저장하는 요소에 해당합니다. 이를 구체적으로 표현하는 것이 reg, integer, real 등이죠.

Parameter

  • Parameters런타임 상수로, 하드웨어 설계에서 유동적인 상수값을 정의하는 데 사용됩니다. 예를 들어, parameter WIDTH = 8;와 같이 상수 값을 정의할 수 있습니다.
  • module parameter는 각 인스턴스별로 #() 또는 defparam으로 오버라이드(값을 변경)할 수 있습니다.

Concept of Type

타입 개념

  • Verilog에서는 각 변수의 타입을 명시적으로 지정할 수 있습니다. 예를 들어 wirereg와 같은 기본 타입이 있습니다.
    • Procedural assignmentreg 타입에만 가능합니다. 이는 프로시저적 할당 방식으로 값이 변경되는 경우에 사용됩니다.
    • Default는 보통 wire 타입입니다. 이는 기본적으로 물리적인 신호를 나타내는 데 사용됩니다.

Vectors

Vectors

  • Vectors는 여러 비트로 구성된 신호를 나타냅니다. 예를 들어, reg [7:0] data;8비트 레지스터를 의미합니다.

  • 비트 벡터는 [msb:lsb]로 표현되며, 크기 조정을 할 때 주의해야 합니다.

    크기 조정(Truncation & Padding)

    • Source가 더 크면: 더 작은 신호가 오른쪽에서 잘라지며(트렁케이션) 전달됩니다.
    • Source가 더 작으면: 패딩을 통해 왼쪽에서 0으로 채워집니다.

Literal Values

  • Verilog에서 상수값을 표현할 때 4'b1001, 8'd255와 같은 literal 값을 사용합니다.
  • 형식: [size]'[base][value]
    • 예: 4'b1001 = 4비트 바이너리 1001
    • 4'd9 = 10진수 9
    • 5'o11 = 8진수 11

Automatic Extension of Literals

  • Verilog에서는 상수값을 확장할 때 MSB(최상위 비트)가 xz일 경우, 자동으로 확장이 될 수 있습니다.

Net Types

Nets

  • Nets는 회로의 물리적 연결을 정의하며, 기본적으로 wire 타입으로 설정됩니다.
  • wire 외에도 다양한 전달 타입이 존재합니다:
    • supply1, supply0: 전원 공급용 신호
    • tri: 트라이 상태 (Hi-Z 상태) 신호
    • wand, wor: AND/OR 결과로서의 연산 신호

Logic Conflict

  • Continuous assignment에서 충돌이 발생할 수 있습니다. 예를 들어 wire로 선언된 신호는 여러 드라이버가 있을 경우 x 값이 될 수 있습니다.

Register Types

Register Types

  • reg: unsigned, 사용자가 정의한 폭을 가진 4-상태 (0, 1, x, z) 값을 가질 수 있습니다.
  • integer: signed, 32비트 크기의 4-상태 값을 가질 수 있습니다.
  • 실수 타입: real, time, realtime 등 다양한 데이터 타입을 사용할 수 있습니다.

Choosing the Correct Data Type

  • input port: 무조건 net type으로 선언해야 합니다. (데이터가 외부에서 들어오기 때문)
  • output port: reg 또는 net type으로 선언할 수 있습니다. (값을 외부로 내보내는 신호)
  • inout port: 무조건 net type으로 선언합니다. (입출력 모두 가능한 포트)

Parameter

Module Parameters

  • Module parameters각 인스턴스에 대한 상수를 정의합니다.
  • 예를 들어, 인스턴스를 만들 때 parameter WIDTH=8;과 같이 특정 값들을 설정하고, 이를 #()를 통해 오버라이드할 수 있습니다.

Local Parameters

  • Local parameters모듈 내에서만 사용되는 상수입니다.
  • Override할 수 없으며 상수 값으로 고정되어 있습니다.

Arrays

  • Verilog에서는 다차원 배열을 설정할 수 있습니다. 예를 들어 reg [7:0] data[0:99];100개의 8비트 배열을 정의하는 방식입니다.

2. Operators

arithmetic
bitwise
logical: operand reduction by a single bit operation
*reduction
unary reduction operators : 결과 1, 0, x
shift
relational
== : logical equality operator
===: case equality operator
conditional
triset, mux 구현할 때 사용
?:
concatenation
replication

알겠습니다! 이번에는 Verilog에서 사용되는 다양한 연산자(Operators)에 대해 자세히 설명하겠습니다. 각 연산자의 종류와 특징을 설명하고, 어떻게 사용되는지 구체적인 예시를 추가하여 정리해 드리겠습니다.


2. Operators

1. Arithmetic Operators (산술 연산자)

산술 연산자는 수학적 계산을 수행하는 데 사용됩니다.

연산자설명예시
+덧셈a + b
-뺄셈a - b
*곱셈a * b
/나눗셈a / b
%나머지a % b
**거듭제곱a ** b

예시:

reg [3:0] a, b, sum;
a = 4'b0011;  // 3
b = 4'b0101;  // 5
sum = a + b;  // 8 (4'b1000)

2. Bitwise Operators (비트 단위 연산자)

비트 단위 연산자는 각 비트에 대해 연산을 수행합니다. 이러한 연산자는 wire 타입과 같이 net type에 사용됩니다.

연산자설명예시
&비트 ANDa & b
``비트 OR
^비트 XORa ^ b
~비트 NOT (단일 피연산자)~a
~&NOR (비트 AND 후 부정)~(a & b)
`~`NAND (비트 OR 후 부정)
^~XNOR (비트 XOR 후 부정)~(a ^ b)

예시:

reg [3:0] a, b, result;
a = 4'b1101;  // 13
b = 4'b1011;  // 11
result = a & b;  // 4'b1001 (AND 연산)
result = a | b;  // 4'b1111 (OR 연산)
result = a ^ b;  // 4'b0110 (XOR 연산)

3. Logical Operators (논리 연산자)

논리 연산자는 boolean 값을 처리하는 데 사용됩니다.

연산자설명예시
&&논리 AND (단락 평가)a && b
``
!논리 NOT!a

예시:

reg a, b, result;
a = 1'b1;  // true
b = 1'b0;  // false
result = a && b;  // 1'b0 (AND 연산)
result = a || b;  // 1'b1 (OR 연산)

4. Reduction Operators (축소 연산자)

축소 연산자는 벡터의 모든 비트를 하나의 값으로 축소하는 데 사용됩니다. 주로 wire 타입에 사용됩니다.

연산자설명예시
&AND 축소&a (모든 비트가 AND 연산됨)
``OR 축소
^XOR 축소^a (모든 비트가 XOR 연산됨)
~&NOR 축소~&a (모든 비트가 NOR 연산됨)
`~`NAND 축소

예시:

reg [3:0] a;
a = 4'b1011;  // 4비트 벡터
wire and_result;
assign and_result = &a;  // AND 축소 -> 1'b0

5. Conditional (삼항) Operator

조건부 연산자는 if-else 구문처럼 작동하지만, 한 줄로 간단하게 표현할 수 있습니다.
if else 문 대신에 사용도 가능하다.

연산자설명예시
? :조건부 연산자 (if-else)a ? b : c (a가 참이면 b, 아니면 c)

예시:

reg [3:0] a, b, c, result;
a = 4'b1100;
b = 4'b1010;
c = 4'b0110;
result = (a == 4'b1100) ? b : c;  // 4'b1010 (a가 참이면 b)

6. Concatenation Operator (연결 연산자)

연결 연산자는 여러 비트나 벡터를 합치는 데 사용됩니다.

연산자설명예시
{}벡터 연결{a, b} (a와 b를 연결)

예시:

reg [3:0] a, b, result;
a = 4'b1100;
b = 4'b1010;
result = {a, b};  // 8비트 벡터: 4'b11001010

7. Replication Operator (복제 연산자)

복제 연산자는 하나의 값을 여러 번 반복하여 벡터로 만드는 데 사용됩니다.

연산자설명예시
{}값 복제{n{a}} (a를 n번 반복)

예시:

reg [3:0] a, result;
a = 4'b1010;
result = {3{a}};  // 12비트 벡터: 4'b101010101010

좋아요! 추가적으로 Shift 연산자, 관계 연산자, 논리/케이스 동등 연산자에 대해 설명하겠습니다.

8. Shift Operators (시프트 연산자)

Shift 연산자는 비트를 왼쪽 또는 오른쪽으로 이동하는 데 사용됩니다.

연산자설명예시
<<논리 왼쪽 시프트 (Logical Left Shift)a << b
>>논리 오른쪽 시프트 (Logical Right Shift)a >> b
<<<산술 왼쪽 시프트 (Arithmetic Left Shift)a <<< b
>>>산술 오른쪽 시프트 (Arithmetic Right Shift)a >>> b

논리 시프트 vs. 산술 시프트 차이점

  • 논리 시프트(<<, >>): 비어 있는 자리를 0으로 채운다.
  • 산술 시프트(<<<, >>>): 오른쪽 시프트 시 부호 비트를 유지한다.

예제

reg [7:0] a, b;
a = 8'b00001111;  // 15
b = a << 2;       // 8'b00111100 (왼쪽으로 2비트 이동, 60)
b = a >> 2;       // 8'b00000011 (오른쪽으로 2비트 이동, 3)

산술 시프트 예제

reg signed [7:0] c;
c = -8'sd4;        // 8'b11111100 (-4)
c = c >>> 1;       // 8'b11111110 (-2) (MSB 유지)

9. Relational Operators (관계 연산자)

관계 연산자는 두 값 간의 크기 비교를 수행합니다. 결과는 1(true) 또는 0(false)이 됩니다.

연산자설명예시
>크다 (greater than)a > b
<작다 (less than)a < b
>=크거나 같다 (greater than or equal to)a >= b
<=작거나 같다 (less than or equal to)a <= b

예제

reg [3:0] a, b;
a = 4'b1010;  // 10
b = 4'b0101;  // 5
if (a > b)    // 10 > 5 → 참 (1)
    $display("a가 b보다 크다");

10. Equality Operators (동등 연산자)

논리 동등 연산 (==, !=)

  • == : 두 값이 같으면 1을 반환 (논리적 동등)
  • != : 두 값이 다르면 1을 반환 (논리적 비동등)

예제

reg [3:0] a, b;
a = 4'b1010;  // 10
b = 4'b1010;  // 10
if (a == b)   // 참 (1)
    $display("a와 b는 같다");

⚠ 주의: x 또는 z가 포함된 값을 비교하면 결과가 X가 될 수도 있음.

Case Equality Operators (===, !==)

  • === : 두 값이 모든 비트가 완전히 같아야 1을 반환 (비교할 때 xz도 고려)
  • !== : 두 값이 하나라도 다르면 1을 반환 (비교할 때 xz도 고려)

논리 동등(==) vs. 케이스 동등(===) 비교

비교 연산자비교 결과
4'b10xx == 4'b1010X (논리 비교는 x 고려 안함)
4'b10xx === 4'b10100 (x도 엄격하게 비교)
4'b1010 !== 4'b10100 (완전히 같음)
4'b10xx !== 4'b10101 (x 때문에 다름)

예제

reg [3:0] a, b;
a = 4'b10xx;
b = 4'b1010;

if (a == b)   // 결과: X (논리 비교)
    $display("a와 b는 같다");

if (a === b)  // 결과: 0 (모든 비트 다 비교)
    $display("a와 b는 완전히 같다");
else
    $display("a와 b는 다르다");

Operator Precedence

외우기 힘드니 괄호를 사용하자

0개의 댓글