검색어 Project_6502에 대한 글을 날짜를 기준으로 정렬하여 표시합니다. 관련순 정렬 모든 글 표시
검색어 Project_6502에 대한 글을 날짜를 기준으로 정렬하여 표시합니다. 관련순 정렬 모든 글 표시

2024년 1월 26일 금요일

ETRI 0.5um CMOS Std-Cell DK 예제: CPU 6502 [목차/맺음말]

ETRI 0.5um CMOS Std-Cell DK 예제: CPU 6502

목차

I. 개요

[1부]
II. 시스템 수준 테스트 벤치
    II-1. Apple-1 컴퓨터 시스템 모델
    II-2. 6502 CPU의 베릴로그 RTL

[2부]
    II-3. 베릴로그 RTL과 SystemC/C++의 결합
        simulation/sc_CPU_6502_Top.h
        simulation/obj_dir/Vcpu.h
        simulation/mti_sim/CPU_6502.h
        simulation/mti_sim/Vcpu.h
        베릴레이터의 언어 변환(Language Translation) 시뮬레이터
        QuestaSim의 동적 링크(Dynamic Linking) 시뮬레이터

    II-4. 동기식 메모리 모델
        simulation/sc_mem.h
        simulation/sc_mem.cpp

    II-5. Apple-1 컴퓨터
        simulation/sc_main.cpp

[3부]
    II-6. Apple-1의 표준 입력 장치: 키보드
        simulation/a1_keyboard.cpp
        Apple-1의 입력용 PIA: 메모리 매핑된 키보드 포트

    II-7. Apple-1의 표준 출력장치: 디스플레이
        simulation/a1_display.cpp
        Apple-1의 출력용 PIA: 메모리 매핑된 디스플레이 포트

III. 6502 CPU 기능적 검증
    III-1. 모니터 프로그램
        WozMon

    III-2. Apple-1 시뮬레이터 빌드
        simulation/Makefile

    III-3. Apple-1 시뮬레이터 실행
        Apple-1 메모리에 응용 프로그램을 적재하는 방법
        6502 C 컴파일러
        좀더 검증, Applesoft BASIC

    III-4. HDL 과 SystemC의 병행 시뮬레이션(Co-Simulation)
        QuestaSim 의 SystemC
        simulation/mti_sim/compile_fun.do
        Verilator vs. QuestaSim HDL simulator

IV. 6502 CPU 베릴로그 합성
    IV-1. 유한 상태 기계(FSM)
    IV-2. CPU의 명령 디코더
    IV-3. Yosys의 FSM 합성기
    IV-4. 합성 후 네트 시뮬레이션

V. 자동 배치와 배선
    V-1. 자동 배치
    V-2. 네트리스트 파일 형식
    V-3. 자동 배선

VI. 레이아웃 검증
    VI-1. 배선 후 얻은 DEF
    VI-2. LVS 레이아웃 검증
    VI-3. 겹친 접점(Stacked VIA) 검사
        DEF 에서 Magic 레이아웃 변환
        LVS: 배선 후 레이아웃 네트리스트 vs 합성 후 네트리스트 비교
    VI-4. 디자인 룰 검사

VII. 실습요약

-----------------------------------------------------------------------

VIII. 맺음말

6502 CPU는 70년대 중반에 생산되기 시작하여 Apple-1 컴퓨터를 비롯하여 다양한 컴퓨터와 게임기에 사용되었다[바로가기]. 50년전의 CPU를 이제와서 다시 설계하는 이유는 설계기법과 환경의 어떻게 변했는지 살펴보기 위함이다. 사실 반도체를 전자회로로 따진다면 달라진 것은 없다고 해도 과언은 아니다. 다만 칩 당 집적되는 규모의 급격한 증가(회로의 트랜지스터 갯수로 따져 본다면 수천개에서 수억개로 늘었다)에 따른 제조 및 설계 비용이 관건이다. 설계시간과 비용의 압박을 극복하고자 여러 기법이 등장하고 자동화 도구들의 발전해왔다. 그중에서도 하드웨어 기술 전용 언어[바로가기]를 사용한 반도체 설계 기법은 이제 일반화 되었고 소프트웨어 개발용이라고 알려진 일반 컴퓨팅 언어들도 반도체 설계와 검증의 용도로 사용된다[바로가기]. 컴퓨팅 언어보다 높은 추상화 수준의 시스템 모델링 도구들도 사용되고 있다. 화려한 외양을 갖춘 고가의 시스템 검증 도구들은 언듣 보기에 멋져 보일지 모르지만 융통성이 매우 적다. 많은 것을 할 수 있다고 하지만 정작 하려면 할게 없다. 결국 또다른 언어로 귀결될 것이다.

시스템의 일부로 사용될 하드웨어를 설계할 때 짜여진 순서에 의거한 시험은 불완전한 시험이 될 수 있다. 하드웨어 설계가 우선인 여건(개발시간의 압박, 제한된 인력 투입 등)에서 실제 적용될 시스템에서 일어날 돌발 상황을 모두 고려한 시스템 모델을 만들어내기 어렵다. 하드웨어 기술 언어는 고도의 시스템 모델을 구현하기에 적합하지 않다. 이를 극복하기 위해 다양한 시스템 모델링 도구가 상용화 되어 있긴 하지만 하드웨어 기술 언어와 큰 격차를 좁히기 어렵다. 시스템 모델링이라고 표방하는 도구들의 실체를 보더라도 코드 생성기(IP generator)라고 봐야 할 것이다.

소프트웨어 제작 기술이 발전하여 이종 언어간 혼합 실행 기법이 널리 활용되는 지금 굳이 어렵게 하드웨어 언어로 테스트 벤치 작성하는 일은 줄어들고 있다. 하드웨어 언어는 설계에 집중하고 시스템 수준 검증도구로 C/C++를 활용하는 추세다. 하드웨어 언어에 C/C++의 연결이 표준화 되었으나 반도체 설계자들은 오히려 역사 깊은 C/C++ 언어에 대한 이해가 부족한 실정이다. 이는 화려한 외양을 갖춘 시스템 설계 도구들이 등장하는 이유이기도 하다.

6502는 반세기 전의 CPU 이긴 하나 오늘날의 정보산업 사회를 연 시발점이라고 해도 과언이 아니다. C 언어 컴파일러를 비롯하여 수많은 개발도구, 응용 프로그램이 등장 했다. 본 예제는 RTL 베릴로그로 기술된 CPU를 검증 하기위한 테스트 벤치로 SystemC를 이용하여 47년전 발매된 Apple-1 컴퓨터 시뮬레이터를 제작하였다. 하드웨어의 시스템 수준 모델링을 위해 C++ 프로그래밍 언어의 크래스 라이브러리로 개발된 SystemC를 사용하였다. HDL과 SystemC의 병행 시뮬레이션(Co-Simulation)이다. Apple-1 시뮬레이터는 발매당시 탑재되었던 워즈니악의 모니터 프로그램을 수정 없이 실행 될 뿐만 아니라 어셈블러, C 컴파일러에서 생성된 2진 코드를 실행 시킬 수 있다. Applesoft의 BASIC 바이너리도 완벽히 실행된다. 예제의 Apple-1 시뮬레이터는 높은 추상화 수준의 SystemC/C++를 이용하면 시스템 수준 RTL 검증을 효과적(낮은 비용, 짧은 개발 기간)으로 수행 할 수 있음을 보여준다.

시스템 수준 검증이 완료된 6502 CPU의 RTL 베릴로그는 오픈 소스 도구들 만을 사용하여 GDS까지 생성한다. 합성기로서 Yosys, 지동 배치와 배선에 GrayWolf와 QRouter 그리고 레이아웃 편집, 디자인 룰 검사, 그리고 GDS 생성 도구로 Magic이 사용 되었다. 합성전 기능 검증과 합성 후 네트리스트 시뮬레이션을 실시하였다. HDL과 SystemC의 병행 시뮬레이션에 상용 QuestaSim을 사용하고 오픈 소스 언어변환 도구인 베릴레이터(VERILATOR)와 비교하였다. 아울러 합성 네트리스트와 레이아웃 추출 네트리스트의 비교 LVS 도 수행 하였다. 대상 공정은 ETRI 0.5um CMOS 2P3M 이다. 표준 셀 라이브러리는 경희대학교 반도체 전공 트랙에서 개발한 디자인 킷을 활용하였다.

