2024년 3월 30일 토요일

SystemC는 여전히 최신 방법론인가?

SystemC는 여전히 최신 방법론인가?

반도체 설계에 언어가 사용된지 반세기가 지났다. 시스템 수준 설계 방법론 이라며 SystemC 를 제시한다. 새로운 컴퓨팅 언어를 다뤄야 한다면 그 부담이 크다. 내 분야가 아니라며 제쳐두던가 체계적인 학습을 기대하며 관련 학습 컨텐츠를 찾아보거나 교과서를 찾는다. 제쳐두면 당장 편할지 몰라도 미래는 없다. 학습을 원한다면 "체계적인"에 너무 집착하지 않기 바란다. 우리는 이미 컴퓨팅 언어에 익숙해 있다. 게다가 현재 컴퓨팅 실력이 체계적 교육의 결과였는지 되짚어보자. 관심과 연습의 결과였을 것이다. 예제를 찾아 적용해 보는 과정에서 실수를 반복하고 정정하는 과정에서 능력을 쌓아왔다. 컴퓨팅 언어의 예약어와 문법은 대동소이하다는 점을 알아두자. 하드웨어 언어와 소프트웨어 언어는 단지 구문의 실행 방식이 다를 뿐이다. 컴퓨터의 프로그램으로 병렬 실행을 모의하기 위해 사건기반의 콜백 함수 호출 기법(event drivel call-back)이 활용된다. 이는 컴퓨팅 언어의 특성이라기 보다 컴퓨터 운영체제와 인터럽트 서비스 같은 프로그래밍 기법의 이해가 필요하다. SystemC에 관한 각종 교육 컨텐츠는 많지만 '체계적'인 책은 많지 않다. 굳이 SystemC에 대한 체계적인 학습을 원한다면 아래의 책을 찾아보기 바란다.

System Design with SystemC, https://link.springer.com/book/10.1007/b116588

이 책은 2002년에 출판되었다. SystemC 가 1.0 때다(현재 3.0). SystemC의 를 원론적으로 설명한다. 시스템 수준 설계에 C++ 언어가 동원되고 병렬 시뮬레이션을 어떻게 모의하는지 설명한다. 하드웨어 언어 시뮬레이터의 원리를 이해할 수 있을 정도다. 여러명의 저자들에 의해 쓰여진 탓에 표현의 일관성이 흐트러져 아쉽다. 저자들은 모두 당시 현직 개발자들이었기 때문에 사용한 용어들이 어렵다. 한글 번역판[바로가기]이 있다. 번역판은 원 저자들과 서신을 주고 받으며 원문의 내용에 상당한 주석을 달았다. 도서관에 비치되어 있다면 굳이 구입할 필요 없다.

SystemC: From the Ground-Up, https://link.springer.com/book/10.1007/978-0-387-69958-5

SystemC 가 2.0으로 발전하며 표준화 된 이후 출판 되었다. 학습용으로 유용할 것이다. 초판의 한글 번역판[바로가기]이 출간 되었다. 초판에 애매한 부분이 상당히 있어서 번역본을 만들면서 저자와 교신하며 주석을 달았다. 현재 영문 책은 상당부분을 수정하여 2판이 나왔다. 서문에 초판 한글 번역자의 지적을 수정하였다고 밝히고 있다.

위의 책 외에도 SystemC를 설명한 책과 컨텐츠들이 다수 있다. 아쉽게도 SystemC를 마치 또다른 RTL 언어로 설명하고 그 수준에서 머무는 경향이 있다. SystemC는 시스템 수준의 모델링을 위해 활용될 때 그 가치를 찾을 수 있다. SystemC 는 C++ 그 자체다. 달리 말하면 하드웨어 설계를 위해 컴퓨터와 운영체제의 모든 요소를 활용 할 수 있다. 베릴로그 RTL로 설계한 6502 CPU를 검증하기 위해 Apple-1 컴퓨터를 SystemC로 모델링 한 예제가 있으니 살펴보기 바란다[바로가기].

SystemC가 표준화된지 20년이 지났음에도 쉽게 받아들여지지 않고 있는 이유는 방법론의 혁명성일지도 모른다. UCI(캘리포니아 대학교, 어바인) 2020년 대학원 강좌의 학습자료로 위에서 언급한 책들을 제시하고 있는 것을 보면 하드웨어 설계자(또는 교육자)들의 C++에 대한 이해부족(또는 게으름?)도 한몪한다.

https://newport.eecs.uci.edu/~doemer/w20_eecs222/syllabus.html

무려 20년전에 익혀둔 SystemC 를 변함없이 최신기법이라고 이야기 할 수 있는 것은 행운일까?

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


2024년 3월 28일 목요일

ETRI 0.5um CMOS DK 예제: FIR8 / [1] 알고리즘 및 병렬처리 구조 탐색

ETRI 0.5um CMOS DK 예제: FIR8

[1부] 알고리즘 및 병렬처리 구조 탐색

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

목차:

1. 개요

2. FIR 필터 알고리즘

    2-1. FIR 알고리즘의 언-타임드 모형 (Un-Timed C/C++ model)

    2-2. FIR 알고리즘의 타임드 모형(Timed C++/SystemC model)

        2-2-1. 타임드 모형 시뮬레이션 도구

        2-2-2. 언-타임드 모형의 구조 탐색

        2-2-3. 파이프라인 배열 구조 묘사

        2-2-3. 타임드 모형 테스트벤치

        2-2-5. 패드 제한(pad-limit) 검토

3. 예제 따라하기

4. 참고

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

1. 개요

내칩(My Chip) MPW에서 제공하는 칩은 크기는 제한되어 있다. 면적은 1900x1900um이며 패키지까지 제공 받으려면 28핀내에 설계되어야 한다[바로가기]. 디지털 설계의 경우 패드 라이브러리의 크기를 감안하면 코어의 설계 면적은 1000x1000um 이내로 제한된다. 이런 한도 내에서 구현할 수 있는 알고리즘은 많지않다. 경희대학교 반도체 전공 트랙에서 개발한 표준 셀 라이브러리 설계 키트[바로가기]를 사용했을 경우 8비트 가감산및 논리연산기와 3개의 8비트 레지스터, 8비트 곱셈기와 입출력 제어용 FSM을 넣을 수 있는 수준이다[바로가기].

규모있는 알고리즘을 구현하기 위한 방안으로 설계를 분할 하여 다수의 프로젝트를 지원해 보는 것도 한 방법이 될 수 있을 것이다. 또다른 방안은 파이프 라인 배열 구조로 구현하는 방법이다. 디지털 신호처리, 신경망[바로가기] 등의 알고리즘은 벡터 곱셈(콘볼루션)을 기초로 한다. 이 알고리즘들은 전형적인 병렬처리(Parallel Processing)/파이프라인(Pipeline)/배열연산기(Array Processing) 구조를 갖는다. MPW에서 10개 이상의 패키지된(!) 칩이 제공될 것으로 예상되므로 각 칩을 배열의 처리단위(PE, Processing Element)로 사용하는 방법이다.

[출처] https://youtu.be/GVsUOuSjvcg?si=D580dNr1eZ9mojgj&t=319

본 예제는 파이프라인 배열 구조에 적용될 디지털 FIR 필터[바로가기]의 PE다. MPW의 칩 제한 규정에 여유가 없으므로 8비트 부호없는 정수를 입력받아 처리하는 8탭 FIR 필터의 PE를 설계한다. 이렇게 느슨하게 설계된 필터의 용도는 매우 제한적이다. 좁은 대역폭을 갖는 SSB 음성 통신의 저대역 통과 필터로 사용할 수 있을 것이다[바로가기]. 예제의 원시 코드들의 깃-허브 저장소는 아래와 같다.

Git-Hub: https://github.com/GoodKook/ETRI-0.5u-CMOS-MPW-DK-Example--FIR8.git

깃-허브 저장소에서 예제의 소스코드들을 내려 받는 방법은 다음과 같다.

    ~$ cd
    ~$ git clone https://github.com/GoodKook/ETRI-0.5u-CMOS-MPW-DK-Example--FIR8.git
    ~$ cd ETRI-0.5u-CMOS-MPW-DK-Example--FIR8

