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"을 기반으로 작성했음을 알립니다.
'verilog > 이론' 카테고리의 다른 글
[verilog] verilog의 연산자(1)(산술연산자, 논리연산자, 비트단위 논리연산자) (2) | 2023.11.15 |
---|---|
[verilog] 벡터(vector)와 배열(array) (0) | 2023.11.13 |
[verilog] verilog의 자료형 (0) | 2023.11.11 |
[verilog] verilog의 어휘요소(여백, 주석, 연산자, 식별어, 예약어) (0) | 2023.11.06 |
[verilog] Verilog HDL과 설계 (0) | 2023.09.27 |