검증의 도구로서 분만 아니라 미래의 반도체 설계 언어로 C/C++가 도입되기 시작 했고 이를 RTL로 합성하는 자동화 도구 HLS (Hihg-Level Synthesis)들이 상용화 되었다. 이제 하드웨어 설계자 들도 RTL의 HDL에서 벗어날 때가 되었다. 오늘날 어셈블리언어로 소프트웨어를 개발하는 사례를 찾아볼 수 없듯이 하드웨어 설계도 곧 그런 시대가 될 것이다.

----------------------------------------------------------------------------

[이전 게시글 참조]

예제 실습: "Verilog RTL에서 GDS 레이아웃 까지"

1. SystemC 및 SDL2 라이브러리 빌드 하는 방법 [링크]

2. Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기 [링크]

3. Project_6502 예제의 기능적 Co-Simulation 실시 방법 [링크]

4. Project_6502 예제의 합성 후 Co-Simulation 실시 방법 [링크]

----------------------------------------------------------------------------

참고/웹 링크

[1] ETRI 0.5um STd-Cell Design Kit/KHU, https://fun-teaching-goodkook.blogspot.com/2023/12/etri-05u-cmos-v1a-2023-12-13.html

[2] KION 국가나노 인프라 협의체, https://kion.or.kr/

[3] KION 국가나노 인프라 협의체, 내칩 MPW, https://mpw.kion.or.kr/

[4] MOS Technology, https://en.wikipedia.org/wiki/MOS_Technology

[5] MOS 테크놀로지 6502, https://namu.wiki/w/%EB%AA%A8%EC%8A%A4%20%ED%85%8C%ED%81%AC%EB%86%80%EB%A1%9C%EC%A7%80%206502?from=6502

[6] Retro Computing/Apple-1 Replica, http://retro.hansotten.nl/6502-sbc/apple-1/

[7] Apple-1 Replica,"Insanly Great", https://www.apple-1-replica.com/

[8] [넥슨컴퓨터박물관] 애플I 소장품 실제 구동영상 (Apple1, AppleⅠ), https://www.youtube.com/watch?v=TgKgH5abLfg

[9] Arlet's 6502 Github, "A Verilog HDL version of the old MOS 6502 CPU.", https://github.com/Arlet/verilog-6502

[10] SystemC, https://systemc.org/

[10a] C/UNIX Functions for VHDL Testbenches, http://bear.ces.cwru.edu/VHDL/doc/snug2002_20040606_slides.pdf

[10b] SystemC, Bridge the Gap, https://drive.google.com/file/d/11MSOZ4e592zwhy8jXRqmM6qg1AiMCfcd/view?usp=sharing

[10c] 시스템 수준 언어: SystemC & SystemVerilog, https://drive.google.com/file/d/11fQKIcAC78B5gLcw-FZkJ800B1PV7o3B

[11] Steve Wozniak, https://en.wikipedia.org/wiki/Steve_Wozniak

[12] ICARUS Verilog, https://steveicarus.github.io/iverilog/

[13] Icarus Verilog, Wikipedia, https://en.wikipedia.org/wiki/Icarus_Verilog

[14] iVerilog 동영상, https://www.youtube.com/results?search_query=icarus+verilog+iverilog

[15] VERILATOR, https://www.veripool.org/verilator/

[16] Co-Simulation, https://en.wikipedia.org/wiki/Co-simulation

[17] What is Cosimulation ?, https://opensimulationplatform.com/co-simulation/

[18] QuestaSim Advanced Simulator, https://eda.sw.siemens.com/en-US/ic/questa/simulation/advanced-simulator/

[19] Intel QuestaSim FPGA Edition, https://www.intel.co.kr/content/www/kr/ko/software/programmable/quartus-prime/questa-edition.html

[20] Hardware Description Language, https://en.wikipedia.org/wiki/Hardware_description_language

[21] OpenROAD Project Publications, https://theopenroadproject.org/publications/

[22] The Linux Programming Interface: A Linux and UNIX System Programming Handbook, https://en.wikipedia.org/wiki/The_Linux_Programming_Interface, [e-Book]

[23] High-Level Synthesis, https://en.wikipedia.org/wiki/High-level_synthesis

[24] Integrating SystemC Models with Verilog and SystemVerilog Models Using the SystemVerilog Direct Programming Interface, https://sutherland-hdl.com/papers/2004-SNUG-Europe-paper_SystemVerilog_DPI_with_SystemC.pdf

[25] Towards Automatic High-Level Code Deployment on Reconfigurable Platforms: A Survey of High-Level Synthesis Tools and Toolchains, https://ieeexplore.ieee.org/abstract/document/9195872

[26] HLS Blog, https://hls-goodkook.blogspot.com/2021/08/ug871-xilinx-high-level-synthesis.html

[27] WozMon, http://retro.hansotten.nl/6502-sbc/apple-1/

[28] cc65 C-Compiler for 6502, https://www.cc65.org/

[29] Verilog BASIC, Intel, https://youtu.be/PJGvZSlsLKs?si=-DU-GBL5oDlex0G_

[30] Verilog HDL 입문 8시간 완성, https://youtu.be/HcdlkMI54Vg?si=LMxz8U-LbaNKa3lC

[31] SystemVerilog DPI, https://en.wikipedia.org/wiki/SystemVerilog_DPI

[32] Tutorial On DPI, https://github.com/adki/DPI_Tutorial

[33] Xilinx Synchronous RAM Timing, https://docs.xilinx.com/r/en-US/am007-versal-memory/NO_CHANGE-Mode-DEFAULT

[34] Apple-1 Operation Manual, http://retro.hansotten.nl/uploads/apple1/APPLE%20I_Operation%20Manual.pdf

[35] Inter-Process Communication, https://en.wikipedia.org/wiki/Inter-process_communication

[36] GNU Make 강좌, https://doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make.html#toc1

[37] Intel HEX, https://en.wikipedia.org/wiki/Intel_HEX

[38] 6502 Instructions, https://www.cs.otago.ac.nz/cosc243/pdf/6502Poster.pdf

[39] Synopsys' Open-Source Liberty Format to Incorporate On-Chip Variation Extensions, https://news.synopsys.com/index.php?s=20295&item=123415

[40] Liberty Timing File, https://redirect.cs.umbc.edu/~cpatel2/links/641/slides/lect05_LIB.pdf

[41] Finite State Machine, https://en.wikipedia.org/wiki/Finite-state_machine

[42] High Level Synthesis FSM, https://users.ece.utexas.edu/~gerstl/ee382v-ics_f09/lectures/lecture_9.pdf

[43] Instruction Cycle, https://en.wikipedia.org/wiki/Instruction_cycle

[44] Microprocessor Design, WikiBooks, https://en.wikibooks.org/wiki/Microprocessor_Design

[45] State Machine Coding Styles for Synthesis, http://www.sunburst-design.com/papers/CummingsSNUG1998SJ_FSM.pdf

[46] QFlow 1.4 Reference Manual, http://opencircuitdesign.com/~tim/programs/qflow/reference.html

[47] Fast Prototyping of a Deep Neural Network on an FPGA, IEEE Xplore, https://ieeexplore.ieee.org/document/9333030

[48] FINN: A Framework for Fast, Scalable Binarized Neural Network Inference, https://arxiv.org/abs/1612.07119