깃-허브 원격 저장소는 원작자(그리고 허용된 참여자)에 의해 수시로 갱신된다. 그때마다 모두 내려받을 필요는 없다. 작업 폴더로 이동 한 후 원격저장소에서 갱신된 파일만을 내려 받는 git 명령은 pull 이다.

    ~$ cd
    ~$ cd ETRI-0.5u-CMOS-MPW-DK-Example--FIR8
    ~$ git pull


2. FIR 필터 알고리즘

FIR 필터의 '급수합' 알고리즘은 잘 알려져 있다[바로가기]. 이 알고리즘은 배열 구조 병렬처리에 적용되는 전형적인 예이기도 하다.


[출처] https://en.wikipedia.org/wiki/Finite_impulse_response

필터의 계수는 T-Filter 웹 도구[바로가기]를 통하여 구했다. 필터 탭의 계수가 갖는 수의 범위가 크지 않다.

위의 웹 도구를 통해 얻은 필터 계수를 활용한 C 코드는 다음과 같다.

    fir8.h

    fir8.cpp

필터를 시험하기 위한 테스트 벤치는 다음과 같다.

    fir8_tb.cpp

시험용 입력으로 몇가지 주파수를 갖는 신호에 백색 잡음을 혼합하여 생성하였다. 필터 알고리즘의 시험은 순수 C 프로그램 수준에서 실시한다. 하드웨어의 시간개념이 포함되지 않은 순수 C 코드로 작성된 모델을 "언-타임드(un-timed)" 라고 한다.

2-1. FIR 알고리즘의 언-타임드 모형 (Un-Timed C/C++ model)

개발 중 컴파일과 실행을 반복하게 된다. 그때마다 명령줄에서 매번 복잡한 옵션과 함게 명령입력을 해주려면 짜증나는 일이다. 메이크 유틸리티(make utility)를 사용하면 매우 유용하다[바로가기]. FIR 필터의 알고리즘 시험용 언-타임드 C 모델의 빌드와 실행을 용이하게 해줄 Makefile을 작성하였다.

    Makefile

필터 알고리즘 시험용 테스트 벤치는 한회에 4800개의 시계열 입력 자료를 생성하고 필터를 거친 출력을 얻는다. 수없이 나열된 숫자들을 보고 그 결과를 판단 할 수는 없다. 다양한 가시화 도구(visualization tools)를 갖춘 파이썬(Python)은 알고리즘 분석의 필수 도구다. FIR 필터 알고리즘을 시험한 결과를 시각화하기 위한 파이썬 코드는 아래와 같다.

    plotDFT.py

알고리즘의 언-타임드 시험을 해보자. C 모델이 저장된 폴더로 이동,

    ~$ cd
    ~$ cd cd ETRI-0.5u-CMOS-MPW-DK-Example--FIR8
    ~$ cd 0_algorithm/c_untimed

미리 만들어둔 메이크 파일로 컴파일 한다.

    ~$ make

그리고 실행,

    ~$ make run

필터를 거친 4800개의 숫자가 나열된다. 이들 숫자들을 보는 것으로 알고리즘의 결과를 확인해 보기는 불가능하므로 스펙트럼을 보며 필터 결과를 관찰해 보기로 하자. 집단지성의 덕분에 다양한 라이브러리들이 공개적으로 제공되는 파이썬은 알고리즘의 개발과 분석에 매우 효과적이다.  오늘날 컴퓨팅 언어로 가장 활용도가 높다[바로가기]. 파이썬의 도표 그리기 라이브러리는 matplotlib 다. 파이썬의 pip 도구를 사용해 라이브러리 추가 설치할 수 있다.

    ~$ python3 -m pip install -U matplotlib

파이썬 코드를 실행하여 필터링 된 출력 신호들의 주파수 파워 스펙트럼을 살펴보면 저역 필터의 효과를 확인 할 수 있다.


    ~$ make plot_fy

-------

2-2. FIR 알고리즘의 타임드 모형(Timed C++/SystemC model)

알고리즘을 하드웨어로 구현할 목적이라면 그에 맞게 레지스터 전송 수준(RTL, Register-Transfer Level)으로 기술되어야 한다. RTL에서는 클럭 단위로 하드웨어의 작동을 묘사한다. 아울러 각 객체들(신호선, 와이어)은 비트 단위로 상세히(clock/bit-detailed) 기술된다. 합성을 목표로 하는 경우 하드웨어 묘사는 추상화 수준이 낮은 RTL에서 이뤄진다. 하드웨어 언어는 기본적으로 동시작동 원칙에 절차적 행동을 묘사할 수 있는 장치를 갖추고 있지만 알고리즘의 개발과 시험에 사용할 만큼 높은 추상화 수준에 이르지 못한다. 게다가 동시실행성(concurrency)은 알고리즘 개발에 오히려 방해일 뿐이다.

2-2-1. 타임드 모형 시뮬레이션 도구

순수 C/C++ 는 컴퓨터에서 실행될 소프트웨어를 기술하는 언어로 컴퓨팅 언어의 최강자 자리에 있다. 진즉에 기계어(어셈블리어)를 밀어낸 C/C++는 폭넓은 추상화 수준을 수용할 수 있어서 응용 프로그램(application) 뿐만 아니라 운영체제(operating system), 장치 구동기(device driver) 제작에 사용된다. 하지만 하드웨어를 묘사할 수 있는 요소(동시실행과 절차성을 모두 함축한 클럭의 개념)를 갖추고 있지 않다.

최근 인공지능과 함께 연산전용의 (범용 컴퓨터에 비해 낮은 클럭으로 작동하는 저전력) 고성능 컴퓨팅 수요가 증가하고 있다. 대용량 FPGA를 보조 연산장치로 장착한 컴퓨터에서 알고리즘 개발 도구로 C/C++에서 직접 RTL로 변환하는 고위합성(HLS, High-Level Synthesis)이 실용화 단계에 이르럿다[바로가기][고위합성 튜토리얼]. HLS이 생성해내는 RTL 코드는 상당한 여분(redundancy)을 안고 있지만 재구성 가능한 FPGA를 사용하므로 크게 문제되지 않는다. 향후 고성능 컴퓨팅 방법으로 커다란 발전을 기대하고 있다[바로가기].

지난 수십년간 소프트웨어 언어로 기술된 알고리즘을 하드웨어로 구현하기 위해 RTL로 변환하는 방법이 수없이 등장했다 사라졌다[바로가기]. C/C++ 언어에서 부족한 시간의 개념을 도입하기 위해 여러 유사언어가 등장 했으나 2005년 SystemC가 IEEE 1666 [바로가기]으로 표준화된 이후  모두 사라졌다[바로가기]. 표준 C++ 만 남았다. SystemC는 하드웨어의 특성을 묘사하기 위한 C++ 크래스와 동시실행 시뮬레이션 엔진이 포함된 라이브러리다. 개발에 표준 C++ 컴파일러가 필요할 뿐이다.

2-2-2. 언-타임드 모형의 구조 탐색

본 예제는 FIR 필터의 배열형 병렬처리 계산기 구조를 탐색하고 처리단위를 모형화 한다. 하드웨어 구조의 병렬성을 묘사한 후 모의실험의 도구로 SystemC를 활용한다. 언-타임드 순수 C/C++로 작성된 알고리즘을 하드웨어로 구현하는 첫 단계는 변수들 사이의 의존관계를 따져 병렬성을 탐지해 내는 일이다. 이를 근거로 동시처리가 가능한 요소로 분할하고 클럭 단위의 스케쥴링을 수립한다.

FIR 필터 알고리즘의 골자인 for() 반복문을 다루는 방법에 두가지 구조를 고려해 볼 수 있다. 첫째 구조는 반복문의 제어절차를 FSM으로 구현하고 누산기를 두는 방법이다. 두번째는 반복문 for()에서 순환변수 i를 펼쳐 놓고 자료의 의존관계를 살펴보는 것이다. 곱셈과 누적 연산 사이에 순방향 의존만 존재하므로 파이프라인 병렬처리 구조가 가능하다. 

