MPW/프로젝트

[MPW/프로젝트]4bit 부스 곱셈기 설계 및 칩 테스트(2)/MPW 설계 및 검증

Potato_Ongsimi 2024. 5. 26. 22:14

목차:

I. 서론

II. MPW 설계 및 검증

  II-1. 설계 환경 구축

  II-2. RTL 설계 & Functional verification

  II-3. Synthesize & Formal Verification

  II-4. FPGA Emulation

  II-5. Layout Generation & Verification

III. 완성 칩 테스트

  III-1. 완성 칩 제원

  III-2. 완성 칩 테스트

  III-3. 결과 분석

IV. 참여 소감 및 향후 계획


II. MPW 설계 및 검증

II-1. 설계 환경 구축

 학부생의 설계를 받아줄 foundry도 생겼고 비용도 무료이다. 하지만 직접 반도체를 설계하려고 보니 여전히 막막했다. 이유는 반도체 설계에 필수적인 EDA(Electronic Design Automation)가 필요하기 때문이. 설계 절차에 어떤 EDA가 필요한지 설계 전반에 대한 지식이 부족했다. 또한 판매용 반도체에 사용되는 상용 EDA는 매우 고가인 것도 문제가 되었다.

 이런 고민을 오픈소스 EDAQflow를 사용하는 것으로 해결했다. QflowOpenCircuitDesign의 설계 절차 도구이다. Qflow에는 설계 절차마다 필요한 EDA가 오픈소스 EDA로 구비되어있으며 이 도구들을 통합해 관리해준다. 내 칩(MY Chip) 서비스PDKQflow에 적용해 MPW를 설계했다. 설계한 디자인을 실제 생산 가능한 형태인 레이아웃(Layout)으로 변환하였고 Foundry에 제출했다. 오픈소스 EDA 설치는 이곳을 참조하여 설치했다.

Qflow 소속 EDA와 흐름도

 

 

II-2. RTL 설계 & Functional verification

 부스 곱셈(Booth’s Multiplication)은 비트에 연속된 1을 변형하여 부분 곱을 줄인 알고리즘이다. 4bit 입력을 가지는 부스 곱셈기를 HDL(Hardware Description Language)인 베릴로그(Verilog)를 사용해 레지스터 전송 수준(RTL, Register-Transfer Level)로 설계하였다.

 해당 디자인은 두 개의 4bit 입력을 갖기 때문에 가능한 입력조합이 많지 않다. 따라서 경우의 수를 전부 확인하여 검증해야겠다고 생각했다. 하지만 RTL 시뮬레이터를 통해 나오는 파형으로 모든 조합의 입력에 대한 출력의 유효성을 확인하는 것은 쉽지 않은 일이라고 생각했다.

Functional Verification block diagram

 베릴레이터(Verilator)verilog로 기술된 디자인을 시스템씨(SystemC) 모델로 변환해준다. SystemC는 하드웨어 설계 검증을 위한 C++ 라이브러리이다. 부스 곱셈기 verilog 모델을 systemc 모델로 변환하여 검증을 진행했다. C++는 파일입 출력이 간편하므로 테스트벤치(Test Bench)에서 모든 입력조합을 파일형태로 제공할 수 있다. 출력 결과는 파형이 아닌 시험 기준(Golden reference)과 비교하여 일치 여부만을 확인한다. 위 사진은 기능 검증(Functional Verification)의 구조를 도식화한 것이다.

 

SystemC test bench 상세구조

SystemC TB sturcture

//executable spec.
sc_int<8> golden_reference(uint32_t x, uint32_t y){
	sc_int<4> x_in = 0x0F & x;
	sc_int<4> y_in = 0x0F & y;
	sc_int<8> z_out = x_in * y_in;
	return z_out;
}

두개의 signed 4bit 곱셈에 대한  Golden reference

 

 Systemc로 작성한 test bench의 구조는 위와 같다. sc_gen_test.h에서 0~255까지의 test vector를 만든다. 이 1바이트(Byte)값을 둘로 쪼개어 두개의 4bit test vector로 사용했다. 이렇게 하는 것으로 모든 입력 조합에 대한 검증을 진행할 수 있다. test vector를 DUT에 넣고 valid신호가 나올 때까지 클럭을 준다. valid신호가 1이 될 때, sc_monitor.h에서는 DUT의 output을 캡처하고 executable spec과 출력값을 비교한다.

테스트 예시(좌)와 테스트 결과(우)

 

