while(1) work();
반응형
본 게시글은 KUEE 정보공개 프로젝트에 포함된 글입니다.
https://blog.youhogeon.com/65

본 자료의 저작권은 모두 저에게 있으며
학업에 참고 자료로만 사용하시길 바랍니다.
부득이하게 인용해야 하는 경우 반드시 출처(KUEE 정보공개 프로젝트)와 링크를 남겨주시길 바랍니다.

5.pdf
1.84MB
src.zip
0.01MB

 

 

VLSI 설계 및 실험보고서 LAB 05 #실험1 : 22x22 Carry Save Multiplier (RCA in the last stage) 1. 개요 좌측 그림은 4x4 array multiplier를 도식화한 그림이다. 두 번째 피연산자(multiplicand)의 각 자리에 첫 번째 피연산자(multiplier)를 곱한 뒤, 각각의 결과를 shift시켜 더하는 곱셈 연산의 원리를 이용해 회로를 만들면 array multiplier가 된다. 그러나 array multiplier는 거쳐야하는 full adder의 수가 많기 때문에 delay가 많이 발생하며, 그에 따라 개선된 multiplier인 carry save multiplier, tree multiplier 등 다양한 종류의 multiplier들이 탄생하였다. 그 중에서 carry save multiplier는 array multiplier의 각 full adder들의 carry를 다음 단계(next stage)의 full adder로 전달한다. 이러한 방식을 통해 carry propagation를 줄여 회로의 동작속도를 높일 수 있다. 우측 그림은 carry save multiplier를 도식화한 그림이다. 본 실험에서는 carry save multiplier를 구현할 것이며, multiplier의 마지막 stage에 사용되는 final adder를 지난 실험에서 구현했던 22bit ripple carry adder를 이용할 것이다. 2. Timing Diagram 구현한 22x22 carry save multiplier의 동작을 테스트하기 위해 테스트벤치 코드를 이용해 파형을 확인하였다. 사전에 만들어진(주어진) 총 100개의 vector data를 이용해 정상 동작 여부를 확인한 결과 모든 vector data가 multiplier의 출력과 파형이 일치하였다. 따라서 회로가 올바르게 동작함을 확인할 수 있었다. 더불어, 입출력단에 연결된 flipflop들에 의해 입력 후 한 클럭 늦게 출력이 나왔다. 3. Synthesize result 합성 후 22x22 carry save multiplier의 block diagram은 위와 같았다. 입력단의 flipflop(a_in, b_in)과 출력단의 flipflop(result)으로 인해 입출력이 클럭과 동기화되고 있음을 확인할 수 있었다. CSM22_RCA모듈을 확대해보면 위와 같이 22개의 ADD22모듈과 22개의 22x1 MUL22모듈(22bit의 피연산자를 다른 피연산자의 각 bit와 AND연산)로 이루어져있고, 마지막에는 ripple carry adder가 final adder로써 연결되어있음을 확인할 수 있었다. 각 ADD22모듈, MUL22모듈(22x1 multiplier)와 RCA(RCA22모듈)를 확대한 모습은 순서대로 위의 세 그림과 같았다. 4. Timing Report & Critical Path 클럭 주기를 초기에 20.0ns로 설정 후 점차 낮추어가며 회로가 동작할 수 있는 가장 빠른 클럭을 찾아보았다. 각 클럭 주기에 대한 slack값과 state는 아래와 같았다. 클럭 주기(ns) Data required time(ns) Slack State 20.0 19.50 0.00 MET 18.0 17.52 0.00 MET 16.0 15.52 -1.89 VIOLATED 17.0 16.50 -0.53 VIOLATED 17.5 17.02 0.00 MET 17.3 16.82 -0.61 VIOLATED 17.4 16.92 0.00 MET 따라서, 본 회로가 동작할 수 있는 가장 낮은 클럭 주기는 17.4ns이고, 약 57.5MHz의 클럭에서 가장빠르게 작동할 수 있다는 것을 확인할 수 있었다. 이때의 timing report는 아래와 같았다. Timing report에 의하면 본 회로의 critical path는 아래와 같다. [a_in 22nd bit] -> [mul02(MUL22모듈)] -> [add02(ADD22모듈)] -> [add03(ADD22모듈)] -> ... -> [add21(ADD22모듈)] -> [r00(RCA모듈; final adder)의 fa3 ~ fa1] -> [result(출력)] MUL22모듈을 통해 두 번째 피연산자의 한 비트와 곱해진(AND연산된) 뒤, 22개의 adder stage를 지나고 마지막으로 final adder를 지나는 경로가 critical path임을 확인할 수 있었고, 이는 [3. Synthesize result] 에서도 회로에 표시된 붉은 선으로 확인해볼 수 있었다. 5. Area Report Multiplier는 수많은 full adder들을(최소 28²개) 포함하고 있기 때문에 지난 실험들에 비해 굉장히 큰 면적을 차지함을 알 수 있었다. 이는 지난 실험에서의 22bit ripple carry adder보다 9.4배 큰 면적이다. 따라서 multiplier가 동일 bit의 adder에 비해 훨씬 많은 면적을 차지함을 알 수 있었다. 6. Power Report 회로의 사용 전력은 8.1261mW임을 확인할 수 있었다. 이는 지난 실험에서의 22bit ripple carry adder보다 73% 증가한 수치이다. 따라서 multiplier가 동일 bit의 adder에 비해 두배 가까운 전력을 소모함을 알 수 있었다. #실험2 : 22x22 Carry Save Multiplier (SRCS in the last stage) 1. 개요 지난 실험들에서 알아본 바와 같이 ripple carry adder는 carry propagation으로 인해 큰 delay가 발생한다. 따라서 실험I에서 구현한 carry save multiplier의 final adder를 ripple carry adder가 아닌 square root carry select adder로 사용한다면 회로가 더 빠른 속도로 동작할 수 있다. 본 실험에서는 final adder를 square root carry select adder로 교체하고 실험1 에서의 결과와 비교한다. 2. Timing Diagram 구현한 22x22 carry save multiplier의 동작을 테스트하기 위해 테스트벤치 코드를 이용해 파형을 확인하였다. 사전에 만들어진(주어진) 총 100개의 vector data를 이용해 정상 동작 여부를 확인한 결과 모든 vector data가 실험1, 실험2에서 구현한 multiplier의 출력과 파형이 일치하였다. 따라서 회로가 올바르게 동작함을 확인할 수 있었다. 더불어, 입출력단에 연결된 flipflop들에 의해 입력 후 한 클럭 늦게 출력이 나왔다. 3. Synthesize result 합성 후 22x22 carry save multiplier의 block diagram은 위와 같았다. 입력단의 flipflop(a_in, b_in)과 출력단의 flipflop(result)으로 인해 입출력이 클럭과 동기화되고 있음을 확인할 수 있었다. Final adder의 교체 외에는 모든 구조가 동일하기 때문에 이는 실험1 에서의 block diagram과 동일하다. CSM22_SCA모듈을 확대해보면 위와 같이 22개의 ADD22모듈과 22개의 MUL22모듈(22bit의 피연산자를 다른 피연산자의 각 bit와 AND연산)로 이루어져있고, 마지막에는 square root carry select adder가 final adder로써 연결되어있음을 확인할 수 있었다. SCA(SCA22모듈)를 확대한 모습은 순서대로 위와 같았다. ADD22, MUL22모듈 등 final adder를 제외한 모든 모듈은 실험1과 같으므로 생략하였다. 4. Timing Report & Critical Path 클럭 주기를 초기에 17.0ns로 설정 후 점차 낮추어가며 회로가 동작할 수 있는 가장 빠른 클럭을 찾아보았다. 각 클럭 주기에 대한 slack값과 state는 아래와 같았다. 클럭 주기(ns) Data required time(ns) Slack State 17.0 16.48 0.00 MET 16.0 15.51 0.00 MET 15.0 14.50 0.00 MET 14.0 13.50 -1.10 VIOLATED 14.5 14.02 -0.56 VIOLATED 14.7 14.20 0.08 MET 14.6 14.11 -0.74 VIOLATED 따라서, 본 회로가 동작할 수 있는 가장 낮은 클럭 주기는 14.7ns이고, 약 68.0MHz의 클럭에서 가장빠르게 작동할 수 있다는 것을 확인할 수 있었다. 이는 실험1과 비교했을 때 회로가 약 18% 빠르게 동작함을 의미한다. 또한 이때의 timing report는 아래와 같았다. Timing report에 의하면 본 회로의 critical path는 아래와 같다. [a_in 22nd bit] -> [mul01(MUL22모듈)] -> [add01(ADD22모듈)] -> [add02(ADD22모듈)] -> ... -> [add21(ADD22모듈)] -> [r00(SCA모듈; final adder)의 fa7 ~ fa10] -> [r00(SCA모듈; final adder)의 MUX(m4, m6, m9)] -> [result(출력)] MUL22모듈을 통해 두 번째 피연산자의 한 비트와 곱해진(AND연산된) 뒤, 22개의 adder stage를 지나고 마지막으로 final adder를 지나는 경로가 critical path임을 확인할 수 있었고, 이는 [3. Synthesize result] 에서도 회로에 표시된 붉은 선으로 확인해볼 수 있었다. 5. Area Report 실험1과 비교했을 때 면적이 소폭 증가한 것을 확인할 수 있었다. 이는 square root carry select adder가 ripple carry adder에 비해 더 넓은 면적을 필요로하기 때문이다. 회로 면적(μm²) 22x22 Carry save multiplier (with RCA) 206157.4 22x22 Carry save multiplier (with SCA) 213431.6 RCA 22021.7 SCA 24966.1 6. Power Report 실험1과 비교했을 때 사용 전력이 증가한 것을 확인할 수 있었다. 이는 square root carry select adder가 ripple carry adder에 비해 더 많은 전력을 필요로하기 때문이다. 회로 전력(mW) 22x22 Carry save multiplier (with RCA) 8.1261 22x22 Carry save multiplier (with SCA) 10.1381 RCA 4.6980 SCA 8.1276

반응형
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그