두 구조는 각각 장단점이 있으므로 조건과 용도에 맞게 선택한다. 고위합성기 HLS를 활용하는 경우 원하는 하드웨어의 구조를 지정할 수 있다[HLS예 바로가기]. 본 예제는 HLS를 사용하지 않을 뿐더러 MPW 칩의 제한을 감안하여 배열 계산기 전체가 아닌 PE 만을 설계한다. SystemC로 기술한 PE는 아래와 같다.

    sc_fir_pe.h

배열구조의 한 처리요소 PE를 SystemC의 묘듈로 기술하면 아래와 같다.

SystemC로 기술된 내용을 보면 마치 새로운 언어처럼 보이지만 C++의 #define 매크로를 적극적으로 활용하여 마치 HDL의 외형과 유사해 보인다. 실제로 SC_MODULE()을 정의한 매크로는 다음과 같다.

    #define SC_MODULE(user_module_name)   \
        struct user_module_name : sc_module

따라서 위의 sc_fir_pe 는 아래와 같이 C++의 크래스를 의미한다.

    class sc_fir_pe : public sc_core::sc_module
    {
        public:
            ......
    }

하드웨어 모듈의 행동은 C++ 크래스의 소속함수로 기술한다. SC_CTOR() 매크로는 모듈이 사례화(instantiate) 될 때 처음 실행되는 크래스 구성자(constructor)다. 소속함수를 클럭의 사건에 감응(sensitize)토록 지정하였다.

C++의 추상화 수준은 프로그래밍 언어의 최고 위치에 있을 뿐만 아니라 폭넓은 범위를 수용한다. SystemC는 C++의 크래스와 각종 객체를 유연하게  선언할 수 있도록 허용하는 템플릿(C++ class template, 바로가기)을 매우 폭넓게 활용하고 있다. C++ 언어의 진수를 보여준다고 할만하다. 프로그래밍 언어에 익숙치 않은 하드웨어 기술자에게 매우 낮설 수 있지만 그동안 쌓아온 경험을 가지고 예제들을 읽어보면 상식적인 수준에서 이해될 수 있을 것이다. 위의 PE를 기술한 모듈의 소속함수를 읽어보기 바란다. 베릴로그 HDL에 비하여 어렵지 않을 것이다.

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

주] SystemC는 새로운 설계방법론일까? [바로가기]

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

FIR8의 처리요소 PE는 매 클럭당 계수 곱셈과 누산을 수행한다. 소속함수 pe_thread()는 입력 clk의 변화(사건, event)에 호출되도록 감응이 지정되었고 내부 행동은 clk의 상승 엣지 사건 일때 까지 대기한다.

    wait(clk.posedge_event());

언-타임드 모형에서 함수호출은 프로그래머가 놓아둔 구문의 순서를 따르지만 SystemC로 기술된 쓰레드(또는 메쏘드)함수는 지정된 신호의 사건에 의해 시뮬레이터가 호출한다. 그리고 구문수행에 시간의 개념(클럭 동기)이 포함되어 있다. 이를 '타임드(timed)' 모형이라고 한다. 시간은 병렬실행을 모사하는 기준이다. 사건이 발생하면 시뮬레이터는 시간을 멈춰놓은 후 이에 감응이 지정된 모든 함수를 호출한다(event & call-back). 각 함수의 출력을 검사하여 다음 시간에 일어날 사건들을 수집하고 시간을 진행 시킨다. 시뮬레이터가 하드웨어의 병렬수행을 모의하는 작동 원리다. SystemC는 C++의 크래스(class)와 템플릿(template)를 활용하여 하드웨어 객체(입출력 방향 및 와이어와 레지스터)를 표현하며 병렬 시뮬레이터를 내장한 라이브러리다.

2-2-3. 파이프라인 배열 구조 묘사

파이프라인 처리 배열구조 병렬처리 계산기는 별도의 제어기 없이 데이터의 흐름 만으로 알고리즘을 수행한다. 초기 클럭 지연 이후 매 클럭마다 결과를 내므로 낮은 클럭율(clock rate)의 매우 효율적(고속 및 저전력)인 전용 하드웨어 구조다. 위에서 설계한 8개의 처리요소 PE들을 사용한 배열을 구조를 묘사하면 아래와 같다.

    sc_fir8.h

병렬처리 배열구조에 입력과 출력 그리고 클럭 이외의 다른 제어선은 없다.

    SC_MODULE(sc_fir8)

    {
        sc_in<bool>             clk;
        sc_in<sc_uint<8> >      Xin;
        sc_out<sc_uint<8> >     Xout;
        sc_in<sc_uint<16> >     Yin;
        sc_out<sc_uint<16> >    Yout;

        sc_fir_pe*      u_fir_pe[N_PE_ARRAY];

        sc_signal<sc_uint<8> >  X[N_PE_ARRAY-1];    // X-input
        sc_signal<sc_uint<16> > Y[N_PE_ARRAY-1];    // Accumulated
        sc_signal<sc_uint<8> >  C[N_PE_ARRAY];      // Filter-Tabs Coeff

        SC_CTOR(sc_fir8): clk("clk"),...
        {...}

        .....
    };

모듈 크래스 SC_MODULE 의 구성자 내에서 N_PE_ARRAY=8개의 sc_fir_pe 를 하위 모듈로 생성(사례화, instantiate)하고 이들 사이에 시그널 채널(signal channel)을 통해 연결 한다. SystemC의 채널은 베릴로그의 하드웨어 객체, 레지스터 reg 와 같다.

    SC_CTOR(sc_fir8): clk("clk"), Xin("Xin"), ...... , Yout("Yout")
    {
        char    szPeName[16];
        for (int i=0; i<N_PE_ARRAY; i++)
        {
            sprintf(szPeName, "u_PE_%d", i);
            u_fir_pe[i] = new sc_fir_pe(szPeName); // Instantiate PE

            C[i].write(sc_uint<8>(filter_taps[i])); // Set Coeffs.

            u_fir_pe[i]->Cin(C[i]);    // Bind Coeffs.
            u_fir_pe[i]->clk(clk);     //  and Clock
        }

        // 0-th PE
        u_fir_pe[0]->Xin(Xin);
        u_fir_pe[0]->Xout(X[0]);
        u_fir_pe[0]->Yin(Yin);
        u_fir_pe[0]->Yout(Y[0]);

        // Systolic Array
        for (int i=1; i<N_PE_ARRAY-1; i++)
        {
            u_fir_pe[i]->Xin(X[i-1]);
            u_fir_pe[i]->Xout(X[i]);
            u_fir_pe[i]->Yin(Y[i-1]);
            u_fir_pe[i]->Yout(Y[i]);
        }

        // Last PE
        u_fir_pe[N_PE_ARRAY-1]->Xin(X[N_PE_ARRAY-2]);
        u_fir_pe[N_PE_ARRAY-1]->Xout(Xout);
        u_fir_pe[N_PE_ARRAY-1]->Yin(Y[N_PE_ARRAY-2]);
        u_fir_pe[N_PE_ARRAY-1]->Yout(Yout);

    }


2-2-4. 타임드 모형 테스트벤치

배열구조 sc_fir8를 시험하기위한 테스트 벤치는 다음과 같다.

    sc_fir8_tb.h

피시험 설계물(DUT, Design Under Test) sc_fir8의 입출력에 연결한 시그널 채널 sc_signal<>들을 테스트벤치 크래스 내에 선언하였다. 상위 테스트벤치는 입출력 신호를 갖지 않도록 했다. 테스트 벤치 크래스는 두 소속함수를 가지는데 각각 시험용 신호의 생성과 DUT로부터 출력되는 필터의 결과를 취하여 언-타임드 알고리즘 계산과 비교한다.

    SC_MODULE(sc_fir8_tb)
    {
        sc_clock                clk;
        sc_signal<sc_uint<8> >  Xin;
        sc_signal<sc_uint<8> >  Xout;
        sc_signal<sc_uint<16> > Yin;
        sc_signal<sc_uint<16> > Yout;

        sc_fir8*                u_sc_fir8;

        // Test utilities
        void Test_Gen();
        void Test_Mon();

        SC_CTOR(sc_fir8_tb):
            clk("clk", 100, SC_NS, 0.5, 0.0, SC_NS, false),......
        { .... }

    };

