지난 포스팅에는 1-bit adder를 연결하여

4-bit adder를 만들었다.

이번 포스팅은 그렇게 만든 adder를 실험할 수 있는 testbench를 짜 볼 것이다.

우선 testbench 란 우리가 만든 dut (device under test) 를 말 그대로 test 할 수 있게 해주는 것이다.

앞에서 만든 adder는 dut이다. 이 dut만 가지고서는 제대로 작동하는지 알 수 없기 때문에

testbench를 이용하여 시험해주는 것이다.

예를 들어 함수 f(x)를 만들었다면 그 함수 f(x)의 x에 어떤 값을 넣었을 때

우리가 생각한 값이 나와야지 함수 f(x)가 제대로 작동하는지 알 것이다.

그런 x에 값을 넣는 동작을 testbench로 해주는 것이다.

testbench 또한 우리가 만든 dut를 test 하는 것이므로

시험하려는 dut와 입출력이 똑같아야 한다.

(다르면 오류 뜨므로 주.의. 오류 뜨면 짜증남)

* dut에서는 입력을 input , 출력을 output으로 적었지만

testbench를 작성할 때는 입력은 reg로 선언하여 적고 출력은 wire로 적어준다.

그리고 각 모듈의 이름을 써주고 입출력 옆에 ( ) 에 각각 넣을 입력을 적어준다.

예시로 저번 포스팅에서 만든 adder에 관해 testbench를 작성하면 다음과 같다.

항상 시작은 module로 시작한다.

그리고 dut와 다르게 입력은 reg 출력은 wire 선언 후 작성한 걸 볼 수 있다.

그리고 각각 입력을 random하게 넣어주면서 화면에 출력되는 output 값을 확인하면 adder가 제대로 작동하는지

확인할 수 있다.

이와 같이 작성한 testbench를 modelsim을 이용하여 돌려보면

이러한 웨이브 형태가 나온다.

우리는 이진수보다는 역시 10진수가 알아보기도 편하고 마음도 편하므로 ^^,,,

상큼하게 10진수로 바꿔준다

그리고 웨이브를 잘 살펴보면

a와 b 그리고 carry in이 랜덤하게 들어오는 것을 볼 수 있다.

그리고 그에 따라 sum인 출력값 s1을 보면 2+4+1=7

로 7이라는 값을 가지는것을 볼 수 있다.

 

또한 이는 다른 방법으로 작성한 두개의 4-bit adder에서

동일한 결과 값이 나오는걸 볼 수 있다.

(s1과 s2의 값이 같고, co1과 co2의 값이 같다.)

다음 웨이브를 보면 ci (carry in ) 값이 없고

a,b 값이 8과 1이므로

8+1+0 = 9

로 s1, s2의 값이 9인것을 볼 수 있다.

이를 display 창 (화면에 표시되게끔 작성했으므로)

을 통해 보면 다음과 같다.

각각 표에서 ci와 a,b 를 더한값이 s1, s2 인것을 확인할 수 있다.

이렇게 adder (덧셈기) 를 만들었다.

 

 

Posted by 이지원
,

하드웨어를 기술하는 언어인 베릴로그

 

1) 베릴로그는 두 유형의 모듈이 있다.

   - Behavioral :  모듈이 무엇을 하는지 설명

   - Structural  :  간단한 모듈로부터 어떻게 설계되는지

 

2) Behavioral 

   verilog 에서는 시작할때 module 을 적어주고 그 다음 모듈 이름 , 모듈의 입출력, 원하는 동작, endmodule 순으로 적어준다. 간단한 예시를 보면 다음과 같다.

 

이렇게 기본적인 모듈을 만들고 이러한 모듈을 이용하여 더 큰 모듈을 생성할수도 있다.

 

논리회로에서 배운 AND, OR , NOT 게이트들을 사용하여 다양한 동작을 하는 모듈을 생성할 수도 있다.

 

2) 주의해야할 점

 

1. 대소문자를 구분해야 한다. (Example과 example 은 다르다. )

2. 숫자로 시작하는 이름은 안된다!!

3. 공백은 무시하고 작동함

 

 

3) Strtuctural 

   위에서 말했듯이 기본적인 모듈을 이용하여 연결한다고 생각하면 된다.

and 게이트와 inverter 게이트를 합친 모듈을 만들어보면 다음과 같다.

 

 

합칠 모듈은 그 파일 안에 들어있어야 한다. 그 후 새로운 모듈을 선언 해주고 연결할 선이 있다면 wire 선언을 해주어야 한다. 그 후 모듈 이름을 적어 불러온 후 각각의 입출력 옆에 ( ) 속 입력들을 적어준다. 

위의 예시에서 and 게이트의 출력을 inverter 게이트의 입력으로 넣을것이므로 

wire 선언을 해준 것을 and 게이트의 출력으로 적어주고 inverter 게이트의 입력으로 넣어주었다.

 

*) module 옆에 적는 아이를 port list 라고 한다. 여기에 입출력을 다 적어주지 않아서 오류가 자주 뜨므로 꼭 적어줄 것!,

Posted by 이지원
,