[49] Tutorial (ISFPGA'2021): Neural Network Accelerator Co-Design with FINN, https://youtu.be/zw2aG4PhzmA?si=mEvtFU988UW5lZ5

[50] Machine Learning on FPGA, https://www.youtube.com/watch?v=4MBbV2gKE98&list=PLGzeDuLmmxDpEsCAjf_sYrMC6p-Y0Ummk

[오픈 소스 반도체 설계도구]

[1] QFlow, http://opencircuitdesign.com/qflow/index.html

[2] OSS CAD Suite (Yosys/iVerilog & etc.), https://github.com/YosysHQ

[3] GrayWolf: 표준 셀 자동 배치 도구, git://github.com/rubund/graywolf

[4] QRouter: 표준 셀 자동 배선 도구, http://opencircuitdesign.com/qrouter/index.html

[5] Magic: VLSI 레이아웃 그리기 및 파일 변환, http://opencircuitdesign.com/magic/index.html

[6] irsim: 스위치 수준 시뮬레이터, http://opencircuitdesign.com/irsim/index.html

[7] Netgen: LVS 검증도구, http://opencircuitdesign.com/netgen/index.html

[8] XSchem: 회로 입력 도구, https://github.com/StefanSchippers/xschem

[9] ngSpice: SPICE 회로 시뮬레이터, https://ngspice.sourceforge.io/

[10] gtkWave: 디지털 회로 파형 VCD 보기, https://gtkwave.sourceforge.net/

[11] KLayout: VLSI 레이아웃 툴, https://www.klayout.de/

[12] SystemC, https://systemc.org/

[13] ICARUS Verilog, https://steveicarus.github.io/iverilog/

[14] VERILATOR, https://www.veripool.org/verilator/

[15] 반도체 설계 오픈 소스 도구, https://fun-teaching-goodkook.blogspot.com/2024/01/etri-05um-cmos-std-cell-dk.html


2023년 12월 30일 토요일

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [4]/합성(Synthesis)

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [4]

IV. 합성(Synthesis)
    IV-1. RTL 합성기의 역활
    IV-2. Yosys 합성기로 예제의 RTL 합성
    IV-3. Yosys 합성 스크립트
    IV-4. Yosys 합성 로그
    IV-5. 합성 후 검증(Post-Simulation)
            a. 테스트벤치 재사용(Testbench Re-Use)
            b. 커버리지 및 프로파일링 (Coverage & Profiling)
            c. 타이밍 시뮬레이션 (Timing Simulation)
            d. 무 지연 시뮬레이션(Zero Delay Simulation)

----------------------------------------------

IV. 합성(Synthesis)

추상적인 알고리즘을 기술할 때 자연언어(natural language), 혹은 계통도(block diagram)나 플로우 차트(flow chart)를 사용한다. 하지만 컴퓨팅 기계에서 읽히기 위해서는 단순하면서 매우 엄격한 형식을 취해야 한다. 알고리즘을 기계에서 작동 시킬 수 있는 최적의 형태로 바꾸려면 엄청난 수고가 든다. 설계자동화 도구(Design Automation Tools)는 이 변환을 수행해 주는 소프트웨어다. 자동화 소프트웨어에게 일을 시키기 위해서 엄격한 문법을 가진 언어를 사용한다. 소프트웨어 개발용 언어로 C/C++, 파이썬 Python 등이 있으며 하드웨어 개발용 언어로는 베릴로그 Verilog와 VHDL 등이 있다.

합성도구는 기능 시뮬레이션을 완료한 베릴로그 RTL을 표준 셀(standard cell)들의 연결도(schematic netlist[link])로 변환 한다. 표준 셀 라이브러리는 공정에서 제공하는 논리 회로들의 부품목록과 사양서다. 논리회로 부품(각종 게이트와 플립플롭)의 논리기능(function)과 부품의 물리적 특성(면적, 입출력 타이밍, 지연)들이 기록되어 있다.

IV-1. RTL 합성기의 역활

합성기는 공정에서 제공 할 수 있는 논리회로 부품의 종류를 모아 놓은 '리버티(Liberty)'라는 형식의 파일을 참조하여 상위 추상화 수준에서 표현된 설계를 하위 수준의 논리회로들의 연결관계로 변환한다. '리버티'는 논리 회로 부품의 기능(function)은 물론 입출력 핀의 방향, 차지하는 면적(부품의 크기), 소모전력 등 물리적 특성들(characterizations)을 기록해 놓은 라이브러리 화일의 형식이다. 리버티 파일 형식은 합성기 도구를 공급하는 시놉시스 사(Synopsys Inc.[link])에서 제안하고 공개하여 널리 쓰이게 된 후 표준이 되었다[link]. [Liberty Timing Format][Liberty UG & RM]

리버티 형식의 예로 AOI(AND-OR-INV) 논리 셀을 기술 한 예는 아래와 같다. 면적(area), 입출력 핀의 방향, 커페시턴스와 시간 지연(timing), 소모전력(power), 그리고 입력 핀과 출력 핀의 관계를 표현한 기능(function) 등이 기록되어 있다.

    cell (AOI21X1) {
    area : 288;
      cell_leakage_power : 0.0702509;
      pin(A)  {
        direction : input;
        capacitance : 0.0323272;
        rise_capacitance : 0.0320917;
        fall_capacitance : 0.0323272;
      }
      pin(B)  { ...... }
      pin(C)  { ...... }
      pin(Y)  {
        direction : output;
        ......
        function : "(!((A B)+C))";
        timing() {
          related_pin : "A";
            ......
          }
          fall_transition(delay_template_5x5) { ...... }
          cell_rise(delay_template_5x5) { ...... }
          rise_transition(delay_template_5x5) { ...... }
            ......
        internal_power() {
          related_pin : "A";
          fall_power(energy_template_5x5) {
            ......
          }
          ......
        }
      }
    }

[주] 리버티 파일에 기록된 각종 물리량들은 반도체 공정의 조건에 맞춰 도출 된다. 예제에서 사용한 경희대학교 개발 ETRI 0.5um CMOS 디자인 킷[링크]은 정확한 공정 물리량을 반영하지 않는다. 반도체 설계 교육용 라이브러리로서 기능만 유효하다.

합성기는 단순한 언어적 번역을 넘어과 묘사된 행위(bahavior)로 부터 논리회로 혹은 조합회로를 판단 해 내고(inference) 최적화(optimization) 한다. 라이브러리에 부품의 다양한 물리적 특성들을 담고 있기에 합성기는 논리회로의 기능적 변환 뿐만 아니라 회로가 구성 되었을 때 동작 속도, 전력 소모량, 칩의 크기를 예측 할 수 있다. 합성기의 첫번째 목표는 논리회로로 변환하는 것이지만 동작 속도의 예측도 이에 못지 않게 중요하다. 동작속도에 따라 반도체 칩의 회로 구성이 달라진다. 합성 시 동작 속도의 조건을 주는 방법(명령)은 사용할 합성도구 마다 다를 수 있다. 합성을 마친 후 이 동작 속도 조건은 이어지는 배치와 배선 도구(동작 속도는 배선 선로의 지연에도 영향을 받는다)에서도 사용 될 수 있기에 도구들 사이의 호환될 필요가 있다. 이에 시놉시스사는 합성 조건을 주는 방식을 제안하였고 이 구문이 널리 쓰이게 되어 표준이 되었다. 이를 SDC(Synopsys Design Constraint) 형식이라 한다[SDC format/AP][SDC AP/Actel][SDC File in VLSI].

IV-2. Yosys 합성기: 예제의 RTL 합성

합성기 도구는 시놉시스 사의 디자인 컴파일러가 독보적이었다. 컴파일러(혹은 합성기)의 제작은 기술 난이도가 매우 높아 소수의 첨단 자동화 그룹(회사)이 전담 했다. 하지만 수많은 연구를 통해 컴파일러 제작 기술이 발전하여 오픈-소스 소프트웨어들도 기존의 상용 제품을 능가 하는 수준에 이르럿다. 소프트웨어 개발용 C/C++ 언어의 오픈-소스 컴파일러인 GCC 는 오히려 산업표준에 이를 정도가 되었다. 하드웨어 언어 컴파일러도 이에 못지 않은 수준에 이르럿고 그 대표적인 합성기가 Yosys다[YosysHQ][Yosys Reference Manual][Yosys Presentation]. Yosys는 반도체 설계 프로젝트에 널리 활용 되고 있다[link][link][link][link].

QFlow 체계에서 Yosys 합성기를 동원하여 예제 ALU 베릴로그 RTL 을 합성하는 명령은 아래와 같다. 먼저, 합성 할 베릴로그 RTL은 source 에 있다.

    % ls source
    total 8
    -rw-r--r-- 1 goodkook goodkook 2514 Dec 16 09:16 ALU.v
    -rw-r--r-- 1 goodkook goodkook 1542 Dec 16 09:05 ALU_wrapper.v

합성기가 만들어내는 수많은 중간 파일들과 결과 파일들을 저장할 폴더 synthesis를 만든다.

    % mkdir synthesis

QFlow 명령줄에서 합성 실행은 다음과 같다.

    % qflow synthesize --tech etri050 ALU_wrapper

위의 명령은 QFlow가 합성(synthesize)의 단계를 수행하면서 대상 공정(--tech)을 etri050으로 지정 하였으며 베릴로그 RTL의 최상위 모듈명은 ALU_wrapper 임을 알려 주고 있다. QFlow의 합성은 source 폴더의 베릴로그를 읽어 합성 스크립트 ALU_wrapper.ys 를 생성하고 Yosys를 실행하여 이를 수행한다. 합성기의 입력은 RTL 베릴로그 이며 출력은 네트리스트다.

[QFlow]Running yosys for verilog parsing and synthesis
    yosys  -s ALU_wrapper.ys
    =========================
    ./source/ALU_wrapper.v
    ./source/ALU.v
      |
+-----V-------------------------+
|Yosys: RTL Synthesis         <---- [ETRI050's Std-Cell Liberty]
|    -> SPICE Netlist for LVS  ---->./synthesis/ALU_wrapper.spc
|    -> Verilog Netlist        ---->./synthesis/ALU_wrapper.rtlbb.v
|         for P&R and Post-Sim  |
+---------------+---------------+
                |
                V
           Auto-Placement
    =========================
[QFlow]Running vlog2Verilog ......
Generating RTL verilog and SPICE netlist file in directory
 ./synthesis
Files:
   Verilog: ./synthesis/ALU_wrapper.rtl.v
   Verilog: ./synthesis/ALU_wrapper.rtlnopwr.v
   Verilog: ./synthesis/ALU_wrapper.rtlbb.v
   Spice:   ./synthesis/ALU_wrapper.spc

출력되는 네트리스트의 형식은 베릴로그와 SPICE다. 베릴로그 네트리스트는 기능 시뮬레이션 검증용 및 배치배선용으로 생성되며 SPICE 네트리스트는 배선 후 레이아웃 검증 LVS 용이다.

QFlow 를 처음 실행하면서 지정한 기본 설정 사항을 담은 파일이 생성된다. 그중 'project_vars.sh' 에는 자동화 도구들의 명령줄 실행 옵션이 기록된다.

IV-3. 합성 스크립트

RTL 합성의 결과로 표준 셀의 네트리스트(netlist)를 출력하게 되는데 형식은 구조적 베릴로그(structural Verilog)다. 회로의 행위 묘사는 없이 표준 셀을 하위 모듈로 두고 입출력 연결만을 기술 한다. 구조적 베릴로그 네트리스트는 다시 DEF(Design Exchange Format[link]) 형식으로 변환 되어 자동 배치와 배선 도구의 입력으로 쓰이게 된다. 아울러 레이아웃 검증 LVS 용 SPICE 네트리스트를 생성하는데 사용된다.

QFlow의 합성 명령을 실행하면 ./source 폴더에 Yosys 합성기용 스크립트를 생성하고 이를 작동 시킨다. QFlow 가 작성한 합성 스크립트는 다음과 같다. 리버티 라이브러리를 읽은 후 합성할 베릴로그를 읽어 문법적 결함과 합성 가능성을 확인한다. 이어 합성을 수행하게 되는데 조합회로(combinational logic)와 순차회로(sequential logic)으로 분리하고 디지털 논리식을 만들어 최적화를 반복한다. 최적화된 논리식은 공정에서 제공한 셀들로 치환(technology mapping)된다. 끝으로 베릴로그 네트리스트를 저장 한다.

    # Synthesis script for yosys created by qflow
    read_liberty -lib -ignore_miss_dir -setattr blackbox \
              <...>/etri050/tech/etri05_stdcells.lib
    read_verilog <...>/source/ALU_wrapper.v
    read_verilog 
<...>/source/ALU.v

    # High-level synthesis
    synth -top ALU_wrapper

    # Map register flops
    dfflibmap -liberty \
                 <...>/etri050/etri05_stdcells.lib
    opt

    # Map combinatorial cells, standard script
    abc -exe /usr/local/share/qflow/bin/yosys-abc \
        -liberty <...>/etri050/etri05_stdcells.lib \
        -script \
            +strash;scorr;ifraig;retime,{D};\
                strash;dch,-f;map,-M,1,{D}

    flatten
    setundef -zero
    clean -purge

    # Output buffering
    iopadmap -outpad BUFX2 A:Y -bits

    # Cleanup
    opt
    clean
    rename -enumerate

    write_verilog  ALU_wrapper_mapped.v
    stat

[주] Yosys의 합성 스크립트가 매우 단순하다. 위 스크립트에서 회로의 동작속도를 높이기 위해 클럭 신호를 지정하고 주기를 선언하는 명령은 보이지 않는다. 논란이 될 수 있긴 하나 상용 합성기들이 주장하는 시간-구동 합성(time-driven synthesis)이 극적인 효과를 보여 준다고 보지 않는다. 합성 단계에서 create_clock 같은 합성 조건(symthesis constraint)으로 효과를 기대하기 보다 합성된 회로를 타이밍 분석한 후 RTL 단계에서 수정 하는 편이 현명할 것이다. 레지스터 사이의 경로가 노출되어 있는 RTL에서 합성기가 조합회로의 자원 분배(resource sharing) 기법을 동원하는 것은 고도의 지능을 요하기에 제한적이다. 클럭 지정 명령으로 긴 조합회로의 경로를 쥐어짜기 보다 시간 분석의 용도로 사용하는 편이 옳을 것이다. RTL 보다 높은 수준의 고위 합성(HLS, High-Level Synthesis) 방법론에서는 클럭 레이턴시(clock latency)를 조건으로 사용한다. 하지만 RTL의 경우 합성기가 레이턴시를 조정하면 않된다. RTL과 합성된 회로 사이에 클럭 순서마다 동작이 달라져서는 않되기 때문이다. 배치와 배선 단계에서 발생 하는 선로지연의 불균형이 큰 문제가 되므로 시간-구동 배치(timing-driven placement[link])에 더 많은 노력을 기울이는 편이 좋다. Yosys 합성기에는 create_clock 같은 시간 조건 명령은 없다. Yosys 합성기는 기능의 측면에서 논리식 추론과 최적화에 집중한다.

IV-4. 합성 로그

컴파일러가 배출해 놓는 로그 파일은 매우 방대해서 그 내용을 모두 파악 하기는 어렵다. 사실 그럴 필요도 없다. 로그 파일을 취급하는 요령이 개발자의 수준이라고 할 수 있다. 가장 먼저 따져봐야 할 사항은 문론 합성 실패이다. 이미 기능 시뮬레이션을 실시 하였으므로 합성하려는 베릴로그 원시 파일에 문법적 오류는 없다. 하지만 베릴로그 언어의 구문 중 합성 가능한 구문은 일부분에 지나지 않는다. 낮은 추상화 수준으로 전이 하면서 행위 수준과 동작이 다를 수 있다. 예를 들어 "의도치 않은 래치(Accidental Latch)"는 흔히 범하는 범하는 실수다. 합성기는 합성이 불가한 구문 뿐만 아니라 논리회로로 전환되었을 때 상이한 동작이 우려되면 경고를 낸다. 그 다음으로 살펴야할 합성 실패는 기술 매핑(technology mapping)이다. 행위수준 베릴로그 구문에서 변환된 논리식은 대상 공정에서 제공할 수 있는 셀로 대체된다. 이때 논리식을 구성한 요소가 공정에서 제공 가능한 셀에 없을 경우가 있다.

의도치 않은 래치로 인해 기술 매핑에 실패하는 예는 아래와 같다.

    always @*
    begin
        if (iOutSel)
            oACC = ACC;
    end

선택 구문의 제어신호 iOutSel가 '0'인 경우 oACC의 할당 값이 없다. 전자회로에 할당 값이 없다는 뜻은 이전 값의 '유지'를 의미하며 이는 메모리 소자다. 선택 구문의 제어신호 iOutSel은 클럭으로 지정 되지도 않았으로 엣지 트리거 플립플롭도 아니다. 결국 oACC는 레벨 감응 래치(level sensitive latch)다. 위의 래치가 생성된 구문은 오류가 없을 뿐만 아니라 합성도 가능하다. 다만 설계자의 의도 이거나 불완전한 멀티플렉서(MUX, multiplexer)를 표현 하려다 실수한 경우로 볼 수 있다. 이에 대해 합성기는 플립 플롭이 아닌 래치가 있었음을 알려준다.

    4.2.8. Executing PROC_DLATCH pass (convert process syncs to latches).
    Latch inferred for signal `\ALU_wrapper.\oACC' from process
        `\ALU_wrapper.$proc$ALU_wrapper.v:50$2': <......>

클럭 신호의 상승 엣지 트리거 플립 플롭이었다면,

    always @(posedge clk or posedge reset) begin
        if (reset)
            rCmd <= 0;
        else
            rCmd <= iAB;
        end
    end

다음과 같이 알려준다.

    4.2.9. Executing PROC_DFF pass (convert process syncs to FFs).

    Creating register for signal `\ALU_wrapper.\rCmd' using process
        `\ALU_wrapper.$proc$ALU_wrapper.v:26$1'.
      created $adff cell `$procdff$89' with positive edge clock and
            positive level reset.

합성기는 설계자의 의도를 살피지 않고 구문으로부터 충실히 래치를 만들어 낸다. 합성기의 내부 논리식 표현은 최적화를 실시한 후 공정에서 제공하는 라이브러리의 셀로 대체 시키는데 이를 '공정기술 매핑'이라 한다. 만일 공정의 라이브러리에 등가 기능을 가진 셀이 없을 경우 빈 공란으로 남겨둔다. 이런 기술 매핑이 실패 하더라도 Yosys 합성기는 까다롭게 굴지 않고 존재하지 않는 셀에 $ 표시를 해 놓는다. 이렇게 생성된 네트리스트는 다음 단계인 자동 배치 과정에서 없는 셀 이라며 오류를 낼 것이다.

    13. Printing statistics.
    === ALU_wrapper ===
       Number of wires:                265
       Number of wire bits:            311
       Number of public wires:         265
       Number of public wire bits:     311
       Number of memories:               0
       Number of memory bits:            0
       Number of processes:              0
       Number of cells:                297
         $_DLATCH_P_                     8
         AND2X2                          5
         AOI21X1                        12
         AOI22X1                        12
         BUFX2                           8
         DFFPOSX1                        8
         DFFSR                          24
            <......>

합성 로그를 살펴보면 Yosys 합성기가 어떻게 작동 하는지 알 수있다. 합성 로그 파일은 ./log/synth.log 다. 작동 중 발생한 오류에 대한 대응은 물론 통합도구인 QFlow의 표준 옵션보다 세밀한 옵션을 주어야 하는 경우도 있다. 자동화 도구의 로그를 읽어보면서 이 도구가 어떻게 작동 하는지 살펴보기로 한다.

합성기의 입력은 당연히 RTL 베릴로그다. 공정에서 제공할 수 있는 셀의 종류를 모아놓은 리버티 형식의 라이브러리를 먼저 읽어들인다.

    -- Executing script file `ALU_wrapper.ys' --
    1. Executing Liberty frontend:
        /usr/local/share/qflow/tech/etri050/etri05_stdcells.lib
        Imported 39 cell types from liberty file.

RTL 베릴로그를 읽어 구문 분석과 합성기 내부 형식구문으로 변환 한다. 최상위 모듈부터 하위 모듈까지 찾아 읽어 들인 후 합성기 내부 형식(AST, RTLIL)으로 재구성한다.

    2. Executing Verilog-2005 frontend: /ALU8/source/ALU_wrapper.v
        Parsing Verilog input from `/ALU8/source/ALU_wrapper.v' to AST representation.
        Generating RTLIL representation for module `\ALU_wrapper'.
        Successfully finished Verilog frontend.
    3. Executing Verilog-2005 frontend: ALU.v
        Parsing Verilog input from `ALU.v' to AST representation.
        Generating RTLIL representation for module `\ALU'.
        Successfully finished Verilog frontend.

합성을 수행한다.

    4. Executing SYNTH pass.
    4.1. Executing HIERARCHY pass (managing design hierarchy).
    4.1.1. Analyzing design hierarchy..
        Top module:  \ALU_wrapper
        Used module:     \ALU

계층 구조를 구성하는데 필요한 하위 모듈이 모두 확보되면 프로세스(processes)를 처리한다. 베릴로그의 경우 always 에 해당하는 순차구문 영역(procedural block)내 행위를 분석하여 조합 논리식과 플립플롭 회로를 추론해 낸다. 이때 불완결한 병렬선택문(case statement)에서 불요조건(don't-care)의 판별등을 포함한다.

    4.2. Executing PROC pass (convert processes to netlists).
    4.2.1. Executing PROC_CLEAN pass (remove empty switches from decision trees).
    Cleaned up 0 empty switches.
    4.2.2. Executing PROC_RMDEAD pass (remove dead branches from decision trees).
    Removed 1 dead cases from process $proc$ALU.v:70$11 in module ALU.
    Marked 1 switch rules as full_case in process $proc$ALU.v:70$11 in module ALU.
    $proc$/ALU8/source/ALU_wrapper.v:50$2 in module ALU_wrapper.
    Marked 2 switch rules as full_case in process
    $proc$ALU8/source/ALU_wrapper.v:26$1 in module ALU_wrapper.
    Removed a total of 2 dead cases.

순차구문 블럭 내의 연속된 할당문의 병합, 초기화 문, 비동기 및 동기 리셋을 찾아내고,

    4.2.3. Executing PROC_PRUNE pass (remove redundant assignments in processes).
        Removed 0 redundant assignments.
        Promoted 5 assignments to connections.
    4.2.4. Executing PROC_INIT pass (extract init attributes).
    4.2.5. Executing PROC_ARST pass (detect async resets in processes).
        Found async reset \reset in
            `\ALU_wrapper.$proc$/ALU8/source/ALU_wrapper.v:26$1'.

병렬 선택문(case~switch statement)에서 ROM 형식으로 바꿀 수 있는지 찾고 조건문(if-statement)를 검사한다.

    4.2.6. Executing PROC_ROM pass (convert switches to ROMs).
        Converted 0 switches.
        <suppressed ~6 debug messages>
    4.2.7. Executing PROC_MUX pass (convert decision trees to multiplexers).
        <......>
        Creating decoders for process
         `\ALU_wrapper.$proc$/ALU8/source/ALU_wrapper.v:26$1'.
             1/3: $0\rCmd[7:0]
             2/3: $0\rB[7:0]
             3/3: $0\rA[7:0]
        <......>

구문의 행위 모사로부터 메모리 소자(래치와 플립 플롭)들을 추론(inference)해 낸다.

    4.2.8. Executing PROC_DLATCH pass (convert process syncs to latches).
        No latch inferred for signal `\ALU_wrapper.\oACC' from process
            `\ALU_wrapper.$proc$/ALU8/source/ALU_wrapper.v:50$2'.
    4.2.9. Executing PROC_DFF pass (convert process syncs to FFs).
        <......>
        Creating register for signal `\ALU.\CO' using process
            `\ALU.$proc$ALU.v:96$23'.
          created $dff cell `$procdff$70' with positive edge clock.
        <......>

RTL 베릴로그에서 디지털 논리식 추론이 완료된 후 논리식의 유효성을 검사하고,

    4.5. Executing CHECK pass (checking for obvious problems).

조합회로와 순차회로로 나눠 최적화를 실시한다.

    4.6. Executing OPT pass (performing simple optimizations).

    4.6.1. Executing OPT_EXPR pass (perform const folding).
        <......>
    4.6.2. Executing OPT_MERGE pass (detect identical cells).
        <......>
    4.6.3. Executing OPT_MUXTREE pass (detect dead branches in mux trees).
        <......>
    4.6.4. Executing OPT_REDUCE pass (consolidate $*mux and $reduce_* inputs).
        <......>
    4.6.5. Executing OPT_MERGE pass (detect identical cells).
        <......>
    4.6.6. Executing OPT_DFF pass (perform DFF optimizations).
        <......>

논리식 최적화에 이어 유한 상태 머신(FSM, Finite State Machine)을 검출하고 최적화 한다. 이번 예제 ALU8에는 FSM 모델이 없지만 마이크로 프로세서의 실행 유닛같은 복잡한 제어회로에 반드시 포함되는 중요한 요소다. RTL 합성기의 핵심 기능 중 하나인 FSM 검출 및 최적화 기능을 갖추고 있다는 점은 Yosys 합성기의 성숙도를 보여준다고 하겠다.

    4.7. Executing FSM pass (extract and optimize FSM).
    4.7.1. Executing FSM_DETECT pass (finding FSMs in design).
    4.7.2. Executing FSM_EXTRACT pass (extracting FSM from design).
    4.7.3. Executing FSM_OPT pass (simple optimizations of FSMs).
    4.7.4. Executing OPT_CLEAN pass (remove unused cells and wires).
    4.7.5. Executing FSM_OPT pass (simple optimizations of FSMs).
    4.7.6. Executing FSM_RECODE pass (re-assigning FSM state encoding).
    4.7.7. Executing FSM_INFO pass (dumping all available information on FSM cells).
    4.7.8. Executing FSM_MAP pass (mapping FSMs to basic logic).

Yosys가 회로 밀집도가 높은 산술논리연산 부분(데이터 패스, Data-Path)을 따로 처리할 수 있다 는 점도 눈에 띈다. 만일 공정에서 산술 연산용 매크로셀을 제공한다면 이에 대응할 수 있다. 예제 ALU는 산술 연산으로 덧셈기를 사용한다. 디자인 킷에 전가산기(Full-Adder) 셀을 가지고 있다.

    4.12. Executing ALUMACC pass (create $alu and $macc cells).
        Extracting $alu and $macc cells in module ALU:
          creating $macc model for $add$ALU.v:91$19 ($add).
          merging $macc model for $add$ALU.v:92$21 into 
                    $add$ALU.v:92$22.
        <......>
        $auto$alumacc.cc:485:replace_alu$113
            created 4 $alu and 0 $macc cells.
        Extracting $alu and $macc cells in module ALU_wrapper:
          created 0 $alu and 0 $macc cells.
        <......>

자원 공유(resource-sharing) 기능도 수행한다. Yosys의 실제 성능을 평가하기는 이르지만 합성기로서 수행해야 할 일을 모두 수행하고 있다.

    4.13. Executing SHARE pass (SAT-based resource sharing).

자원 공유(resource sharing) 처리 후 한번 더 최적화를 수행 하고

    4.14. Executing OPT pass (performing simple optimizations).

고집적 메모리를 추출 한다. FPGA 처럼 내부 블럭 메모리를 제공하는 경우 매우 유용하다.

    4.15. Executing MEMORY pass.

메모리 블럭을 제공하지 않는 경우 논리회로로 메모리 영역을 묶는다. 이는 배치배선에 효과적일 수 있다.

    4.18. Executing MEMORY_MAP pass (converting memories to logic and flip-flops).

RTL 로부터 논리회로 변환과 최적화를 마치면 대상 공정에서 제공한 표준 셀로 대체하는 기술 매핑(tech-mapping)을 수행한다.

    4.20. Executing TECHMAP pass (map to technology primitives).

공정에서 제공하는 셀에 맞추기 위한 논리식 합성은 버클리 검증 및 합성 연구 센터(Berkeley Verification and Synthesis Research Center)의 ABC 합성기를 사용한다[link].

    4.25. Printing statistics.
        <......>
    === design hierarchy ===
       ALU_wrapper                       1
         ALU                             1
       Number of wires:                251
       Number of wire bits:            365
       Number of public wires:          44
       Number of public wire bits:     151
       Number of memories:               0
       Number of memory bits:            0
       Number of processes:              0
       Number of cells:                270
         $_ANDNOT_                      81
         $_AND_                          7
         $_DFFE_PP0N_                   16
         $_DFFE_PP0P_                    8
         $_DFFE_PP_                     12
         $_MUX_                         29
         $_NAND_                        10
         $_NOR_                         20
         $_NOT_                         21
         $_ORNOT_                        5
         $_OR_                          33
         $_XNOR_                        16
         $_XOR_                         12

합성기 내부에 다양한 종류의 플립-플롭이 있지만 공정의 라이브러리에는 이를 모두 제공하지 않기 때문에 논리식을 추가하여 대응 시켜준다.

    5. Executing DFFLIBMAP pass (mapping DFF cells to sequential cells from liberty file).
      cell DFFNEGX1 (noninv, pins=3, area=864.00) is a direct match for cell type $_DFF_N_.
      cell DFFPOSX1 (noninv, pins=3, area=864.00) is a direct match for cell type $_DFF_P_.
      cell DFFSR (noninv, pins=5, area=1584.00) is a direct match for cell type $_DFFSR_PNN_.
      final dff cell mappings:
        \DFFNEGX1 _DFF_N_ (.CLK( C), .D( D), .Q( Q));
        \DFFPOSX1 _DFF_P_ (.CLK( C), .D( D), .Q( Q));
        unmapped dff cell: $_DFF_NN0_
        unmapped dff cell: $_DFF_NN1_
        unmapped dff cell: $_DFF_NP0_
        unmapped dff cell: $_DFF_NP1_
        unmapped dff cell: $_DFF_PN0_
        unmapped dff cell: $_DFF_PN1_
        unmapped dff cell: $_DFF_PP0_
        unmapped dff cell: $_DFF_PP1_
        unmapped dff cell: $_DFFSR_NNN_
        unmapped dff cell: $_DFFSR_NNP_
        unmapped dff cell: $_DFFSR_NPN_
        unmapped dff cell: $_DFFSR_NPP_
        \DFFSR _DFFSR_PNN_ (.CLK( C), .D( D), .Q( Q), .R( R), .S( S));
        unmapped dff cell: $_DFFSR_PNP_
        unmapped dff cell: $_DFFSR_PPN_
        unmapped dff cell: $_DFFSR_PPP_

대체한 플립-플롭의 등가성을 확인해본다.

    5.1. Executing DFFLEGALIZE pass (convert FFs to types supported by the target).
    Mapping DFF cells in module `\ALU':
      mapped 12 $_DFF_P_ cells to \DFFPOSX1 cells.
    Mapping DFF cells in module `\ALU_wrapper':
      mapped 24 $_DFFSR_PNN_ cells to \DFFSR cells.

조합회로에 대하여 다시 ABC를 실행 하여 공정에서 제공하는 셀들로 매핑하고 최적화된 결과를 얻는다.

    7. Executing ABC pass (technology mapping using ABC).
        <......>
    7.1. Extracting gate netlist of module `\ALU' to `<abc-temp-dir>/input.blif'..
    Extracted 225 gates and 261 wires to a netlist network with 36 inputs and 14 outputs.
    7.1.2. Re-integrating ABC results.
    ABC RESULTS:           OAI22X1 cells:        1
    ABC RESULTS:            MUX2X1 cells:        1
    ABC RESULTS:           XNOR2X1 cells:        3
    ABC RESULTS:            XOR2X1 cells:        3
    ABC RESULTS:            AND2X2 cells:        5
    ABC RESULTS:           NAND3X1 cells:        9
    ABC RESULTS:             INVX1 cells:       25
    ABC RESULTS:             OR2X2 cells:        5
    ABC RESULTS:           AOI22X1 cells:       13
    ABC RESULTS:           AOI21X1 cells:       15
    ABC RESULTS:           NAND2X1 cells:       45
    ABC RESULTS:            NOR2X1 cells:       11
    ABC RESULTS:           OAI21X1 cells:       65
    ABC RESULTS:        internal signals:      211
    ABC RESULTS:           input signals:       36
    ABC RESULTS:          output signals:       14

    7.2. Extracting gate netlist of module `\ALU_wrapper' to `<abc-temp-dir>/input.blif'..
    Extracted 46 gates and 95 wires to a netlist network with 49 inputs and 33 outputs.
        <......>
    7.2.2. Re-integrating ABC results.
    ABC RESULTS:            AND2X2 cells:        3
    ABC RESULTS:            NOR2X1 cells:        1
    ABC RESULTS:             INVX1 cells:       24
    ABC RESULTS:           NAND3X1 cells:       16
    ABC RESULTS:           OAI21X1 cells:       29
    ABC RESULTS:           NAND2X1 cells:       22
    ABC RESULTS:        internal signals:       13
    ABC RESULTS:           input signals:       49
    ABC RESULTS:          output signals:       33

계층적 구조를 평활화 하고,

    8. Executing FLATTEN pass (flatten design).
    Deleting now unused module ALU.

초기화 되지 않은 값은 0으로 잡는다. HDL은 다중치 논리를 적용한다. 베릴로그는 4치 (0, 1, X, Z)체계다. 실제 회로는 0과 1값 만을 가질뿐이다. 실제 전자회로에 X (error, don't-care)나 Z(float)는 있을 수 없다. 적어도 풀-업(pull-up) 또는 풀-다운(pull-down) 되어야 한다. CMOS 는 0(GND) 또는 1(VDD) 에 붙어야 한다.

    9. Executing SETUNDEF pass (replace undef values with defined constants).
    Removed 0 unused cells and 362 unused wires.

합성 결과를 베릴로그 네트리스트로 저장한다.

    12. Executing Verilog backend.
    12.1. Executing BMUXMAP pass.
    12.2. Executing DEMUXMAP pass.
    Dumping module `\ALU_wrapper'.

최종적으로 설계에 동원된 회로의 목록을 나열하면 다음과 같다. 모두 공정에서 제공하는 셀들로 구성되어 있다.

    13. Printing statistics.
    === ALU_wrapper ===
       Number of wires:                308
       Number of wire bits:            354
       Number of public wires:         308
       Number of public wire bits:     354
       Number of memories:               0
       Number of memory bits:            0
       Number of processes:              0
       Number of cells:                340
         AND2X2                          8
         AOI21X1                        15
         AOI22X1                        13
         BUFX2                           8
         DFFPOSX1                       12
         DFFSR                          24
         INVX1                          49
         MUX2X1                          1
         NAND2X1                        67
         NAND3X1                        25
         NOR2X1                         12
         OAI21X1                        94
         OAI22X1                         1
         OR2X2                           5
         XNOR2X1                         3
         XOR2X1                          3

Yosys에 의한 합성은 여기까지다. QFlow는 추가 작업으로 전원 vdd와 gnd를 전역 신호로 바꾸고 합성기에서 저장했던 네트리스트 ALU_wrapper_mapped.v 에서 구동이 모자란 네트를 찾아 버퍼를 삽입하고 새로운 네트리스트 ALU_wrapper_sized.v를 만든다.

    vlogFanout -l 300 -c 75 -I ALU_wrapper_nofanout -s nullstring \
        -p <...>/etri050/etri05_stdcells.lib \
        -b BUFX2,CLKBUF1 -i A,A \
        -o Y,Y ALU_wrapper_mapped.v ALU_wrapper_sized.v

클럭 트리 합성 CTS(Clock Tree Synthesis)까지는 아니더라도 클럭 네트에 대한 고려와 과도하게 부하가 걸린 네트를 찾아 버퍼를 추가했다.

    Top internal fanout is 24 (load 1052.43) from node _26_,
    driven by INVX1 with strength 166.776 (fF driven at latency 300)
    Top fanout load-to-strength ratio is 6.31047 (latency = 1893.14 ps)
    Top input node fanout is 36 (load 986.695) from node clk.
    0 gates exceed specified minimum load.
    26 buffers were added.

다음 단계에서 사용될 자동 배치용 ALU_wrapper.rtlbb.v 및 기능검증 시뮬레이션 네트리스트 베릴로그와 배선후 LVS 검증용 SPICE 네트리스트 ALU_wrapper.spc를 생성한다.

    Running vlog2Verilog for antenna cell mapping.
    vlog2Verilog -c -p -v vdd -g gnd  -l <...>/etri050_stdcells.lef \
       -o ALU_wrapper.v ALU_wrapper_sized.v
    Generating RTL verilog and SPICE netlist file in directory
        .../ALU8/synthesis
    Files:
       Verilog: .../ALU8/synthesis/ALU_wrapper.rtl.v
       Verilog: .../ALU8/synthesis/ALU_wrapper.rtlnopwr.v
       Verilog: .../ALU8/synthesis/ALU_wrapper.rtlbb.v
       Spice:   .../ALU8/synthesis/ALU_wrapper.spc

합성 로그를 간략히 살펴 봤다. 합성기 Yosys가 비록 오픈-소스이긴 하나 메모리 검출, 데이터 패스, 유한 상태 머신 최적화 등 상용 도구에 못지 않는 기능을 갖추고 있다는 것을 알 수 있다. 교육용으로 손색이 없으며 본격 합성기에 적용하기 전에 분할된 설계단위에서 사전 검토용으로 충분히 활용할 수 있다.

IV-5. 네트리스트 시뮬레이션: 합성 후 검증

반도체 설계 자동화 도구는 결국 소프트웨어다. 합성기에도 잠재적 버그(오류 또는 실수)가 있을 수 있다. 따라서 합성의 결과로 출력된 네트리스트는 검증 되어야 한다. 더구나 행위 묘사에서 논리식으로 추상화 수준이 전이되었으므로 반드시 검증을 통해 기능적 등가성이 확인되어야 한다.

테스트벤치 재사용(Testbench Re-Use)

네트리스트 형식의 구조적 베릴로그를 DUT로 삼아 기능 검증에 사용했던 테스트 벤치를 그대로 사용하여 시뮬레이션을 실시한다. DUT로부터 동일한 출력을 얻게 되면  서로 다른 추상화 수준의 두 모델은 등가인 것으로 본다.

커버리지 및 프로파일링 (Coverage & Profiling)

기능 검증 단계에서 적용되었던 입력을 그대로 사용한다는 점을 기억하자. 시뮬레이터의 테스트 커버리지(test coverage)는 불완전한 입력으로 인한 시험 미결성을 측정해 준다. 베릴레이터는 테스트 커버리지 옵션을 사용할 수 있다[link]. 이에 덧붙여 C++의 코드 및 실행 프로파일러(profiler)를 사용하여 테스트 벤치의 완결성 뿐만 아니라 코드 효율, 회로의 사용 집중도 등을 간접적으로 측정 할 수 있다.

타이밍 시뮬레이션 (Timing Simulation)

합성기에서 출력된 구조적 베릴로그는 표준 셀의 외형만 있다. 시뮬레이션을 위해 내부 기능은 디자인 킷에 포함되어 제공된다. 디자인 킷에 제공되는 표준 셀의 베릴로그 모델은 기능에 더하여 셀 마다 지연특성을 포함한다. 이를 이용해 배선전 동작 속도를 분석해 볼 수 있다. 이를 합성 후 타이밍 시뮬레이션(Post-timing simulation)이라고 한다.

[주] 본 예제에서는 타이밍 시뮬레이션을 실시하지 않는다. 베릴레이터의 베릴로그 변환 기능 중 셀 프리미티브 지원이 미흡하기 때문이다. DK에 포함된 표준 셀들의 물리적 특성 중 시간 지연량이 유효하지 않지만 학습의 목적으로 상용 HDL 시뮬레이터 QuestaSim을 써서 타이밍 시뮬레이션을 실습해 볼 수 있다. 아래 링크의 관련 예제를 참조한다.

    "Project_6502 예제의 합성 후 Co-Simulation 실시 방법[링크]"

무 지연 시뮬레이션(Zero Delay Simulation)

기능 검증에서 사용했던 테스트벤치를 컴파일 할 때 행위를 묘사한 베릴로그 대신 합성으로 얻은 네트리스트 베릴로그 ../synthesis/ALU_wrapper.v 로 대체한다. 네트리스트에 존재하는 표준 셀은 외형만 있다. 따라서 표준 셀의 행위를 묘사한 베릴로그 khu_etri05_stdcells_func.v 를 포함 시킨다.

    $ verilator --sc -Wall --top-module ALU_wrapper --exe --build \
        ../../../digital_ETRI/khu_etri05_stdcells_func.v  \
        ../synthesis/ALU_wrapper.v sc_main.cpp


+----------------+                               +------------------+
|Verilog RTL ----|----------------+           +--| Executable Spec. |
+-----+----------+                |           |  +------------------+
      |              +------------V-----------V--------------+
      |              | Functional Simulation                 |
     (?)<<<<<<<<<<<<<<   VERILATOR: Verilog to C++ Converter |
      |              |              SystemC/C++ Testbench    |
      |              +------------------------+--------------+
+-----V-------------------------+             |
|Yosys: RTL Synthesis           |             |
|    -> SPICE Netlist for LVS   |             |
|    -> Verilog Netlist         |             |
|         for P&R and Post-Sim -|----+    [Testbench Re-Use]
+---------------+---------------+    |        |  sc_main.cpp
                |                    |        |
      +---------+     +--------------V--------V---------------------+
      |               |Post-Simulation <- SystemC Testbench         |
     (?)<<<<<<<<<<<<<<<  Syn. Netlist   :./synthesis/ALU_wrapper.v  |
      |               |  Std-Cell's Func:khu_etri05_stdcells_func.v |
      |               +---------------------------------------------+
      V
  Placement

컴파일로 얻은 실행 파일을 실행시켜 행위 모형과 구조적 모형의 시뮬레이션 결과가 동일하다는 것을 확인한다.

----------------------------------------------

[목차][이전][다음]


2023년 8월 31일 목요일

2023년 8월 주간 강좌 및 주간 세미나 결과 보고

2023년 8월 주간 강좌 및 주간 세미나 결과 보고

경희대 반도체전공 트랙에서 2023년 8월 중 3회의 세미나 및 강좌를 주관 실시하였다. 이에 다음과 같이 보고함.

주관/작성자: 국일호 (goodkook@khu.ac.kr)

-------------------------------------------------------
목차

I. 주간 세미나/강좌
II. "내 칩(My Chip)" MPW 제작 신청
III. 총평
IV. 9월 계획
V. 제안
-------------------------------------------------------

I. 주간 세미나 및 강좌

- Verilog RTL 과 SystemC/C++ 테스트 벤치의 Co-Simulation을 예제 중심으로 소개 하고 자가실습 할 수 있도록 배포하였으며, 이에 따른 질문 과 토론을 가졌다.
- 정보통신 과학기술부 주관의 "내 칩(My Chip)" MPW 제작을 대비하여 합성과 레이아웃 생성까지 이어지는 설계 플로우를 시험 하였다.

    [1] "내 칩(My Chip)" MPW 제작 안내 및 툴 소개
        일시: 8월 10일
        시간: 오전 10시 30분/오후 1시
        장소: 전자정보대학관 211-2
        내용:
            - HDL Simulator "QuestaSim" 소개 및 사용법
            - SystemC 테스트벤치
            - Windows PIPE Inter-Process Communication
            - "내칩(My Chip) 제작 서비스"에 CMOS 디지털 회로 부분설명 및 참여자 확인
            - 오픈 소스 설계 툴 설명 (설치법)
            - QFlow Tutorial

    [2] 오픈 소스 표준 셀 기반 설계(2)
    일시: 8월 16일
    시간: 오전 10시 30분/오후 1시
    장소: 전자정보대학관 211-2
    내용:
        - 6502 RTL+SystemC/C++ Co-Simulation (실행 데모)
        - Pre- & Post-Simulation
        - 오픈 소스 툴 플로우 QFlow 시연
        - 예제 자가실습/수업 중 실연 및 질의응답
        - 독립심화학습 및 "MyChip 제작 서비스" 참여자 확인 팀 구성
            (CMOS 디지털 회로 부분)

    [3] "Verilog RTL 에서 레이아웃 GDS 까지"
    일시: 8월 24일
    시간: 오전 10시 30분
    장소: 전자정보대학관 211-2
    내용:
        - "Verilog RTL 에서 레이아웃 GDS 까지"
            표준 셀 기반 디지털 반도체 회로 설계의 후반 부 자동화 도구 리뷰
        - 툴 설치 및 자가 실습 후 토론

    Co-Simulation 예제 실습 목록:
    1) SystemC 및 SDL2 라이브러리 빌드 하는 방법
    2) Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기
    3) Project_6502 예제의 기능적 Co-Simulation 실시 방법
    4) Project_6502 예제의 합성 후 Co-Simulation 실시 방법

    [4] "내 칩(My Chip)" MPW 제작 신청서 작성 및 향후 일정/과정 설명
    일시: 8월 30일
    시간: 오전 10시 30분
    장소: 전자정보대학관 211-2
    내용:
    - MPW 제작 신청 6건
    - 신청서 제출 및 향후 일정 설명/설계에 사용할 툴 설명

II. "내 칩(My Chip)" MPW 제작 신청

정보통신 과학기술부 주관의 "내 칩(My Chip)" 과제 공모가 있었다.


공고문에 따르면 설계할 수 있는 칩의 면적이 1000x1000um 이며 0.5u CMOS 아날로그 회로만 예시 하고 있어서 이에 다음과 같이 문의 하였다.

    1. CMOS 공정 디지털 회로의 신청의 가능 여부.
    2. 설계 면적과 패키지 핀의 숫자가 너무 작다.
    3. 오픈 소스 툴의 사용 할 수 있도록 공정용 툴 킷을 제공 여부.

이에 대해 상세한 논의를 위해 공정 주관기관인 ETRI(한국전자통신연구소, 대전)을 방문하여 논의하였다. 위 문의에 대한 ETRI의 답변은 아래와 같다.

    1. CMOS 공정의 디지털 회로 응모도 가능하나 디지털 회로 합성용 툴 킷은 제공 할 수 없다. 표준 셀 라이브러리가 없기 때문이다. 타 학교에서도 이에 대한 문의가 일부 있었으며 현재 준비된 것은 없고 풀-커스텀 레이아웃 만 가능하기 때문에 아날로그 회로로 공지되었다.

    2. 교육용 목적의 아날로그 회로를 예상 하였기에 설계면적과 핀 수가 작게 되었다. 더 많은 설계응모를 수용하기 위한 것이다. 표준셀 기반 합성용 셀 라이브러리가 준비되면 이에 맞게 설계 면적을 늘리겠다. 공정은 기존에 운영되던 시설을 활용하는 것이지만 패키지는 추가비용이 든다. 패키지 비용이 높으므로 베어 칩만 제공 할 수 있다.

    3. 오픈 소스 툴에 대한 관심이 많은 것으로 알고 있고 교육용으로 유효하다는 데 동감한다. 하지만 현재 검토중이며 장담 할 수 없다.

    4. 그외, 현재 MPW 공정을 해줄 수 있는 교육용 파운드리는 ETRI, ISRC(서울대), GIST 세곳이며 이번 MPW는 ETRI의 총괄 아래 세곳의 공정을 표준화 하기 위한 테스트 용 이라고 함. ETRI측 회의 참석자는, 노태문 센터장, 박건식 책임, 원종일 선임.

위와 같은 공정측의 입장에 경희대학교에서는 아래와 같이 대응키로 하였다.

    1. CMOS 표준 셀 기반 디지털 회로로 제작 신청을 내겠다. 이에 필요한 셀 라이브러리는 자체 준비하여 이번 MPW에 신청 응모 하겠다. 타 학교에서도 이에 대한 요청이 있으므로 셀 라이브러리가 이번 MPW를 통해 실리콘 검증된다면 관련 정보를 모두 공개토록 하겠다.

    2. 작은 CPU 라도 칩의 설계 크기는 적어도 2000x2000um 정도는 되어야 한다. 최소한의 알고리즘(DSP, AI, ML 등)을 구현하기 위해서 라도 크기를 넓혀야 한다. 넓어진 설계면적을 수용해 준다면 패키지 비용은 반도체 전공 트랙 사업비로 충당 할 수 있다.

    3. 오픈 소스 툴을 검토한 결과 충분히 활용 가능한 수준이라고 판단한다. 이번 MPW 제작에 응모하면서 오픈 소스 설계 툴을 셋업하고 실리콘 검증까지 되로록 하겠다. 고가의 상용 툴을 사용하지 않고도 반도체 설계 교육과 MPW 응모가 가능하다. 설계 인력 양성에 도움이 될 것이다.

    4. MPW는 세곳의 교육용 팹을 가동하여 연 12회를 기획하고 있는바 경희대학교의 요청에 긍정적으로 대응해 주겠다는 답변을 받았고 아래와 같이 6개의 설계에 대하여 MPW 제작 응모 신청을 하였다.

    설계1. CMOS 공정의 디지털 회로 합성용 표준 셀 라이브러리
    설계2. 바렐 쉬프터 Signed-Digit 곱셈 및 누산기(Multiplier-Accumulator) 설계
    설계3. 8-bit CPU의 범용 산술논리 연산장치(ALU) 설계
    설계4. 부스 알고리즘 8비트 곱셈기(Booth Multiplier) 설계

    설계5. 8비트 CPU 6502 구현
    설계6. 8비트 CPU Z80 구현

설계1~4는 이번 MPW 공모에 부합하는 크기이나 설계5와 6은 이를 넘는 설계다. 설계 면적을 넓혀 달라는 요청의 의미로 응모하였다. 향후 MPW 제작 차수에 따라 디지털 회로의 설계 면적을 늘릴 수 있을 것이다.

III. 총평

세미나와 강좌에 참석하는 학생층의 수준이 고르지 못하여 이를 맞추는데 중점을 두었다. 방학중 특강이라 참석자 또한 불규칙 했다. 반복 설명을 포함해 다수의 예제를 제공하여 학생들 사이의 토론 유도가 효과가 있었다. 오픈 소스 툴을 적극 활용 하는 만큼 향후 자가실습을 강화하고 세미나 시간에는 질문과 토록이 주가 되어야 할 것이다.

IV. 9월 계획

9월중 실시될 강좌의 주안점은 "HLS(High-Level Synthesis)"다. 오늘날 C/C++의 고수준 언어로 작성되 알고리즘을 RTL 하드웨어로 합성하는 방향으로 진화하고 있다. HLS는 내일이 아니라 오늘의 설계 방법론이다. 학기 중 주간 세미나는 HLS 의소개, 강좌는 독립 심화 학습과 MPW 제작 관련으로 개최한다. 전용 강의실에서 이뤄진다. 운영과 실습에 관한 사항은 클래스 룸에 공지 될 것이다.

V. 제안

반도체 설계에 사용되는 소프트웨어의 특수성을 감안 해 전용 강의실을 구성할 계획이다. 전용 강의실은 반도체 설계의 시연, 토론의 장이 될 것이다. 아울러 실습을 위한 자재(FPGA 보드, 아듀이노 보드)를 구입하여 MPW 참여 학생들에게 제공하기로 한다. 프로토 타이핑 및 MPW 칩 테스트 베드를 구성에 필요한 FPGA와 마이크로 컨트롤러 보드는 MPW 참여 학생에게 지급을 목표로 한다.