구성자에서 테스트 벤치 크래스를 구성하면서 모듈 내에서 사용될 포트와 채널들의 초기화는 객체에 이름 붙이기다. 이는 디버깅용으로 필수 사항은 아니다. 클럭 객체 sc_clock의 경우 특별히 클럭 발생기로서 작동하도록 초기화한다. 아래 예에서 sc_clock 객체로 선언된 clk는 주기 100 나노 초, 듀티 비 0.5로 반복적인 클럭 신호를 생성한다. 

        SC_CTOR(sc_fir8_tb):
            clk("clk", 100, SC_NS, 0.5, 0.0, SC_NS, false),
            Xin("Xin"), ...... , Yout("Yout")
        {
            SC_THREAD(Test_Gen);
            sensitive << clk;

            SC_THREAD(Test_Mon);
            sensitive << clk;

            // Instaltiate FIR8
            u_sc_fir8 = new sc_fir8("u_sc_fir8");
            u_sc_fir8->clk(clk);
            u_sc_fir8->Xin(Xin);
            u_sc_fir8->Xout(Xout);
            u_sc_fir8->Yin(Yin);
            u_sc_fir8->Yout(Yout);

        }

테스트벤치 모듈 내의 두 소속함수는 쓰레드로 작동하기 위해 SC_THREAD()로 지정하였고 clk로 감응 되었다. 두 스레드 소속함수는 별도의 파일로 작성되었다.

    sc_fir8_tb.cpp

DUT에 주입될 시험 신호 생성용 쓰레드 함수는 Test_Gen() 아다. 모듈 크래스의 소속함수로 신호의 사건에 감응되어 호출될 메쏘드 또는 쓰레드 함수는 입력과 되돌림이 없어야 한다.

    void sc_fir8_tb::Test_Gen()
    {
        double      X_in[F_SAMPLE]; // Noise
        uint16_t    yn;
        int         t = 0;

        // Generate tests & reference from C-Model 
        srand(time(NULL));
        cnoise_generate_colored_noise_uniform( X_in, F_SAMPLE, 0, NOISE_RANGE );

        for (t=0; t<F_SAMPLE; t++)
        {
            x[t] = sc_uint<8>(AMPLITUDE/16.0
                            *
(cos((2*M_PI/F_SAMPLE)*51.0*t
                                    +(float)(rand() %  10)/ 10.0)+1))
                  + ......
                  + sc_uint<8>(X_in[t]+NOISE_RANGE);

            fir(&yn, x[t]); // Un-Timed C-Model FIR Filter

            y[t] = yn;
        }

        Yin.write(0);

        t = 0;

        while(true)
        {
            wait(clk.posedge_event());
            Xin.write(x[t]);
            t = ((++t) % F_SAMPLE);
        }
    }

몇개의 각기 다른 주파수의 유효신호와 백색잡음을 섞어 시험신호를 생성한다. 이 값들을 언-타임드 알고리즘에 주고 그 결과를 DUT 출력과 비교하기 위해 담아 두었다. 쓰레드 함수는 한번 호출되면 재호출 되지 않는다. 따라서 함수내에 무한 반복문 while(true) {......} 을 포함한다. 시그널 clk에 감응된 이 쓰레딩 함수는 상승 엣지 사건을 대기 후 재개한다.

테스트벤치 크래스의 다른 쓰레드 함수 Test_Mon()은 DUT의 출력과 표준 참조값과 비교하여 오류를 검사한다.

    void sc_fir8_tb::Test_Mon()
    {
        int         n = 0;
        uint16_t    yout;

        FILE *fp = fopen ( "sc_fir8_tb_out.txt", "w" );

        while(true)
        {
            wait(clk.posedge_event());
            yout = (uint16_t)Yout.read();

            if (yout==0)    continue;

            if (y[n]!=yout)
                printf("Error:");

            printf("[%4d] y=%d / Yout=%d\n", n, (uint16_t)y[n], yout);
            fprintf(fp, "%5d %5d\n", (uint16_t)x[n], (uint16_t)yout);   //y[i]);

            n++;
            if (n==F_SAMPLE)
            {
                fflush(fp);
                fclose(fp);
                sc_stop();
            }
        }
    }

매 클럭마다 DUT의 출력을 취하도록 clk의 상승 엣지 사건에 대기 후 비교를 재개한다. 시험을 마친 후 파일에 저장해 두었던 결과는 파이썬 프로그램으로 시각적 분석한다. 다양한 수리 라이브러리를 활용할 수 있는 파이썬은 과학기술 용으로 매우 유용하게 사용된다.

    sc_plotDFT.py

SystemC로 작성한 타임드 모형의 시뮬레이션 Makefile은 아래와 같다.

    Makefile

SystemC로 작성된 코드에서 읽어들일 인클루드 폴더의 지정과 링크용 라이브러리 그리고 컴파일 후 실행시 필요한 동적 라이브러리(so, shared-object)의 위치등을 변수로 설정해 놨다.

    export SYSTEMC          = /usr/local/systemc-3.0.0
    export SYSTEMC_HOME     = $(SYSTEMC)
    export SYSTEMC_INCLUDE  = $(SYSTEMC_HOME)/include
    export SYSTEMC_LIBDIR   = $(SYSTEMC_HOME)/lib-linux64
    export LD_LIBRARY_PATH :=$(LD_LIBRARY_PATH):$(SYSTEMC_LIBDIR)
    export CXX              = clang++
    export CXXFLAGS         = -std=c++17

시뮬레이션을 수행하려면 명령줄에서 작업 폴더로 이동,

    ~$ cd
    ~$ cd cd ETRI-0.5u-CMOS-MPW-DK-Example--FIR8
    ~$ cd 0_algorithm/sc_timed

메이크 유틸리티로 빌드,

    ~$ make

실행,

    ~$ make run

SystemC는 VCD(Value-Changed Dump) 파형 기록을 지원한다. 타임드 시뮬레이션을 수행하며 시간상 발생한 시그널 채널과 포트의 사건을 VCD형식 파형으로 기록할 수 있다.


신호처리 알고리즘들은 수없이 많은 자료를 다룬다. 입출력 신호를 파형으로 살펴보기는 지루하기 짝이 없는 노릇이지만 개발중 확인 용도로 유용하다.

2-2-5. 패드 제한(pad-limit) 검토

클럭 및 비트 단위 상세히 기술된 경우 언어에 상관 없이 수월하게 합성 할 수 있다. SystemC로 작성된 PE의 타임드 모형은 합성이 가능할 정도의 RTL로서 언타임드 알고리즘과 비교 검증 역시 완료되었다. 하지만 '내칩(MyChip)' MPW의 핀수 조건을 만족하지 못한다. PE의 코어가 차지할 면적이 작지만 외부로 연결된 핀의 갯수가 무려 60여개에 이른다. 데이터 패쓰는 디지털 설계의 큰 골칫꺼리다. 이의 해결을 위해 클럭 소모를 감수하고 비트 단위 또는 디지트 단위 입출력과 연산을 고려해야 한다.

3. 예제 수행

깃-허브에서 예제 다운로드

    $ cd
    $ git clone https://github.com/GoodKook/ETRI-0.5u-CMOS-MPW-DK-Example--FIR8.git

FIR8의 언타임드 시뮬레이션

    $ cd
    $ cd ETRI-0.5u-CMOS-MPW-DK-Example--FIR8/0_algorithm/
    $ cd c_untimed
    $ make
    $ make run
    $ make plot_fy

배열형 병렬 계산기 구조 처리단위(PE, processing element)의 타임드 시뮬레이션

    $ cd
    $ cd ETRI-0.5u-CMOS-MPW-DK-Example--FIR8/0_algorithm/
    $ cd sc_timed
    $ make
    $ make run


4. 참고

Git-Hub:

1. 디자인 킷, https://github.com/GoodKook/ETRI-0.5um-CMOS-MPW-Std-Cell-DK.git

2. 예제 ALU8, https://github.com/GoodKook/ETRI-0.5u-CMOS-MPW-DK-Example--ALU8.git

3. 예제 FIR8, https://github.com/GoodKook/ETRI-0.5u-CMOS-MPW-DK-Example--FIR8.git 

유용한 바로가기:

1. KION MPW 안내문 공지: http://mpw.kion.or.kr/info/notice_list.asp

2. Design of FIR Filters, https://www.robots.ox.ac.uk/~gari/teaching/cdt/A3/readings/Filtering_and_FFT/3F3_5_Design_of_FIR_Filters.pdf

