3. Verilog의 모듈 구조

[Module Structure]


module example_code #(parameter D=10)(
input	wire	[3:0]	i,
output	wire	[3:0]	o
);

wire	tmp;
wire	rst;

AND		A1(i, tmp);

assign o = ~i;
always @(*) begin
	if(rst) tmp = 1'b0;
    end
    
endmodule

 

※ 임의로 만든 모듈이기 때문에 제대로 작동하는지 아닌지는 판별 불가.

단순히 이렇게 모듈을 작성한다라는 것을 인지하면 되겠습니다.

한 가지 주의할 점은 assign 혹은 always와 같은 것을 사용하여 식을 정의할 때, 사용하는 변수가 그 이전에 선언이 되어야합니다. 즉, 위 모듈에서 선언 파트는 wire tmp; ~ wire rst;인데, 이 부분이 선언이 되지 않았다면 현재 always 구문은 에러가 발생하게 됩니다.

 

[Header]

모듈을 시작하는 부분으로써 키워드로는 module을 사용하고 Input과 Output을 포함합니다.

또한, 각 포트 선언마다 구분을 짓기 위해서 콤마(,)를 사용합니다. 사용하지 않는다면 마찬가지로 에러가 발생하게 됩니다.

Data Type이 지정되지 않았을 경우에는 Default는 wire가 됩니다. 즉 input wire [3:0] i로 기술하거나 input [3:0] i로 기술하거나 큰 차이는 없습니다. 다만, 데이터 타입을 지정하는 것이 바람직한데, 디자이너의 의도를 툴이 잘 이해할 수 있게 만드는 것이 당연히 좋기 때문입니다.

 

 

 

) 위 모듈은 다음과 같이 설명이 가능합니다.

 

Top이라는 큰 모듈 안에 ALU와 MEM 모듈이 존재합니다. ALU라는 모듈의 인스턴스 U1와 MEM의 모듈의 인스턴스 U2이고, U1 안에 FIFO라는 인스턴스 S1이 존재한다.

 

[Instantiation : 인스턴스화]

) <module name> <instance name> (<port list>);

모듈 = 틀, 인스턴스 = 틀에서 나온 결과물

 

1. Named Connection


TEST	U1(.in1(a), .in2(b), .out(c));

 

 

2. Ordered Connection


TEST	U1(a, b, c);

 

1번의 경우로 모듈 포트를 선언하는 것이 바람직하다.

2번과 같은 경우에는 순서를 헷갈리면 바로 에러가 나거나 결과가 제대로 출력되지 않을 경우가 생긴다.

그럼에도 불구하고, 2번과 같은 경우를 사용하는 엔지니어가 존재하기 때문에 어떻게 읽어야 하는지는 알아야겠다.