verilog 모듈 연결하기

13
module 연결 보충설명 언제 module 연결이 필요할까? 작성한 로직 모듈의 동작을 확인하기 위해 테스트벤치를 짤 때 단순한 기능의 하위 모듈을 조립해서 복잡한 기능을 하는 모듈을 작성할 때 ModelSim 프로그램은 각 모듈을 컴파일 할 때 모듈 내부에서 라이브러리에 없는 모듈 이름을 만나 면 프로젝트 안에 포함되어있는 파일들을 검색해서 자동으로 모듈을 연결시켜준다. C언어에서 #include로 명시했던 것을, 프로그램이 자동으로 해주는 것이다. 다음 소스코드가 프로젝트 안에 포함되어있다고 가정하고, 모듈을 호출하는 다양한 케이스를 알아본다. mymodule.v: 로직 모듈 tb_mymodule.v : 테스트벤치

Upload: jihyun-lee

Post on 28-Jul-2015

817 views

Category:

Software


5 download

TRANSCRIPT

Page 1: Verilog 모듈 연결하기

module 연결 보충설명

• 언제 module 연결이 필요할까?• 작성한 로직 모듈의 동작을 확인하기 위해 테스트벤치를 짤 때• 단순한 기능의 하위 모듈을 조립해서 복잡한 기능을 하는 모듈을 작성할 때

• ModelSim 프로그램은 각 모듈을 컴파일 할 때 모듈 내부에서 라이브러리에 없는 모듈 이름을 만나면 프로젝트 안에 포함되어있는 파일들을 검색해서 자동으로 모듈을 연결시켜준다.• C언어에서 #include로 명시했던 것을, 프로그램이 자동으로 해주는 것이다.

• 다음 두 소스코드가 한 프로젝트 안에 포함되어있다고 가정하고, 모듈을 호출하는 다양한 케이스를알아본다.• mymodule.v: 로직 모듈• tb_mymodule.v : 테스트벤치

Page 2: Verilog 모듈 연결하기

module 연결 보충설명

module tb_mymodule;reg in0, in1, in2; // used as input signalwire out0, out1; // used as output signal

...mymodule mm0(in0, in1, in2, out0, out1);...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Page 3: Verilog 모듈 연결하기

module tb_mymodule;reg in0, in1, in2; // used as input signalwire out0, out1; // used as output signal

...mymodule mm0(in0, in1, in2, out0, out1);...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Case 1: 가장 간단한 연결

tb_mymodule.v를 컴파일 할 때 모듈 내부에서 mymodule이라는 모듈 이름을 발견했다. 같은 프로젝트 안에 포함된 mymodule.v를 검색했더니 mymodule이라는 모듈이 정의되어 있다.

mymodule은 인풋 3개(in0, in1, in2)를 받고 아웃풋 2개(out0, out1)를 받도록 정의되어있었다. tb_modul이 mymodule을 부를 때도 똑같이 인풋 3개와 아웃풋 2개를 넣어주고 있다.

Page 4: Verilog 모듈 연결하기

module tb_mymodule;reg in0, in1, in2; // used as input signalwire out0, out1; // used as output signal

...mymodule mm0(in0, in1, in2, out0, out1);...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Case 1: 가장 간단한 연결

tb_mymodule.v를 컴파일 할 때 모듈 내부에서 mymodule이라는 모듈 이름을 발견했다. 같은 프로젝트 안에 포함된 mymodule.v를 검색했더니 mymodule이라는 모듈이 정의되어 있다.

mymodule은 인풋 3개(in0, in1, in2)를 받고 아웃풋 2개(out0, out1)를 받도록 정의되어있었다. tb_modul이 mymodule을 부를 때도 똑같이 인풋 3개와 아웃풋 2개를 넣어주고 있다.

따라서 컴파일에 성공한다.

Page 5: Verilog 모듈 연결하기

module tb_mymodule;reg A, B, C; // used as input signalwire X, Y; // used as output signal

...mymodule mm0(A, B, C, X, Y);...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Case 2: 테스트벤치에서 시그널 이름 변경

이번에는 테스트벤치를 작성할 때 input으로 넣어줄 값들의 이름을 A, B, C로 바꿨고, output으로 얻을값들의 이름을 X, Y로 바꿨다. Case 2에서의 실패(?)를 발판으로 input은 input 포트 위치에, output은output 포트 위치에 넣었다.

이 상태에서 컴파일을 누르면 어떻게 될까?

Page 6: Verilog 모듈 연결하기

module tb_mymodule;reg A, B, C; // used as input signalwire X, Y; // used as output signal

...mymodule mm0(A, B, C, X, Y);...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Case 2: 테스트벤치에서 시그널 이름 변경

이번에는 테스트벤치를 작성할 때 input으로 넣어줄 값들의 이름을 A, B, C로 바꿨고, output으로 얻을값들의 이름을 X, Y로 바꿨다. Case 2에서의 실패(?)를 발판으로 input은 input 포트 위치에, output은output 포트 위치에 넣었다.