3. Finite Impulse Response, https://en.wikipedia.org/wiki/Finite_impulse_response

4. TFilter, http://t-filter.engineerjs.com/

5. Make 유틸리티 강좌, http://ebook.pldworld.com/_eBook/make/make_utility_lecture_(cWyANG).pdf

6. Python Programming And Numerical Methods: A Guide For Engineers And Scientists, https://pythonnumericalmethods.berkeley.edu/

7. 고위합성 튜토리얼, https://hls-goodkook.blogspot.com/2021/08/ug871-xilinx-high-level-synthesis.html

8. 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

9. oneAPI DPC++(Data Parallel C++), https://www.intel.com/content/www/us/en/developer/tools/oneapi/dpc-compiler.html

10. High-Level Synthesis, https://en.wikipedia.org/wiki/High-level_synthesis

11. IEEE1666 SystemC LRM, https://ieeexplore.ieee.org/document/10246125

12. SystemC, https://en.wikipedia.org/wiki/SystemC

13. SystemC는 새로운 설계방법론일까?, https://fun-teaching-goodkook.blogspot.com/2024/03/systemc.html

14. 클래스 템플릿, https://learn.microsoft.com/ko-kr/cpp/cpp/class-templates

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

[다음] [2] 아듀이노 보드 에뮬레이션







2024년 3월 25일 월요일

반도체 설계 언어, 예제를 모아두면 편리하다

반도체 설계 언어, 예제를 모아두면 편리하다

반도체 설계에 동원되는 컴퓨팅 언어들은 한두가지가 아니다. 베릴로그, VHDL 을 포함한 하드웨어 기술 언어뿐만 아니라 시스템 모형과 알고리즘 개발 그리고 검증용으로 C/C++, 파이썬 등이 있다. 언어에 더하여 엄청나게 다양한 API들을 활용해야 하는데 일일이 다 외우기는 커녕 그 활용법 조차 만만치 않다. 천여쪽에 달하는 언어의 LRM(Language Reference Manual) 앞에 질리지 말자.

언어의 기본적인 특성 정도 만 이해했다면 예제를 통해 익히는 방법이 좋다. 실예로 if~else~ 구문은 어떤 컴퓨팅 언어에도 등장하고 그 의미는 다르지 않다. for() 반복문도 마찬가지다. 물론 구문의 행동, 구문이 낳게될 결과는 다소 차이가 있지만 사용하면서 연습을 통해 익히도록 하자. 구문의 다양한 활용법 예제를 가지고 있다면 큰 도움이 된다. 참고하기 좋은 사이트와 저장소를 소개한다.

베릴로그의 예제들,
https://github.com/aklsh/getting-started-with-verilog

파이썬의 과학기술 활용,
https://pythonnumericalmethods.berkeley.edu/

C++ 표준 라이브러리
https://cplusplus.com/reference/

Learn SystemC with Examples,
https://www.learnsystemc.com/

Make 유틸리티
https://wiki.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make-1.html

그리고 실용적인 예제들을 ETRI 0.5um CMOS MPW 예제와 함께 게시판과 깃-허브( https://github.com/goodkook )에 지속적으로 올리겠다.


* 도서모음

https://github.com/rangaeeeee/books-raspberrypimagazines


2024년 3월 24일 일요일

인공지능 시대를 맞아 주목받는 아날로그 컴퓨팅, 퀀텀 컴퓨팅

인공지능 시대를 맞아 주목받는 아날로그 컴퓨팅, 퀀텀 컴퓨팅


Future Computers Will Be Radically Different (Analog Computing)
https://youtu.be/GVsUOuSjvcg?si=DJOKb8HJbv6MNSta

Companies, countries battle to develop quantum computers | 60 Minutes
https://youtu.be/K4ssT6Dzmnw?si=AkrA0qaF89RoVuSJ

Michio Kaku: Quantum computing is the next revolution
https://youtu.be/qQviI1d_hFA?si=7NilwdUsP-0YPOth

Beating Moore's Law: This photonic computer is 10X faster than NVIDIA GPUs using 90% less energy
https://youtu.be/t1R7ElXEyag?si=Qnzz-k7crk27lVS9


The Map of Quantum Computing - Quantum Computing Explained
https://youtu.be/-UlxHPIEVqA?si=wS94l69ODkFukcpo

The Quantum Wavefunction Explained
https://youtu.be/sOI4DlWQ_1w?si=ITy0l4iUtuF4xV3o


Qiskit is the open-source toolkit for useful quantum
https://www.ibm.com/quantum/qiskit


2024년 3월 22일 금요일

윈도즈 하위 시스템 리눅스(WSL) 설치 및 제거

윈도우즈 하위 시스템 리눅스(WSL) 설치 및 제거

목차:
    1. 개요
    2. WSL 에 리눅스 설치
    3. WSL에 설치된 리눅스를 제거하는 방법
    4. WSL에 설치된 리눅스를 다른 하드디스크로 옮기는 방법
    5. 리눅스 기초/기본 명령어

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

1. 개요

반도체 설계 도구들이 대부분 리눅스 운영체제에서 설치운용된다. 리눅스라는 운영체제를 설치하기 조차 버겁다. 다행히 윈도우즈 10/11은 리눅스를 설치하고 가상 실행 할 수 있도록 준비되어 있다.

참고] Windows on Windows, https://en.wikipedia.org/wiki/Windows_on_Windows ;
64비트 윈도우즈는 이전 버젼의 32비트 GUI도 가상머신 상에서 운용된다. i3/5/7 로 불리는 64 비트 CPU는 예전의 386/486/586라고 불리던 32비트 프로세서와 전혀 다르다. 64비트 윈도우즈는 이전 CPU의 코드와 호환성을 위해 가상 머신으로 작동시킨다.

윈도우즈 운영체제에서 리눅스를 설치하고 가상 실행 할 수 있도록 준비되어 있다. WSL (Windows Subsystem Linux)라고 한다. WSL이 그 이전부터 계속 발전해 오면서 설치방법이 갱신 되어왔다. WSL에 리눅스 설치법을 찾아보면 옛 버젼에 대한 정보가 검색되는데 반드시 '버젼2' 인지 확인하자.

2. WSL 에 리눅스 설치

PC에 리눅스를 설치하는 방법으로 WSL(Windows Subsystem for Linux)을 쓰기로 한다.

주의] 마이크로소프트의 WSL 관련 웹페이지[바로가기]에 WSL --install 이라고 하면 알아서 해준다는 내용이 있는데 적절하지 않다. 업그레이드는 물론 처음 설치의 경우에도 '수동 설치 절차'를 따르는 것이 좋다.

설정(Setting) 창에서 '윈도우즈 기능(Windows Features)'을 열어 '윈도우즈 기능 켜기/끄기(Turn Windows features on or off)'에서 아래 기능을 켜도록 한다. 이 기능을 켜면 시스템을 재부팅 할 수도 있다.

    - Linux용 Windows 하위 시스템(Windows Subsystem for Linux)

윈도우즈 파워쉘(Power Shell) 커맨드 창을 "관리자 권한"으로 열어 아래와 같이 실행한다. 반드시 버젼 2를 잊지 않도록 한다.

    PS> wsl --set-default-version 2
    PS> wsl --update

마이크로소프트 스토어에서 Ubuntu 를 검색해 20.04.6 LTS 를 받아서 설치한다.

3. WSL에 설치된 리눅스를 제거하는 방법

3-1. 설정 -> 프로그램 추가/설치 -> Ubuntu 제거

3-2. 파워-쉘에서 WSL 서비스 중지(파워-쉘을 관리자 권한으로 실행 할 것)

    PS> wsl -l -v
    PS> wsl --shutdown

3-3. 사용자 AppData 에서 리눅스가 사용하던 가상 디스크 지울것

C:\Users\<user name>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_****\ext4.vhdx

4. WSL에 설치된 리눅스를 다른 하드디스크로 옮기는 방법

윈도우즈 WSL로 설치된 리눅스는 물리적으로 디스크 용량을 할당하지 않고 가상 디스크 사용한다. 이 가상 디스크는 리눅스를 사용하면서 용량이 늘어난다. 만일 디스크 용량이 부족해서 다른 디스크로 옮겨야 하는 경우 방법은 아래와 같다.

