저번 포스트에서 module에 대해 공부하면서 하나의 .v파일에서 하나의 module만을 선언할 수 있다고 했고
여러개의 module을 사용하려면 여러개의 .v파일에서 각각 선언해야 한다고 했었습니다.

또 이후에 여러개의 module을 합칠 때는 top module을 생성해서 module들을 합치는 Instantiation 과정을 거친다고 했는데요. Instantiation을 어떻게 할 수 있는지 정리해보고 갑시다.

 

- Instantiation

설계자가 module_a.v 파일에 module a를 선언했고 module_b.v파일에 module b를 선언했다고 가정합시다.

이를 top.v 파일 top module에서 Instantiation을 하고 싶은데 이 때 top module에 module a, module b의 port들을 잘 연결해주어야 하겠죠.

Instantiation시 port를 연결하는 방법으로는 Named와 Positional 2가지가 존재합니다.

 

- Named Association

module a(
  input wire in_a,
  output reg out_a
);

...

endmodule
module b(
  input wire in_b,
  output reg out_b
);

...

endmodule
module top_module(
  input wire x1,
  input wire x2,
  output reg y1,
  output reg y2
);

...

endmodule

module a의 in_a에는 top module의 x1, module b의 in_b에는 top module의 x2,
module a의 out_a에는 top module의 y1, module b의 out_b에는 top module의 y2를 연결해서 Instantiation을 진행하려고 할 때 Named Association을 진행한다면 다음과 같습니다.

module top_module(
  input wire x1,
  input wire x2,
  output reg y1,
  output reg y2
);

a u_a(
.in_a  (x1),
.out_a (y1)
);

b u_b(
.in_b  (x2),
.out_b (y2)
);

endmodule

Named Association은 위와 같이 Port name을 직접적으로 Mapping 시켜서 Instantiation하는 방법입니다.

정확하고 오류가 없을만한 방법이죠.

사용하는 방법으로는 

[연결할 module name] [module name 선언] (

.[연결할 module의 port] ( [연결할 top module port] ),

...

);

과 같이 사용할 수 있습니다.

 

- Positional Association

Positional Association은 Named Association처럼 Port name을 직접적으로 Mapping 시키는 것이 아니라 연결할 module에서 Port가 선언된 순서에 맞게 위치를 일치시켜서 Instantiation 하는 방법입니다.

module top_module(
  input wire x1,
  input wire x2,
  output reg y1,
  output reg y2
);

a u_a(
x1,
y1
);

b u_b(
x2,
y2
);

endmodule

module a에서 port가 in_a, out_a 순서로 선언되어 있었으니
top module에서 in_a에 연결할 x1, out_a에 연결할 y1을 순서대로 위치에 맞게 적어준 것입니다.

module b도 마찬가지 방식으로 연결했고요.

 

Named에 비해서 수고스러움이 덜하긴 하지만 Port위치가 바뀐다거나
연결이 잘못되었을 때, 두개의 파일을 하나하나 비교를 해봐야 하기 때문에 어느정도 Risk는 존재할 수 있겠습니다.


Instantiation은 여러개의 module을 하나로 묶을 때와 Testbench를 구성할 때 반드시 거쳐야 하는 작업이기 때문에 
이 Instantiation 방법은 숙지해놓는 것이 좋을 것 같습니다 :)

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기