본문 바로가기
verilog/이론

[verilog] verilog의 추상화 수준 모델링 방법(1)(게이트 수준 : and, or, nand, nor, xor,3-state gate primitive, 데이터 플로우 수준 : 연속 할당문, 절차형 할당문)

by 씐 2023. 11. 27.
728x90

추상화 수준 모델링

 

추상화 수준 모델링

 

  • verilog HDL을 이용하여 원하는 논리회로나 디지털시스템을 표현하는 방법으로 4가지 추상화 수준의 모델링 방법이 있음.
  • 추상화 수준에 따른 모델링 종류
    • 스위치 수준 모델링, 게이트 수준 모델링, 데이터 플로우 수준 모델링, 행위 또는 알고리즘 수준 모델링
    • 스위치 수준 모델링은 스위치(On/Off), 기억노드, 그리고 그들의 연결로 구현되는 추상화 수준 모델링의 가장 하위 수준

게이트 수준 모델링

 

게이트 수준 모델링

 

  • verilog에는 기본적인 논리 게이트가 프리미티브 연산자(primitive operator)로 미리 정의
  • 모듈 정의 없이 일반적인 모듈처럼 인스턴스화가 가능
  • 기본적인 디지털 논리 게이트에는 AND, OR, NOT, NAND, NOR, XOR가 있다.

 

 

기본적인 디지털 논리 게이트 종류

 

  • AND 게이트

  • OR 게이트

  • NOT 게이트

  • NAND 게이트

  • NOR 게이트 

  • XOR 게이트

**** 진리표 틀렸네요. 아래가 맞습니다. XOR은 두 입력의 값이 다를 때 1이 출력되는 논리 게이트입니다.

 

primitive의 intstance화

 

  • 인스턴스 이름은 생략할 수 있다.
  • 입출력 목록은 반드시 출력, 입력 순으로 작성
  • #을 이용하여 전달지연을 지정할 수 있다.
  • 지연 값이 지정되지 않으면 전달 지연은 0으로 간주
  • 지연은 하나 또는 두 개의 값으로 지정할 수 있으며, 첫 번째 값은 출력 상승지연, 두 번째 값은 출력 하강지연을 의미
  • 하나의 지연 값만 지정하면 상승지연과 하강 지연이 동일한 값으로 설정
  • 사용 예
프리미티브_연산자 #(상승지연, 하강지연) 인스턴스_이름 (output, input1, input2, ...);

/* and gate primitive */
and        U1 (c, a, b); // 지연 생략, 인스턴스 이름 U1
and           (c, a, b); // 지연, 인스턴스 이름 생략
and #2     U1 (c, a, b); // 상승 / 하강 지연 모두 2ns
and #(3,4) U1 (c, a, b); // 상승 지연 3ns, 하강 지연 4ns
  • 게이트 프리미티브 연산자는 인스턴스화(instantiation)하여 사용
  • 인스턴스화는 상위 모듈에서 프리미티브 연산자를 하위 모듈로 호출하여 사용하는 개념
  • 모듈 내에서 하나의 게이트 프리미티브 연산자를 여러 번 호출하여 사용할 경우, 인스턴스 이름을 달리 사용하여 각각의 호출한 것들을 서로 다른 인스턴스(객체)로 구분할 수 있게 함.
  • 따라서 미리 잘 설계된 Desing Entity(설계 독립체, 즉 모듈)을 여러 번 반복 호출해서 사용할 수 있음.
  • 사용 예
/* U1과 U2는 서로 다른 객체이다. */

and U1 (output1, input1, input2);
and U2 (output2, input2, input3);

 

 

3상태 게이트 프리미티브(3-state gate primitive)

 

  • 위의 논리 게이트 프리미티브 연산자 이외에 제어신호가 포함된 3상태 게이트 프리미티브 연산자도 사용 가능
  • 3상태 게이트 프리미티브는 bufif0, bufif1, notif0, notif1이 있음
  • 출력은 0, 1, z
  • 3상태 게이트 프리미티브들은 오직 제어신호가 인가될 때만 신호를 전달
  • 제어신호가 인가되지 않을 경우는 z(high impedence)가 전달
  • 3상태 게이트 프리미티브의 기호

  • 3상태 게이트 프리미티브의 진리표
