본문 바로가기
verilog/이론

[verilog] 모듈(module)과 테스트 벤치(testbench)

by 씐 2023. 11. 2.
728x90

모듈(Module)

 

모듈이란?

 

  • 모듈은 설계하고자 하는 대상의 동작(절차, 방법, 기능)을 구현하는 요소(component)들의 집합
  • 설계의 기본적인 구성 단위
  • 모듈에는 외부 환경과 소통하기 위한 인터페이스인 입출력 포트 정의
  • 그 입출력과 관련된 동작이 표현되어 있음.
  • 모듈은 그 자체로서 동작할 수 있으며, 입출력 인터페이스를 통해 다른 모듈에 필요한 기능을 제공할 수 있다.
  • 일반적으로 자주 사용되는 공통 기능은 하위 모듈로 설계
  • 상위 모듈에서는 하나 또는 여러 개의 하위 모듈을 내부에 포함시켜 설계(보통 인스턴스화시킨다고 표현한다.)
  • 상위 모듈의 설계에서는 하위 모듈의 세부 내용은 상관없이 입출력 인터페이스만 사용된다.
  • 즉, 하위 모듈을 설계하여 상위 모듈에서 호출하는 방식은 객체 지향 방식으로 설계의 유연성을 제공한다.

 

 

component와 module

 

  • Component1에는 설계하고자 하는 대상의 동작을 구현해놨고, 그러한 component들을 집합하여 하나의 module을 만들었다.
  • Component 1
module module_name1 (port_list);
	
    definition of ports;
    ...
    
    description of logic;
    ...
    
endmodule

 

  • component 1 + component 2 + ... + component n
module module_name2 (port_list);

    definition of ports;
    ...
    
    definition of logic;
    ...
    
    include component 1;
    include component 2;
    ...
    include component n;
    
 endmodule

 

 

 

module의 instance화

 

  • module 1

module mod1 (a, b);  //module module_name (port_list)
	
    input  a;
    output b;
    ...
    
    description of logic;
    ...
    
endmodule

 

  • top = mod1 + mod 2 + ...

module top (x, y);

    input x;
    output y;
    ...
    
    mod1 U1 (I/O port connection); // U1 is instance name of module1
    mod2 U2 (I/O port connection); // U2 is instance name of module2
    ...
    
endmodule

 

 

※ component와 instance에 대한 자세한 예시는 밑에 나올 예정


모듈의 표현

 

 

모듈 표현 형식

 

  • module ~ endmodule 쌍과 포트 선언, 데이터 형(reg, wire) 선언, 내부 연결, 동작 또는 구조 등을 표현
  • 모든 표현은 반드시 예약어인 module ~ endmodule 안에 있어야 함.
  • 모든 문장은 세미콜론(;)으로 끝내야 함
  • end~로 끝나는 예약어에는 세미콜론이 없다.
  • 모듈 표현 형식의 예
/* 주석 */
module module_name (port_list);

    모듈 구조의 정의
    * port 선언;
    * reg 선언;
    * wire 선언;
    * parameter 선언;
    
    회로 기능 표현
    * primitive 연산자 표현;
    * assign 문 표현;
    * function / task 호출문 표현;
    * always / initial 문 표현;
    
endmodule
  • 잘못 기술된 모듈 중첩
module 모듈이름 1 (포트목록 1);
    
    모듈 내용 1;
    
    module 모듈이름 2 (포트목록 2);  // 모듈 1안에 새로운 모듈의 중첩은 불가능함.
      모듈 내용 2;                // 모듈 2는 인스턴스화 개념을 사용하여 호출 필요
    endmodule
    
endmodule

 

  • 인스턴스화 개념을 사용한 모듈 호출
module 모듈이름 1 (포트목록 1);
	
    모듈내용 1;
    모듈이름 2 인스턴스이름 (포트목록 2); //모듈 2의 인스턴스화
    
endmodule

 

인스턴스화 예시

 

하위 모듈의 설계

 

/* sub1 모듈의 verilog 표현 */
module sub1 (clk, rst, in, a0, a1);

    input  clk, rst;
    input  in;
    output [6:0]  a0;
    output [15:0] a1;
    
    ...
    회로 기능(sub1) 표현
    ...
    
endmodule

 

/* sub2 모듈의 verilog 표현 */
module sub2 (clk, rst, b0, b1, out);

    input  clk, rst;
    input  in;
    input  [6:0]  b0;
    input  [15:0] b1;
    output out;
    
    ...
    회로 기능(sub2) 표현
    ...
    
endmodule

 

 

 

상위 모듈에서 하위 모듈의 인스턴스화 예

 

/* top 모듈의 verilog 표현 */
module top (clk, rst, in, out);

    input  clk, rst;
    input  in;
    output out;
    wire   [6:0]  w0;
    wire   [15:0] w1;
    
    
    ...
    sub1 U1 (clk, rst, in, w0, w1);  //sub1 인스턴스화
    sub2 U2 (clk, rst, w0, w1, out); //sub2 인스턴스화
    ...
    
endmodule

테스트벤치(Testbench)

 

테스트벤치

 

/* 시뮬레이션을 위한 테스트벤치 표현 형식 */
'timescale 참조시간 단위 / 시간 정밀도

module 테스트벤치이름;
  
  reg  입력신호;
  wire 출력신호;
  
  검증 대상 설계회로의 인스턴스화;
  
  시뮬레이션에 사용할 내용(입력신호 값);
  
endmodule
  • 대상 회로의 설계가 완료되면 설계된 모듈이 정확히 표현되었는지와 기능이 정상적으로 동작하는지 검증
  • 검증용 component를 테스트벤치(testbench) 또는 스티뮬러스(stimulus)라 한다.
  • 테스트벤치는 대상 회로의 설계 모듈과 유사한 형식으로 표현되지만, 외부 입출력 포트가 없는 최상위 계층의 모듈이다.
  • 검증할 회로의 설계 모듈은 테스트벤치의 하위 모듈로 인스턴스화를 통해 호출된다.

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