이 상태에서 컴파일을 누르면 어떻게 될까?

이 코드는 컴파일에 성공한다.

Page 7: Verilog 모듈 연결하기

module tb_mymodule;reg A, B, C; // used as input signalwire X, Y; // used as output signal

...mymodule mm0(A, B, C, X, Y);...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Case 2: 테스트벤치에서 시그널 이름 변경

테스트벤치에서 input 신호나 output 신호를 뭐라고 부르든지 상관없이 mymodule에 정해진 input ‘포트’와 output ‘포트‘ 위치가 맞으면 된다. input 신호를 input 포트에, output 신호를 output 포트에 넣어주는 것이 중요하다.

Page 8: Verilog 모듈 연결하기

module tb_mymodule;reg in0, in1, in2; // used as input signalwire out0, out1; // used as output signal

...mymodule mm0(out0, out1, in0, in1, in2);...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Case 3: 흔한 에러 케이스

Case 1이나 2와 상황은 거의 비슷하다. (앞장과 비교하면서 어디가 달라졌을까 찾아보도록 하자.)

이 상태에서 컴파일을 누르면 어떻게 될까?

Page 9: Verilog 모듈 연결하기

module tb_mymodule;reg in0, in1, in2; // used as input signalwire out0, out1; // used as output signal

...mymodule mm0(out0, out1, in0, in1, in2);...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Case 3: 흔한 에러 케이스

Case 1과 상황은 거의 비슷하다. (앞장과 비교하면서 어디가 달라졌을까 찾아보도록 하자.)

이 상태에서 컴파일을 누르면 어떻게 될까?

이 코드는 컴파일에 실패한다.

Page 10: Verilog 모듈 연결하기

module tb_mymodule;reg in0, in1, in2; // used as input signalwire out0, out1; // used as output signal

...mymodule mm0(out0, out1, in0, in1, in2);...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Case 3: 흔한 에러 케이스

위 코드가 컴파일에 실패하는 이유는 모듈을 불러올 때 input과 output 포트 연결의 순서가 잘못되었기 때문이다.

모듈 이름은 자동으로 찾아주지만, input/output 포트까지 알아서 연결해주지는 않는다. 위의 코드처럼 호출을 하면 mymodule 형태를 가진 mm0를 생성할 때 넣어준 순서 그대로 연결하려고 시도하게된다. (out0 -> in0, out1 -> in1, in0 -> in2, in1 -> out0, in2 -> out1)

시그널 이름을 바꿔도 상관 없다는 것을 거꾸로 말하면 시그널 ‘이름’은 목적지(포트)에 대한 힌트가 되지 못한다는 말이다.

Page 11: Verilog 모듈 연결하기

module tb_mymodule;reg in0, in1, in2; // used as input signalwire out0, out1; // used as output signal

...mymodule mm0(out0, out1, in0, in1, in2);...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Case 4: 포트 이름 명시

Case 3에서는 로직 모듈을 정의할 때 쓴 포트 순서와 모듈을 연결할 때 쓴 포트 순서가 달라서 컴파일에러가 발생했다. 그렇다면 모듈 연결할 때 포트 순서를 내 마음대로 바꿀 방법은 없는 것일까?

그렇지는 않다. 다 방법이 있다.

Page 12: Verilog 모듈 연결하기

module tb_mymodule;reg in0, in1, in2; // used as input signalwire out0, out1; // used as output signal

...mymodule mm0(.out0(out0), .out1(out1),

.in0(in0), .in1(in1), .in2(in2));...

endmodule

module mymodule(in0, in1, in2, out0, out1);

input in0, in1, in2;output out0, out1;

...

endmodule

tb_mymodule.v mymodule.v

Case 4: 포트 이름 명시

위 코드처럼 내가 이 신호를 어떤 포트에 넣어줄 것인지 확실하게 명시해주면 된다. 자동으로 안되면수동으로 해결하는 것이다.

.포트이름(시그널이름) 형식으로 사용한다.

만약 tb_mymodule.v에서 Case 2에서처럼 input signal을 reg A, B, C 라고 선언했다면 .in0(A) 처럼넣어줄 수 있다.

Page 13: Verilog 모듈 연결하기

Summary

1. 테스트벤치에서 만든 시그널의 이름은 모듈 정의할 때의 포트이름과 달라도 상관 없다.

2. 테스트벤치에서 만든 시그널을 모듈에 넣어줄 때는 input 포트와 output 포트의 순서를 확인하자.

3. 정 포트의 순서를 바꾸고 싶거나, 포트 연결을 확실하게 알아보고 싶을 때는 .포트이름(시그널이름) 형식으로 넣어준다.

4. 이 외에도 시그널과 포트의 bit 수가 다르다던가 하는 여러 가지에러 요인이 있을 수 있으니 조심한다.

5. 구글링을 잘 하자.