bufif1 control
0 1 x z
input 0 z 0 L L
1 z 1 H H
x z x x x
z z x x x
bufif0 control
0 1 x z
input 0 0 z L L
1 1 z H H
x x z x x
z x z x x
notif1 control
0 1 x z
input 0 z 1 H H
1 z 0 L L
x z x x x
z z x x x
notif0 control      
0 1 x z
input 0 1 z H H
1 0 z L L
x x z x x
z x z x x
  • 사용 예
buf     U1 (output, input);
not     U2 (output, input);
bufif0  U1 (output, input, control);
bufif1  U1 (output, input, control);

데이터 플로우 수준 모델링

 

데이터 플로우 수준 모델링

 

  • 복잡하지 않은 작은 회로를 설계할 때는 설계자의 직관적인 판단에 의해 게이트간 연결을 하는 게이트 수준 모델링 기법이 적합
  • 조금 더 복잡한 회로를 설계할 때는 게이트 수준보다 한 단계 더 추상적인 기능 중심의 모델링 기법을 사용하는 것이 효율적
  • 데이터 플로우 수준 모델링 방법은 다양한 연산 및 처리 결과를 이용하여 회로의 동작 표현
  • 게이트 수준 모델링에서는 게이트 프리미티브 연산자를 사용하여 기본적인 논리회로의 각 논리소자의 입출력을 표현
  • 이때 프리미티브 연산자는 입력에 대한 연산결과를 직접 출력신호에 할당
  • 데이터 플로우 수준 모델링 방법을 이용한 설계에서는 연산 및 처리 결과를 출력 신호로 넘겨받기 위해 할당문 사용

 

 

할당문

 

  • 할당문은 객체(object)에 값을 주는 기본적인 방법
  • net(wire) 자료형 객체에 값을 할당하는 연속 할당문과 variable(reg) 자료형 객체에 값을 할당하는 절차형 할당문이 있다.
  • 연속 할당문(continuous assignment)
assign result = a & b;
assign out = in1 & in2; //out, in1, in2는 네트
assign flag = (cnt == 4'h7);
assign address[15:0] = 16'b0; //address는 16비트 네트형 벡터
assign {carry, sum[3:0]} = a[3:0] + b[3:0] + c_in; //1비트 네트 carry와 4비트 네트형 벡터 sum의 결합

 

  • assign문을 이용하여 net형 객체에 스칼라 또는 벡터 형태의 값을 할당
  • 우변의 값에 변화가 발생했을 때 좌변의 객체에 값 할당이 즉시 일어남.
  • 조합회로에서 사용(ex. adder, multiplexer, decoder...)
  • 절차형 할당문(procedural assignment)
always @(event_signal) begin
  result_blocking = a & b; //블록킹 대입문
  result_nonblocking <= a & b; //논블록킹 대입문
end
  • always문 또는 initial문에서 블록킹 할당 연산자(=) 또는 논블록킹 할당 연산자(<=)를 사용하여 variable형 객체(reg, integer 등)의 값을 갱신
  • 우변 수식의 값 변화(event)와 상관없이 event_signal의 값에 변화가 발생했을 때 우변 수식의 값이 좌변의 객체에 값이 할당되며 다음 절차형 할당문에 의해 값이 갱신될 떄까지 좌변에 할당된 값은 유지됨.
  • 순차회로에서 사용(ex. latch, flip-flop)
  • 연속 할당문 사용 시 주의 사항
    • 연속 할당문(assign문)에서 할당 연산자(=)의 왼쪽에는 net형만 올 수 있으며 reg형은 사용할 수 없다.
    • 연속 할당문에서 할당 연산자의 오른쪽에 올 수 있는 것은 net형/reg형 스칼라 또는 벡터 또는 함수 호출문이다.
    • 연속 할당문의 할당 연산자의 오른쪽 피연산자들의 값이 변화하면 즉시 왼쪽 net에 값이 할당된다.
  • wire(net)형과 reg형
    • wire는 값을 저장할 수 없고, assign문과 함께 사용된다. combinational logic을 표현할 때 주로 사용
    • reg형은 값을 저장할 수 있고, assign문을 사용할 수 없다. 주로, sequential logic을 표현할 때 주로 사용(combinational logic을 표현할 때도 사용됨.)

이 글은 "따라하면서 배우는 디지털 시스템 설계 및 응용 with Verilog HDL"을 기반으로 작성했음을 알립니다.