4-1. 윈도우즈용 깃(git)이 설치되지 않았다면 이를 설치한다.

    https://git-scm.com/download/win

리눅스는 윈도우즈 가상 디스크에 설치된다. 가상 디스크의 확장명은 '.vhdx' 다.

4-2. 먼저 윈도우즈 서비스로 실행중인 WSL을 중지시킨다.

    PS> wsl -l -v
    PS> wsl --shutdown

4-3. 옮겨갈 폴더를 만든다. 예를들어 D: 디스크로 옮기려면,

    PS> mkdir d:\wsl
    PS> d:

4-4. 깃허브에서 'wsl-move'를 가져온다.

    PS> cd d:\wsl
    PS> git clone https://github.com/pxlrbt/move-wsl.git
    PS> cd move-wsl
    PS> ./move-wsl.ps1

If it wouldn't run,

    PS> Set-ExecutionPolicy Unrestricted

5. 기본 사용자 명 지정,

Create '.wslconfig' at %UserProfile% folder. Contents as follows,

    [user]
    default=<username>

same at /etc/wsl.conf

가상 디스크가 옮겨진 후 리눅스 기본 사용자를 지정한다.

    PS> wsl -u <username>

* 우분투 리눅스를 WSL 에서 등록 말소 시키는 방법

    PS> wsl --unregister Ubuntu-22.04

5. 리눅스 기본 명령어

컴퓨터와 대화가 GUI(Graphic User Interface) 외에 윈도우즈의 커캔드 창 또는 파워-쉘등 명령줄(Command-Line Interface)도 있다. 리눅스는 기본적으로 명령줄 기반으로 운영된다. 반도체 설계 도구를 사용하기 위한 명령줄의 기초를 익혀두자.

Command Line for Beginners
https://ubuntu.com/tutorials/command-line-for-beginners#1-overview

15가지 리눅스 기본 명령어[한빛출판 네트워크]
https://hanbit.co.kr/channel/category/category_view.html?cms_code=CMS6390061632

리눅스 기초/기본 명령어
http://contents.kocw.or.kr/document/03_BasicCommands.pdf







2024년 3월 18일 월요일

오픈-소스 도구로 구글과 함께 내 칩을 만들어보세요(Build Custom Silicon with Google)

오픈-소스 도구로 구글과 함께 내칩을 만들어보세요

아래 내용은 "Build Custom Silicon with Google"에서 가져왔습니다.

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

소프트웨어처럼 누구나 규모에 맞게 커스텀 실리콘을 더 쉽게 빌드할 수 있습니다.
Make custom silicon easier to build for everyone, at scale, just like software.

자체 실리콘 빌드
Build your own silicon

Google은 GlobalFoundries, SkyWater Technology, Efabless와 제휴하여 모든 개발자가 제조 가능한 실리콘 디자인을 만들 수 있는 완전 오픈소스 프로세스 설계 키트 (PDK) 및 도구 모음을 제공하고 있습니다.

Google is partnering with GlobalFoundries, SkyWater Technology and Efabless to provide fully open source Process Design Kits (PDKs) and toolchains so that any developer can create manufacturable silicon designs.

2개월마다 OpenMPW 셔틀 프로그램에 포함될 오픈소스 디자인을 제출하여 무료로 제조될 기회를 얻을 수 있습니다.

Every other month, you can submit your open source designs to be included in the OpenMPW shuttle program and get a chance to get them manufactured at no cost.

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

구글이 왜이러는 거죠?
Google's Open Source Hardware Dreams

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

오픈-소스와 함께 전용 반도체 설계의 새막이 열렸다.

* 아래 글은 저(goodkook@gmail.com)의 개인적 생각입니다.

구글은 130나노 공정 PDK를 공개하고 오픈 소스 반도체 설계 도구의 활용을 권장하며 낮은 비용으로 MPW도 운용하고 있다. 구글은 왜이럴까?

지난 십여년은 CPU로 대변되는 범용 반도체가 주류였다. 범용 반도체는 대규모로 집적이 가능하면서 비교적 개발기간도 짧고 위험도 적었다. 심지어 설계 오류를 원래 그런 '기능'이라고 우기기도 한다. 공정기술 덕에 범용 반도체는 거대규모 집적과 기가 헤르츠 대의 속도를 자랑한다. 인간을 뛰어 넘는다면서 바둑대전을 벌인답시고 수천대의 CPU를 동원 했다고 한다. 그렇게 모두 '인공지능' 열광 하게 됐다. 멋지긴 한데 CPU를 대규모로 동원 하려니 전력 낭비가 심하다. 범용 반도체 CPU에서 기가 헤르츠로 작동하는 알고리즘이 전용 반도체에서 수천분의 일의 속도로 낮출 수 있다는 것은 두말할 필요도 없다. 다 알고 있었지만 그리 못했던 이유는 유연성이 떨어지는 전용 반도체는 설계의 검증이 너무 고됐기 때문이다. 반도체 설계가 극히 일부의 전유물 처럼 여겨졌기 때문이다. 설계 도구와 방법론이 폐쇄적 이었던 탓이다. 이를 극복할 방법으로 소프트웨어 개발 도구 GCC에서 그랬던 것처럼 하드웨어 설계도 오픈-소스화 하여 다양한 검증된 라이브러리를 구축 하려고 한다. 이에 맞춰 오픈-소스 반도체 설계 도구 프로젝트 OpenROAD의 활동이 활발하다.

https://theopenroadproject.org/

[출처] OpenROAD: Toward a Self-Driving,Open-Source Digital Layout Implementation Tool Chain[Link]

8~90년대 하드웨어 기술 언어와 함께 흥했다가 집적된 크기와 검증의 고됨을 감당하지 못하고 블록 기반의 범용 CPU와 소프트웨어에 밀려났던 전용 반도체 설계의 새로운 도약이 시작되었다.

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

[참고]

1] "유망시장 Issue Report / AI 반도체", 연구개발 특구 진흥 재단 INNOPOLIS, https://www.innopolis.or.kr/fileDownload?titleId=178582&fileId=1&fileDownType=C&paramMenuId=MENU00999

2] OpenROAD: Toward a Self-Driving,Open-Source Digital Layout Implementation Tool Chain, https://vlsicad.ucsd.edu/Publications/Conferences/370/c370.pdf

3] The OpenROAD Project, https://theopenroadproject.org/

4] Tiny Tapeout, https://tinytapeout.com/

5] eFabless, https://efabless.com/

6] Build Custom Silicon with Goodle, https://developers.google.com/silicon

7] SkyWater, Open Source PDK, https://github.com/google/skywater-pdk

8] An Open-Source and Autonomous Temperature Sensor Generator Verified With 64 Instances in SkyWater 130 nm for Comprehensive Design Space Exploration, https://blaauw.engin.umich.edu/wp-content/uploads/sites/342/2022/09/An-Open-Source-and-Autonomous-Temperature-Sensor-Generator-Verified-With-64-Instances-in-SkyWater-130-nm-for-Comprehensive-Design-Space-Exploration.pdf

9] Analog in-memory subthreshold deep neural network accelerator, https://ieeexplore.ieee.org/document/7993629

10] What is Silicon-Photonics?https://www.synopsys.com/glossary/what-is-silicon-photonics.html

11] Running Neural Networks on Meshes of Light,

12] Zero to ASIC Course, https://zerotoasiccourse.com/matt_venn/

13] SiFive Powers Google TPU, NASA, Tenstorrent, Renesas, Microchip, And More, RISC-V Is The Standard For non-user-facing functions., https://www.semianalysis.com/p/sifive-powers-google-tpu-nasa-tenstorrent

14] AV1 Arithmetic Encoder Design on Open-Source EDA, https://www.researchgate.net/publication/364421419_AV1_Arithmetic_Encoder_Design_on_Open-Source_EDA

15] Free Silicon Foundation, https://wiki.f-si.org/index.php?title=Free_Silicon_Foundation

16] Free and Open Source Silicon Movement, https://fossi-foundation.org/

17] The Promise of Open Source Semiconductor Design Tools,

18] "Hermes-Lite: Amateur Radio SDR", FOSSi Foundation Latch-Up, https://youtu.be/qlgq52IIUo8?si=AUDwf6IqoWS_Zv-d



