Loading [MathJax]/jax/output/HTML-CSS/config.js

#6. Gate-level modeling(게이트수준 모델링)

Verilog/Verilog HDL강의정리(KOCW) 2023. 7. 18. 00:52
반응형

Verilog에서는 4가지 설계기법이 존재한다.

=====조합회로를 모델링하는 방법===============

1. gate-level modeling : 게이트수준 모델링

2. Concurrnet assignment : 연속할당문(assign)문 활용 모델링

=====조합회로, 순차회로를 모델링 하는 방법 =======

3. Behavioral modeling : 행위수준모델링 (Blocking/ Non blocking statement 활용)

4. Structural modeling : 구조적 모델링, 이미 만들어진 모듈들을 활용하여 모델링하는 기법

조합회로/순차회로 모델링 방법에 따른 구분은 절대적인 것은 아니다, 대체로 그렇게 사용된 다는 것이다.

그중에서도 이번 강의에서는 게이트 수준 모델링에 대해서 알아보도록 하겠다.


1. Gate & switch primitive

Verilog에서는 정의하거나 선언하지 않고 사용될 수 있는, 즉 미리 만들어진 선언문이 존재한다. 이것을 predefined(gate) primitive라고 하는데, 다음 표를 자세히 보자.

익숙한 표현들도 존재할 것이다. Gate primitive 는 모듈 내에서만 사용이 가능하고, initial과 always 구문 안에서는 사용이 불가하다. 빨간색 네모 바깥쪽에 있는 것들은 초보수준의 verilog에서는 사용하지 않기 때문에 빨간 네모 안만을 주목하면 되겠다.

1. n-input gates : n개의 input을 제공하며, 1개의 output을 지원하는 게이트

2. n-ouput gates : n개의 ouput을 제공하며, 1개의 input을 지원하는 게이트

3. three-state gates : 3상태를 지원하는데 여기서 3상태는 (1,0,Z)를 의미한다.


2. gate primitive를 불러서 사용하는 방법(instance 하는 방법)

primitive_gate_name : 미리 선언된 gate primitive 구문을 쓴다(ex. and, nand, or등)

파란색 대괄호의 경우 생략이 가능한 구문이다.

[#(n1,n2)] : 지연을 나타내는 구문, default 지연값은 0(n1은 상승지연 0,X,Z->1, n2는 하강지연 1->0,X,Z)

[instance_name]  : 생략가능, 구조적 모델링에서 하위 모듈을 인스턴스 하는 경우에는 생략 불가

(output, input1, ...) : 순서에 따라 값이 매핑된다.(이름에 의해서 매핑 불가)

예시를 통해 알아보자

xor #(3, 4) U5(out,c,b,a)

이렇게 구문이 쓰여지면 xor게이트를 생성하고, 지연은 상승일 경우 3ns, 하강일 경우 4ns 지연이 일어나며, U5라는 이름을 붙여주고, 포트에는 출력에 out을, 입력에는 a,b,c를 할당하여 xor 게이트를 만들어준다.

주의할점 : "#"으로 쓰인 지연문은 시뮬레이션에서만 반영되고, 합성시에는 반영되지 않는다.(회로가 그려지는 것이 아님)


3. Gate primitive를 활용한 1비트 전가산기 모델링

위 사진은 1비트의 전가산기를 gate primitive를 활용하여 모델링 한 것이다. 

하나씩 뜯어보면 전체적인 구조는 module~endmodule로 구성되어 있으며

module	full_adder_g(a, b, cin, sum, cout); // module 선언부, full_adder_g라는 이름으로 선언하고 입출력 변수들을 넣는다.
    input a, b, cin; //input단 선언
    ouput sum, cout; //output단 선언
    wire s1, c1,c2; //input과 output 사이의 도선(내부신호)들을 wire로 선언
    
    xor (s1, a, b); //gate-primitive를 활용하여 xor 게이트 선언 후 포트할당(이름 생략)
    and	(c1, a, b); //gate-primitive를 활용하여 and 게이트 선언 후 포트할당(이름 생략)
    and G3 (c2, s1, cin); //gate-primitive를 활용하여 and 게이트 선언 후 포트할당(이름 G3)
    xor G4 (cout, s1, cin); //s1, c1, c2는 내부신호 wire
    xor G5 (cout, c1, c2);
endmodule

자세하게 주석을 추가하여 작성해보았다. wire로 선언된 부분에 유의하여 회로 그림과 비교해서 보면 되겠다.

전가산기에 대한 내용을 잘 모르겠다면 이전에 VHDL로 작성했던 내용이 있다.

#1. Full adder(전가산기) - 공학이야기 (tistory.com)

 

#1. Full adder(전가산기)

앞으로 이 게시판에서는 논리회로설계실습에서 사용된 알고리즘과 코드에 대해서 설명할 예정입니다. 이용 프로그램은 Xillings를 이용합니다. 1. 배경이론 Full adder 1비트의 2진수를 3개를 더하는

lifelectronics.tistory.com

물론 예전에 쓴 것이라 코드는 지금과 다르다, 내용만 확인하면 되겠다.


4. Gate instance의 배열

여러개의 gate를 만들어야 할 경우에는 배열형식으로도 gate를 지정할 수 있다. 예시를 통해서 확인해보면

nand #2 t_nand[0:7](...);

이 구문을 해석해보면, t_nand라는 이름의 nand 게이트를 만드는데 0~7까지의 총 8개의 nand gate가 만들어진다. 이때에는 인스턴스 이름을 생략할 수 없다. 이렇게 작성하게 되면 여러 비트를 연산하는 회로를 만들 수 있다. 예시 한가지를 더 봐보자.

위와 같은 그림의 회로를 구성한다고 생각해보자, 해당 회로는 4비트 nor 연산을 지원하는 nor 게이트가 되겠다. 그렇다면 4번의 nand가 선언 되어야 하므로 nor U0 [3:0] (y,a,b) 이런식으로 작성하게 되면, 순차적으로 입력과 출력에 4비트씩 4개의 nor 게이트가 만들어지게 된다. 아래는 코드를 작성해보았다.

module nor_gate_4bit(a, b, y);
    input [3:0] a, b; //4비트의 입력 a, b
    output [3:0] y;	 //4비트의 출력y
     
    nor U0 [3:0] (y, a, b); // 2input, 1output의 4비트 nor gate 선언
endmodule

d위와 같이 작성하면 4개의 nor gate가 생성되며, 4비트 연산을 만들 수 있게 된다.

만약 이렇게 작성하지 않으면 아래와 같이 작성하게 된다.

module nor_gate_4bit(a, b, y);
    input [3:0] a, b; //4비트의 입력 a, b
    output [3:0] y;	 //4비트의 출력y
     
    nor U3 (y[3], a[3], b[3]); 
    nor U2 (y[2], a[2], b[2]);
    nor U1 (y[1], a[1], b[1]);
    nor U0 (y[0], a[0], b[0]);
endmodule

차이를 확인할 수 있다.

 

반응형