II-3. Synthesize & Formal Verification

 설계한 RTL 디자인을 합성(Synthesize)하여 추상 단계를 낮춘다. 합성의 결과로 논리 게이트 사이의 연결 관계가 기술된 ASIC(Application-Specific Integrated Circuit)용 넷리스트(Netlist)를 얻게된다. Yosys Synthesizer를 통해 합성을 진행했다. Synthesizer를 통해 얻은 netlist의 검증을 두 가지로 진행했으며 이 문단에선 첫 번째 경우인 ASIC 용 netlist의 검증에 대하여 다룬다. 

 Yosys Synthesizer를 사용하기 위해 원하는 공정의 기술파일(Tech File)을 옵션으로 제공한다. Yosys는 해당 공정의 표준-셀 라이브러리(Std-cell Library)를 활용하여 합성을 진행한다. 합성의 결과로 나온 netlist는 Std-cell간의 연결관계로 기술되어있다. Functional verification때와 마찬가지로 Verilator를 사용해 systemc로 모델링된 파일을 가지고 검증을 진행한다.이때 검증 대상이 모델링된 파일인 VBOOTH.h만 RTL 모델에서 합성 이후의 구조적(Structural) 모델로 바꾸어준다. test bench의 다른 부분은 그대로 재사용 가능하다(Test Bench Reuse). 

Formal Verification added block diagram

 

II-4. FPGA Emulation

 Synthesis하여 얻은 netlist의 검증을 위한 두 번째 방법는 FPGA(Field Programmable Gate Array) 에뮬레이션이다. Yosys 합성기는 합성 결과로 FPGAnetlist도 만들어준다. 같은 합성기를 사용하는 것으로 ASICnetlist와 등가의 FPGAnetlist를 얻을 수 있다. FPGAnetlist를 프로그래밍하고 아두이노 Due 보드를 사용하여 FPGAPC 사이의 통신을 매개했다. 이때 systemc의 디자인 모듈은 아두이노 Due를 통해 연결된 FPGA를 감싸는 싸개(Wrapper) 파일을 사용한다. 검증 대상만 외부에서 구현되었을 뿐이므로 test bench reuse가 가능하다.

FPGA Emulation added block diagram

 

FPGA Emulator

 

https://youtu.be/YXQTr-VnFp4?si=LWV6pamgmTy_TpCo

4bit Booth multiplier FPGA emulation

 

아두이노 통신 상세구조
  •  establishContact() : 아두이노 보드에서 시리얼로 'A'를 쓴다. 이 'A'를 VBOOTH.h에서 읽고 다시 'A'를 보낸다. 이 'A'를 아두이노 보드에서 시리얼로 읽는 것을 성공하면 통신이 시작된다.
  •  RxPacket(): 시리얼 버퍼로 부터 2byte를 읽는다. 첫 번째 byte 는 클럭과 리셋을 포함한 컨트롤 신호가 들어가고 두번째 byte에는 4bit 입력 데이터 2개를 읽어온다. 
  •  TxPacket(): 시리얼 버퍼로 2byte를 쓴다. 첫 번째 byte에는 valid 신호를 보내고 두 번째 byte에는 출력 데이터를 보낸다.
  • loop(): RxPacket() , TxPacket()를 계속 반복한다.
VBOOTH.h wrapper 상세구조

 

  • wait(clk.posedge_event()) : test bench의 입력 데이터를 읽어서 버퍼에 쓴다. 버퍼의 값을 읽어서 출력으로 내보낸다.
  • wait(clk.negedge_event()) : clk값을 0으로하여 버퍼에 쓴다.
  • SC_CTOR : 리눅스는 주변 장치를 파일로 취급한다. 따라서 파일에 읽고 쓰는 것을 통해 주변 장치에 접근할 수 있다. VBOOTH4.h의 모델 constructor에 주변 장치 접근을 위한 파일 포인터 선언와 기타 설정을 해준다. establishContact()을 위한 'A' 송수신도 여기에 정의한다.

II-5. Layout Generation & Verification

 Netlist의 검증이 마무리되었으므로 layout을 생성한다. 생성된 layout의 유효성을 검증하기 위해서 LVS(Layout vs. Schematic)를 진행한다. 이때 기준이 되는 회로도(Schematic)는 합성기를 통해 얻은 netlist이다.

 만들어진 layout에 대하여 DRC(Design Rule Check)를 진행한다. 내 칩(MY Chip) 서비스제공 공정은 레이어(Layer)간 연결 통로인 비아(Via)의 적층을 금지한다. 따라서 적층된 via들을 layout에서 찾아내고 수정한다. 또한 다른 DRC 문제들도 수정한다.

 레이아웃을 수정했기 때문에 더 이상 유효성을 보장할 수 없다. 따라서 LVS를 통해 검증된 layoutDRC를 완료한 layout과 연결 관계를 비교한다(LVL, Layout vs. Layout). 해당 작업을 반복하는 것으로 layout 생성을 완료할 수 있다. 최종 layout에 패드를 연결하고 GDS 파일로 변환하는 것으로 설계를 마무리하게 된다. 이때 남는 공간이 있다면 자신만의 그림을 반도체 기판에 그려넣는 칩 아트(Chip Art) layout을 추가할 수도 있다. 아래는 최종 layout으로 디자인 코어와 chip art를 확인할 수 있다.

최종 Layout

 


아래 글들을 참조하여 작성했습니다.