2024년 3월 15일 금요일

ETRI 0.5um CMOS 공정용 표준 셀 디자인 킷 (깃-허브 저장소)

ETRI 0.5um CMOS 공정용 표준 셀 디자인 킷

최신 디자인 킷을 깃-허브에 올려놓고 최신 버젼으로 관리 한다. 이전 버젼[바로가기]은 글의 내용만을 참고한다. 깃-허브 주소는 아래와 같다.

    https://github.com/GoodKook/ETRI-0.5um-CMOS-MPW-Std-Cell-DK

이 디자인 킷에는 표준 셀과 오픈-소스 설계 도구의 설치 스크립트를 모두 포함한다. 설치 환경은 리눅스(우분투 20.4)다.

설계도구 설치와 관련 주의:
    1. 설계 도구의 설치는 아래 순서대로 할 것.
    2. 패키지 설치도구를 사용하지 말 것.

1. GitHub에서 저장소 파일을 모두 내려받기

    $ cd ~
    $ git clone https://github.com/GoodKook/ETRI-0.5um-CMOS-MPW-Std-Cell-DK
    $ cd ETRI-0.5um-CMOS-MPW-Std-Cell-DK

2. 최신 표준 셀 라이브러리가 저장된 폴더를 'digital_ETRI' 명으로 심볼링크

    $ ln -s digital_ETRI050_m2d digital_ETRI

3. 오픈-소스 설계 도구 설치

    3-1. 스크립트들에 모두 실행가능 속성지정

    $ chmod +x ./scripts/*.sh;chmod +x ./scripts/*.py;chmod +x ./Tools/*.sh

    3-2. 도구 설치 스크립트가 저장된 폴더로 이동

    $ cd ./Tools

    3-3. 설계도구를 설치및 운용에 필요한 패키지 일괄 설치

    $ ./prerequisites.sh

    3-4. 베릴로그 RTL 합성기 Yosys 설치

    $ ./yosys_build.sh

    3-5. 표준 셀 자동 배치 도구, GrayWolf 설치

    $ ./graywolf_build.sh

    3-6. 표준 셀 자동 배선 도구, QRouter 설치

    $ ./qrouter_build.sh

    3-7. 레이아웃 편집 및 변환 및 GDS 생성 도구, Magic 설치

    $ ./magic_build.sh

    3-8. 스위치 수준 시뮬레이터, iRSim 설치

    $ ./irsim_build.sh

    3-9. 레이아웃 도구, KLayout 설치

    $ ./klayout_install.sh

    3-10. 네트리스트 비교 LVS & LVL 도구, Netgen 설치

    $ ./netgen_build.sh

    3-11. ETRI 0.5um 공정이 추가된 QFlow 설치

    $ ./qflow-1.4.100_etri050_build.sh

    3-12. SPICE 회로 시뮬레이터 ngSpice 설치

    $ ./ngspice42_build.sh

    3-13. 회로도 입력 도구 XSchem 설치

    $ ./xschem_build.sh

    3-14. 베릴로그 시뮬레이터, iVerilog 설치

    $ ./iverilog_build.sh

    3-15. 시스템 수준 모델링및 시뮬레이터, SystemC 설치

    $ ./systemc_build.sh

    3-16. 베릴로그에서 SystemC/C++ 변환기, Verilator 설치

    $ ./verilator_build.sh

    3-17. 디지털 파형 보기 도구 gtkWave 설치

    $ ./gtkwave_install.sh

4. 예제

설계도구와 표준셀의 설치를 확인하기 위해 아래 저장소의 예제를 실시한다.

    https://github.com/GoodKook/ETRI-0.5u-CMOS-MPW-DK-Example--ALU8

위 예제는 RTL 합성, 자동 배치와 배선, 레이아웃 생성과 시뮬레이션을 과정을 포함한다.

5. 관련 도구 참고

    5-0. Open Circuit Design, http://opencircuitdesign.com/

    5-1. Yosys, https://github.com/YosysHQ

    5-2. GrayWolf, https://github.com/rubund/graywolf

    5-3. QRouter, https://github.com/RTimothyEdwards/qrouter

    5-4. Magic, https://github.com/RTimothyEdwards/magic

    5-5. iRSim, https://github.com/RTimothyEdwards/irsim

    5-6. KLayout, https://www.klayout.de/

    5-7. Netgen, https://github.com/RTimothyEdwards/netgen

    5-8. QFlow, https://github.com/RTimothyEdwards/qflow

    5-9. ngSpice, https://ngspice.sourceforge.io/

    5-10. XSchem, https://xschem.sourceforge.io/stefan/index.html

    5-11. iVerilog, https://github.com/steveicarus/iverilog

    5-12. SystemC, https://systemc.org/

    5-13. Verilator, https://www.veripool.org/verilator/

    5-14. gtkWave, https://gtkwave.sourceforge.net/


2024년 3월 12일 화요일

반도체 공정을 설명하는 영상 두편, 그리고 표준 셀 D-FlipFlop 제작 노트

반도체 공정을 설명하는 영상 두편, 그리고 표준 셀 D-FlipFlop 제작 노트

모래에서 웨이퍼 그리고 반도체 트랜지스터가 되기까지 과정을 보여주는 동영상

p-채널/n-채널 트랜지스터 그리고 인버터 레이아웃

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

셋과 리셋이 달려있는 D 플립플롭 표준 셀: DFFSR

74HC74 D-FlipFlop의 데이터 쉬트 중 기능 도(Functional Diagram)

트랜지스터 회로도 그리기

오픈소스 도구 XSChem 사용 트랜지스터 회로도 그리기

표준 셀 레이아웃

표준 셀의 기하학적 기준

오픈-소스 도구 Magic 사용 표준 셀 DFFSR의 레이아웃


레이아웃과 회로도 비교(LVS, Layout vs. Schematic)

        NetGen: 트랜지스터 수준 네트리스트 비교에 사용된 오픈-소스 도구

SPICE 시뮬레이션

Magic 레이아웃에서 추출한 트랜지스터 네트리스트

    * NGSPICE file created from DFFSR.ext - technology: scmos
    .option scale=0.15u

    .subckt DFFSR D S R CLK Q vdd gnd

    M1000 a_64_14# a_60_10# gnd gnd nfet w=40 l=4
    +  ad=0.16n pd=48u as=0.4n ps=60u
    M1001 a_126_86# CLK vdd vdd pfet w=40 l=4
    +  ad=0.56n pd=0.108m as=0.32n ps=56u
    M1002 a_146_14# a_126_86# a_60_10# gnd nfet w=20 l=4
    +  ad=0.16n pd=36u as=0.16n ps=36u
    M1003 a_296_14# S a_380_14# gnd nfet w=40 l=4
    +  ad=0.64n pd=0.112m as=0.16n ps=48u
    M1004 gnd a_326_14# Q gnd nfet w=20 l=4
    +  ad=0.28n pd=68u as=0.28n ps=68u
    M1005 a_36_10# S a_64_14# gnd nfet w=40 l=4
    +  ad=0.64n pd=0.112m as=0.16n ps=48u
    M1006 a_146_14# a_122_10# a_60_10# vdd pfet w=20 l=4
    +  ad=0.3n pd=56u as=0.16n ps=36u

        ......

    M1029 vdd a_326_14# Q vdd pfet w=40 l=4
    +  ad=0.56n pd=0.108m as=0.56n ps=0.108m
    M1030 a_296_14# a_122_10# a_276_14# vdd pfet w=20 l=4
    +  ad=0.28n pd=68u as=0.16n ps=36u
    M1031 a_380_14# a_326_14# gnd gnd nfet w=40 l=4
    +  ad=0.16n pd=48u as=0.36n ps=58u
    C0 Q gnd 7.47f
    C1 CLK gnd 9.24f
    C2 D gnd 3.67f
    C3 S gnd 13.8f
    C4 R gnd 14.2f
    C5 vdd gnd 53.3f
        ......

    .ends

ETRI 공정 파라메터를 적용한 SPICE 테스트 벤치

    * NGSPICE TB
    *.include 05cmos_model_spice_231025.lib
    .include amic5_mosfet_model.lib
    .include DFFSR.spice
    
XDFFSR_0 D S R CLK Q VDD GND DFFSR
    R0 VDD Q 5000
    VDD VDD GND 5
    
VSin S GND PWL(0n 5 40n 5 50n 0 140n 0 150n 5)
    VRin R GND PWL(0n 5 240n 5 250n 0 340n 0 350n 5)
    VDin D GND PWL(0n 0 540n 0 550n 5 740n 5 750n 0)
    VClk CLK GND pulse(0 5.0 100n 10n 10n 80n 200n)

    .tran 0.01n 800n
    .save all
    .control

    run

    plot S CLK Q
    plot R CLK Q
    plot D CLK Q

    .endc

    .GLOBAL VDD
    .GLOBAL GND

    .end

오픈-소스 회로시뮬레이터 ngSPICE 사용

입력 S:

입력 R:

입력 D:

클럭 CLK:

출력 Q:

클럭 CLK와 출력 Q:

표준 셀 DFFSR의 타이밍 시뮬레이션 베릴로그(Verilog) 모델

* 주의: 아래 모델의 지연 파라메터는 실제 공정을 반영하고 있지 않음

`celldefine
module DFFSR (CLK, D, R, S, Q);
input  CLK ;
input  D ;
input  R ;
input  S ;
output Q ;
reg NOTIFIER ;

   not (I0_CLEAR, R);
   not (I0_SET, S);
   udp_dff (P0003, D_, CLK, I0_SET, I0_CLEAR, NOTIFIER);
   not (D_, D);
   not (P0002, P0003);
   buf (Q, P0002);
   and (\D&S , D, S);
   not (I7_out, D);
   and (\~D&R , I7_out, R);
   and (\S&R , S, R);

   specify
     // delay parameters
     specparam
       tphlh$S$Q = 0.46:0.46:0.46,
       tpllh$R$Q = 0.33:0.33:0.33,
       tphhl$R$Q = 0.4:0.41:0.41,
       tpllh$CLK$Q = 0.57:0.57:0.57,
       tplhl$CLK$Q = 0.65:0.65:0.65,
       tminpwl$S = 0.064:0.26:0.46,
       tminpwl$R = 0.043:0.23:0.41,
       tminpwh$CLK = 0.32:0.49:0.65,
       tminpwl$CLK = 0.3:0.33:0.37,
       tsetup_negedge$D$CLK = 0.094:0.094:0.094,
       thold_negedge$D$CLK = 0.094:0.094:0.094,
       tsetup_posedge$D$CLK = 0.19:0.19:0.19,
       thold_posedge$D$CLK = 0.000000062:0.000000062:0.000000062,
       trec$R$CLK = -0.19:-0.19:-0.19,
       trem$R$CLK = 0.28:0.28:0.28,
       trec$R$S = 0.000000062:0.000000062:0.000000062,
       trec$S$CLK = 0:0:0,
       trem$S$CLK = 0.19:0.19:0.19,
       trec$S$R = 0.094:0.094:0.094;

     // path delays
     (CLK *> Q) = (tpllh$CLK$Q, tplhl$CLK$Q);
     (R *> Q) = (tpllh$R$Q, tphhl$R$Q);
     (S *> Q) = (tphlh$S$Q, 0);
     $setup(negedge D, posedge CLK &&& \S&R , tsetup_negedge$D$CLK, NOTIFIER);
     $hold (negedge D, posedge CLK &&& \S&R , thold_negedge$D$CLK,  NOTIFIER);
     $setup(posedge D, posedge CLK &&& \S&R , tsetup_posedge$D$CLK, NOTIFIER);
     $hold (posedge D, posedge CLK &&& \S&R , thold_posedge$D$CLK,  NOTIFIER);
     $recovery(posedge R, posedge CLK &&& \D&S , trec$R$CLK, NOTIFIER);
     $removal (posedge R, posedge CLK &&& \D&S , trem$R$CLK, NOTIFIER);
     $recovery(posedge R, posedge S, trec$R$S, NOTIFIER);
     $recovery(posedge S, posedge CLK &&& \~D&R , trec$S$CLK, NOTIFIER);
     $removal (posedge S, posedge CLK &&& \~D&R , trem$S$CLK, NOTIFIER);
     $recovery(posedge S, posedge R, trec$S$R, NOTIFIER);
     $width(negedge S, tminpwl$S, 0, NOTIFIER);
     $width(negedge R, tminpwl$R, 0, NOTIFIER);
     $width(posedge CLK, tminpwh$CLK, 0, NOTIFIER);
     $width(negedge CLK, tminpwl$CLK, 0, NOTIFIER);

   endspecify

endmodule
`endcelldefine

primitive udp_dff (out, in, clk, clr, set, NOTIFIER);
   output out;
   input  in, clk, clr, set, NOTIFIER;
   reg    out;

   table

// in  clk  clr   set  NOT  : Qt : Qt+1
//
   0  r   ?   0   ?   : ?  :  0  ; // clock in 0
   1  r   0   ?   ?   : ?  :  1  ; // clock in 1
   1  *   0   ?   ?   : 1  :  1  ; // reduce pessimism
   0  *   ?   0   ?   : 0  :  0  ; // reduce pessimism
   ?  f   ?   ?   ?   : ?  :  -  ; // no changes on negedge clk
   *  b   ?   ?   ?   : ?  :  -  ; // no changes when in switches
   ?  ?   ?   1   ?   : ?  :  1  ; // set output
   ?  b   0   *   ?   : 1  :  1  ; // cover all transistions on set
   1  x   0   *   ?   : 1  :  1  ; // cover all transistions on set
   ?  ?   1   0   ?   : ?  :  0  ; // reset output
   ?  b   *   0   ?   : 0  :  0  ; // cover all transistions on clr
   0  x   *   0   ?   : 0  :  0  ; // cover all transistions on clr
   ?  ?   ?   ?   *   : ?  :  x  ; // any notifier changed

   endtable
endprimitive // udp_dff

표준 셀 DFFSR의 합성기용 리버티(Liberty) 모델

* 주의: 아래 모델의 지연 파라메터는 실제 공정을 반영하고 있지 않음

    library(etri05_stdcells) {
        ......

        cell (DFFSR) {
            area : 1584;
            cell_leakage_power : 0.532978;
            ff (P0002,P0003) {
                next_state : "D";
                clocked_on : "CLK";
                clear : "(!R)";
                preset : "(!S)";
                clear_preset_var1 : L;
            }
            pin(CLK)  {
                direction : input;
                capacitance : 0.0161478;
                ......
            }
            pin(D)  {
                direction : input;
                capacitance : 0.0162024;
                rise_capacitance : 0.0161472;
                fall_capacitance : 0.0162024;
                internal_power() {
                    rise_power(passive_energy_template_6x1) {
                    ......
                    }
                    fall_power(passive_energy_template_6x1) {
                    ......
                    }
                }
                timing() {
                  related_pin : "CLK";
                  timing_type : hold_rising;
                  when : "S&R";
                  sdf_cond : "S\&R";
                  rise_constraint(hold_template_3x6) {
                    ......
                  }
                  fall_constraint(hold_template_3x6) {
                    ......
                  }
               }
            }
            pin(Q)  {
                direction : output;
                capacitance : 0;
                rise_capacitance : 0;
                fall_capacitance : 0;
                max_capacitance : 0.408128;
                function : "P0002";

                ......
            }
            pin(R)  {
                ......
            }
            pin(S)  {
                ......
            }
        }
    }

* 리버티는 합성기에서 참조하는 모델이다. 타이밍 구동 합성을 지원하지 않는 Yosys 합성기는 셀의 입출력 핀의 기능을 참조하여 테크놀로지 매핑을 실시한다. 위의 DFFSR 셀의 기능은 플립-플롭 ff() 으로 D 핀의 입력이 CLK에 의해 출력 Q 로 반영됨을 기술하고 있다. 복합 게이트 AOI21 의 경우 출력 Y의 기능은 입력 A, B, C의 논리식으로 표현 된다.

cell (AOI21X1) {
  pin(Y)  {
    direction : output;
    capacitance : 0;
    rise_capacitance : 0;
    fall_capacitance : 0;
    max_capacitance : 0.375698;
    function : "(!((A B)+C))";

    ......

    }
  ......
}

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