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 참여 학생에게 지급을 목표로 한다.

2023년 8월 26일 토요일

[Q&A] "내 칩(My Chip)" MPW 관련

[Q&A] "내 칩(My Chip)" MPW 관련

"내 칩(My Chip)" MPW와 관련하여 질문이 있어 아래와 같이 알려 드립니다.

1. 이번 MPW 제작은 과학기술 정통부 주관하는 공모전 입니다. 교내 학사운영(학점 부여, 장학혜택 )과 무관 합니다.

2. MPW 제작 신청을 접수하면 이를 바탕으로 관계 기관의 선정 절차를 거치게 됩니다. 따라서 모든 신청이 칩으로 제작 되지 않습니다.

질문1] 신청할 때 팀을 미리 꾸려야 하는 것인가요? 혼자 신청하면 설계를 신청한 사람들과 같은 한 팀이 되어 설계를 진행하나요?

MPW 제작 신청 시 팀을 꾸리도록 되어 있을 뿐입니다. 신청한 설계가 선정 될 경우 해당 팀원들이 합동으로 설계 또는 개인 별 설계도 무방합니다. 다만, 칩 제작에 제출할 최종 설계 물은 내부 절차(DRC 부합 여부, 시뮬레이션의 정확성)를 거쳐 선정 합니다. 신청서의 대표 학생은 해당 설계에 관한 연락 임무를 받게 됩니다.

질문2]  참여자에게 "독립 심화 학습 " 3학점으로 인정이 되는 것인가요?

그렇지 않습니다. MPW 제작은 교내 학사 운영과 무관한  외부 공모입니다. "독립 심화 학습"으로 학점을 받으려면 이미 공지된 대로 수강 신청을 했어야 합니다. 이번 학기 "독립 심화 학습" 학점 신청은 마감 되었습니다. 

질문3] "컴퓨터 구조" 수업은 들었지만 "VLSI 설계"를 수강하지 않아도 괜찮을까요?

신청서의 연계 학과목은 이번 MPW와 연계된 수업 과정이 우리 학교 내에 개설 되어 있다는 뜻입니다. 이를 선수 과목으로 이수해야 하는 조건은 아닙니다.해당 과목의 수강하지 않고도 설계를 할 수 있다면 능력자 입니다. 능력을 보여 주세요.

질문4] 한 학기 동안 설계하는 것인가요?

MPW 제작은 외부 공모이며 학사 일정과는 무관 합니다. 11월 중순에 예정된 설계물 제출 시한 전까지 완료해야 합니다.

질문5] 관련 이론이나 수업을 따로 진행하나요? 아니면 개인이나 팀이 처음부터 따로 공부해서 진행하는 것인가요?

관련 수업은 따로 없습니다. 반도체 전공 트랙에서 매주 반도체 설계에 관한 세미나와 강좌를 개최할 것이므로 참여 하고 질문 하십시요. 세부 학습은 학생의 역량에 달렸습니다. 자율적으로 참여 하십시요.

질문6] 이번 신청 접수에 명단을 올리지 않았더라도 MPW 제작에 참여 할 수 있습니까?

없습니다. 모든 학생의 무질서한 요구를 모두 수용 할 수 없기 때문 입니다. MPW 제작 의사가 있고 이를 성실히 수행하겠다는 약속을 해야 합니다.

질문7] "독립 심화 학습"을 신청한 경우 MPW 제작에 선정되지 않았더라도 학점이 부여 되나요?

"독립 심화 학습"의 학점과  MPW 제작 여부는 별개 사항 입니다. 모든 MPW 제작 신청이 선정으로 이어지지 않습니다. MPW 제작과 학사 운영이 별개로 진행 되는 이유 입니다. "독립 심화 학습"을 신청한 학습 조는 자신들이 제출한 학습 계획에 맞게 결과를 도출 해야 하며 공지된 요구에 부합할 경우에 학점이 부여 됩니다.

질문8] MPW 신청 접수 시 개별 아이디어를 지원 할 수 있습니까?

개별 아이디어를 원할 경우 8월 30일 MPW 접수 설명 세미나 전까지 신청서를 작성해 와서 승인을 받도록 하십시요.

질문9] 아날로그 회로를 설계하고 싶습니다.

30일에 열리는 세미나에서 행할 MPW 제작 지원의 설명과 접수는 디지털 회로에 한 합니다. 아날로그 회로의 경우 이종욱 교수님께 문의 하십시요.

추가 문의는 아래 e-mail을 통하십시요.

국일호 (goodkook@khu.ac.kr)


[주간 세미나 공지] "내 칩(My Chip)" MPW 신청자 최종 모집 (2023년 8월 30일)

[주간 세미나 공지] "내 칩(My Chip)" MPW 신청자 최종 모집 (2023년 8월 30일)

날자: 2023년 8월 30일
장소: 전자정보 대학관 211-2호
내용:

2023년 1차 "내 칩(My Chip)" MPW의 신청 마감일이 8월 31일로 다가옴에 따라 신청 내용과 신청서 작성을 설명 합니다. MPW에 참여하고자 하는 학생은 이번 세미나에 꼭 참석해서 신청서 작성을 마쳐야 마감일 전에 접수 할 수 있습니다.

이번 MPW에 신청 예정인 설계는 총  6개의 설계 입니다.

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]
1) 이번 MPW의 칩 크기가 1000x1000um 에 불과하여 큰 설계를 넣을 수 없습니다.
2) 따라서 위 설계 중 1~4 항목 중 하나를 선택한 학생을 모아 팀을 만들어 신청 합니다.
3) 설계 5, 6은 공정 단계에서 큰 설계가 반영될 경우를 대비해 신청하려는 것입니다. 둘 중 하나를 선택 하십시요.
4) 중복 선택 가능하며 수요일 세미나 시간에 조정 하도록 합니다.
5) 위의 설계 이외에 다른 설계를 원할 경우 준비해오면 논의하여 접수토록 합니다.

주2] 신청 접수할 개별 설계마다 참여할 구성원은 모두 각자(또는 협력으로) 해당 내용으로 설계하고 가장 우수한(DRC 문제가 없고 시뮬레이션 결과가 적절히 이뤄진) 설계물을 제출 할 것입니다.

주3] 신청한 설계가 모두 선정 된다는 보장은 없습니다(접수 건수에 따라 변경 됨). 향후 MPW 는 매월 계속 될 예정이라고 하니 다음 차수를 위해 준비 되도록 설계를 진행 합니다.

주4] MPW 참여는 "심화학습"의 신청 학점과 무관 합니다. "심화학습" 학점 신청자들은 신청한 내용대로 학습을 진행 하십시요.


2023년 8월 21일 월요일

[반도체 전공 트랙의 주간강좌와 세미나는 열린 공간입니다]

[반도체 전공 트랙의 주간강좌와 세미나는 열린 공간입니다]

1. 주간 강좌와 세미나는 학점 교과목이 아닙니다.
2. 반도체 설계에 관심이 있다면 누구나 참여할 수 있습니다.
3. 강좌와 세미나 시간 불참에 미안해 할 이유가 없습니다.
4. 학습 및 실습 사항은 게시판에 계속 공지될 것입니다. 자율적으로 참여 하십시요.
5. 실습 중 어려움이 있거나 궁금한 점은 언제든 문의 하십시요.

6. 주간강좌 및 세미나 계획(안) 참조 하십시요. [링크]

추가] '자율'이란 학습목표의 선택과 진도도 스스로 정할 수 있다는 뜻입니다. 성공적인 자율 학습에 대해 생각해 봅시다.

    개방형 온-라인 대중 교육(MOOC)에서 성공 하는 법 [링크]


2023년 8월 18일 금요일

[주간 세미나/강좌 공지] "Verilog RTL 에서 레이아웃 GDS 까지" (2023년 8월 24일)

[주간 세미나/강좌 공지] "Verilog RTL 에서 레이아웃 GDS 까지" (2023년 8월 24일)

[주1] 8월 23일(수)로 예정된 강좌는 MPW 관련 공정측과 회의가 예정되어 있어서 24일(목)로  변경 합니다. 장소와 시간은 추후 변경 될 수 있음.
[주2] 매주 수요일에 실시하던 주간 세미나/강좌는 9월 부터 일정이 변경될 예정 입니다.

[주간 강좌/세미나]
일시: 8월 24일
시간: 오전 10시 30분
장소: (추후공지)

내용:

    - "Verilog RTL 에서 레이아웃 GDS 까지"
        표준 셀 기반 디지털 반도체 회로 설계의 후반 부 자동화 도구 리뷰

    - 아래 내용을 자가실습하고 세미나/강좌 시간에 토론 합시다.

SystemC 및 SDL2 라이브러리 빌드 하는 방법

Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기

Project_6502 예제의 기능적 Co-Simulation 실시 방법

Project_6502 예제의 합성 후 Co-Simulation 실시 방법

Project_6502 예제의 합성 후 Co-Simulation 실시 방법

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

Project_6502 예제의 합성 후 Co-Simulation 실시 방법

SystemC/C++로 작성된 높은 시스템 수준의 검증 환경(테스트 벤치)을 구축하여 합성 가능한 6502 CPU의  RTL Verilog 설계를 검증했다.

Project_6502 예제의 기능적 Co-Simulation 실시 방법

이 검증 환경은 RTL 설계물이 합성을 통해 더 낮은 수준으로 전환된 후 추출된 네트 리스트 Verilog의 검증에 동일하게 적용 한다. 추상화 수준의 전이 과정에서 발생할 어떤 오류, 설계도구의 오류는 물론 인간 간여 오류에도 충분히 대처하기 위함이다. 특히 합성부터 후반부 작업단계에서 오픈 소스 도구의 사용 이라는 불안을 덜어낼 수 있다는 점에서 그 필요성과 중요성이 있다.

목차

1. 원 설계물의 항상성 유지
2. 윈도우즈와 리눅스 파일 시스템 교차 접근 방법
3. 합성 후 표준 셀 네트 리스트 파일 생성
    3-1. RTL Verilog 파일의 심볼릭 링크
    3-2. 합성에서 레이아웃 까지 자동화
    3-3. 후 검증 
    3-4. 클럭 버퍼 처리

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

1. 원 설계물의 항상성 유지

검증을 마친 RTL의 설계물을 전자회로로 전환되는 과정은 합성, 자동배치, 자동배선 등 자동화 변환 도구(design automation tools)에 전적으로 의존하게 된다. 이에 자동화 도구의 신뢰성이 매우 중요하다. 더블어 자동화 도구를 사용하면서 최적화를 위해 또는 도구의 사용조건에 따라 원 설계물에 수정이 가해질 수 있다. 아주 작은 수정이더라도 간과해서는 않되며 끊임없이 검증 되어야 한다. 이에 지켜야 할 기준으로 테스트 환경의 변경은 허용되지 않아야 함은 물론이며 원 설계물이 임의로 복사 편집되지 않도록 관리 되어야 한다.

설계과정에서 생산성 높은 도구의 사용은 설계시간의 단축 뿐만 아니라 재귀적 반복으로 인한 작업자의 피로도 상승에 따른 오류 개입을 피할 매우 중요한 요소다. 윈도우즈의 문서 편집기는 리눅스의 그것보다 매우 직관적며 편이성 또한 높다. SystemC와 C++ 언어를 이용한 테스트 벤치의 제작도구로 사용할 Visual Studio의 생산성(특히 소프트웨어 디버깅)이 매우 높다.

우리가 정립할 설계과정(design flow)에서 C++ 컴파일러 Visual Studio와 HDL 시뮬레이터 QuestaSim은 윈도우즈 체제에서 운용되며 합성 및 배치배선 도구들은 리눅스 체제에서 운용된다. 서로 다른 운영체제의 설계 파일들을 상호 교차접근하기 위해서 파일 시스템이 고려되어야 한다. 다행히 WSL(Windows Subsystem for Linux)는 윈도우즈와 리눅스사이의 응용 소프트웨어 수준에서 자유로운 파일 탐색을 허용한다. 파일경로 분리자(delimiter)의 상이함을 제외하면 실볼릭 링크(symbolic link)와 바로가기(short-cut)를 통해 두 운영체제의 파일 시스템 사이에 상호 교차접근이 가능하다.

2. 윈도우즈와 리눅스 파일 시스템 교차 접근 방법

윈도우즈와 리눅스의 파일 체계는 호환성이 없다. 하지만 WSL을 통해 설치된 리눅스와 윈도우즈 사이에 파일의 상호 접근이 허용된다. 윈도우즈는 WSL의 리눅스 디스크를 네트워크 소켓으로 접근 할 수 있다. 파일 경로는 아래와 같다.

    \\wsl.localhost\Ubuntu-20.04

윈도우즈 응용 프로그램 수준에서 리눅스 파일 접근이 가능하여 윈도우즈 파일 탐색기(Explorer)로 접근 할 수 있다.

따라서 윈도우즈의 바로가기(short-cut)로 리눅스 파일을 지정 열람이 가능하다.

리눅스 파일 시스템에도 윈도우즈의 '바로가기'에 해당하는 리눅스의 기능이 있다. 심볼릭 링크(symbolic link)다. 심볼릭 링크를 만드는 명령은 아래와 같다.

    $ ln -s <source file path/name> <target file name>

WSL으로 설치된 리눅스에서 윈도우즈의 파일을 심볼릭 링크 할 수 있다. 예를 들어 다음과 같다. 윈도우즈 파일을,

D:\home\Project_6502\Apple2_Co-Sim\Arlet_Verilog-6502_1_Async\ALU.v

리눅스 로컬 폴더의 ALU.v 로 심볼릭 링크 하면 아래와 같다.

리눅스의 입장에서 윈도우즈의 하드디스크는 /mnt 에 장착(mount)되어 있다. 운영체제는 모든 자원(디스크와 파일 뿐만 아니라 입출력 장치들 모두)을 파일의 개념으로 관리한다는 점도 기억해 두자. 위의 예는 윈도우즈 하드디스크 D: 가 /mnt/d 에 장착 되어 있다는 뜻이다.

윈도우즈와 리눅스의 가장 큰 외형상 차이는 경로명 분리자(delimiter)다. 리눅스는 슬러쉬 '/', 윈도우즈는 백-슬러쉬 '\' 다. 상호 교차 링크를 걸 때 이 차이가 귀찮다. 한때 이 문제를 고치려 했으나 윈도우즈가 예전 DOS 시절부터 사용하던 커맨드 라인에 대한 호환성을 유지해야 하므로 어쩔수 없다고 하니 참고 써야한다.

3. 합성 후 표준 셀 네트 리스트 파일 생성

Yosys는 오픈 소스 Verilog 합성(synthesis) 도구다. 이 합성기를 거쳐 생성된 표준 셀(standard cell) 네트리스트를 Verilog로 추출하여 앞서 RTL 검증에 사용했던 테스트 환경에 적용하여 합성기의 기능을 확인하자. 이 과정을 네트 시뮬레이션 혹은 합성 후 시뮬레이션(Post-Synthesis)이라고 한다. 표준 셀의 모델은 목표 반도체 공정에서 제공하는 PDK에 포함되어 있다. 합성 후 네트리스트의 시뮬레이션에 RTL 검증에 사용했던 것과 동일한 테스트 환경을 적용함으로써 오픈 소스 합성기의 신뢰성을 담보할 수 있을 것이다. 합성 후 표준 셀 네트리스트 생성 절차는 아래와 같다.

3-1. RTL Verilog 파일의 심볼릭 링크

합성을 위한 준비는 리눅스 작업 폴더에 RTL Verilog 파일을 심볼릭 링크 시킨다. 합성할 파일들을 넣어둘 source 폴더 를 만든다.

    $ mkdir source
    $ cd source

RTL Verilog 파일을 심볼링크 시킨다. RTL Verilog는 d:\Verilog-6502_1_Async 에 있다.

    $ ln -s /mnt/d/Verilog-6502_1_Async/ALU.v ALU.v
    $ ln -s /mnt/d/Verilog-6502_1_Async/cpu.v cpu.v
    $ cd ..

3-2. 합성에서 레이아웃 까지 자동화

오픈 소스 툴 qflow 에서 합성을 실시한다. 공정을 osu050 (0.5u 2Poly/3Metal)으로 놓았다. 리눅스의 합성도구는 심볼릭 링크한 윈도우즈 파일을 중단 없이 읽어 들인다.

배선을 원할히 하기 위해 다소 느슨한 density=0.3 로 놓고 배치를 실시한다. 

배선이 완료되면 이어서 DRC, LVS, GDS 생성까지 진행 시킨다.

최종적으로 표준 셀까지 모두 합쳐진 레이아웃을 얻는다.

3-3. 후 검증 

합성에서 레이아웃을 얻을 때까지 과정은 자동화 툴의 몫이다. 최적의 결과를 얻기 위한 옵션 조정 외 설계자가 간여할 여지는 없다. 설계 자동화 도구도 응용 소프트웨어인 만큼 무조건 신뢰하기 전에 그 결과물을 검증할 필요가 있다. 아울러 설계의 최종 결과물은 전자회로라는 점을 감안 하여 논리적 기능 뿐만 아니라 물리적 특성도 검토되어야 한다. 회로의 시간지연으로 인한 글리치 발생과 클럭과의 셋업 오류는 매우 중요하게 다뤄져야 한다.

자동화 단계를 거칠 때 마다 작업 결과를 검증하기 위한 목적의 네트리스트를 Verilog 파일로 생성한다. 이를 RTL 설계 검증의 테스트 벤치에 동일하게 적용하여 오픈 소스 자동화 툴의 신뢰도를 확인 해 보기로 한다. 합성과 배치배선이 완료되면 synthesis 폴더에 다수의 베릴로그 파일이 존재한다. 그중 합성과 최적화에서 얻어진 cpu.v 와 배선 후 얻은 cpu_postroute.v 를 가지고 시뮬레이션을 실시한다.

합성과 자동 배치배선의 결과로 얻어진 Verilog 파일은 읽기가 가능한 보통의 문서다. 표준 셀라이브러리들을 하위 모듈로 둔 계층화된 구조적 모델이다. 표준 셀 하위 모듈을 부품으로 두고 상호 연결만으로 표현되어 있다. 이를 HDL 시뮬레이션 하려면 하위 모듈들의 행동을 표현한 Verilog가 제공되어야 하는데 공정의 PDK에 포함되어 있다. 위에서 사용한 자동화 도구 qflow의 공정별 PDK를 모아둔 곳은 /usr/local/share/qflow/tech/ 다. 예제의 합성에 사용한 공정은  osu050이다. 합성 후 검증에 필요한 Verilog 파일은 아래와 같다.

/usr/local/share/qflow/tech/osu050/osu05_stdcells.v
~/Project_6502/Arlet_Verilog-6502_1_Async/synthesis/cpu.v

검증은 RTL C-Simulation의 테스트 벤치를 그대로 사용한다.

[참고] Project_6502 예제의 Co-Simulation 실시 방법

QuestaSim의 do 스크립트에서 Verilog 부분만 수정하면 아래와 같다.

#*************************************************
# MTI simulation scrips for
#   Arlet's Verilog-6502
# Vendor: GoodKook
# Associated Filename: compile_syn.do
# Purpose: SystemC testbench
# Revision History: 23 Jul 2023
#*************************************************
onbreak {resume}
# create library
if [file exists work] {
    vdel -all
}
vlib work

# Verilog compile
vlog -reportprogress 300 -work work \
        //wsl.localhost/Ubuntu-20.04/usr/local/share/qflow/tech/osu050/osu05_stdcells.v

vlog -reportprogress 300 -work work \
        //wsl.localhost/Ubuntu-20.04/home/goodkook/Project_6502/Arlet_Verilog-6502_1_Async/synthesis/cpu.v

# compile and link SC source files
#sccom -reportprogress -g -work work ../sc_mem.cpp \
        -DDEBUG_MESSAGE_MEMORY -DDEBUG_MESSAGE_REGISTER
sccom -reportprogress -g -work work ../sc_mem.cpp \
        -DDEBUG_MESSAGE_REGISTER
sccom -reportprogress -g -work work ../sc_CPU6502.cpp \
        -DCOSIM_VERILOG
sccom -reportprogress -g -work work ../Apple2.cpp \
        -DCOSIM_VERILOG
sccom -link -lcomdlg32

위의 스크립트에서 Verilog 파일의 경로명에 유의하자. 리눅스 스타일로서 슬러쉬 '/' 로 구분되었고 리눅스를 장착한 WSL의 전경로명(full-path)을 모두 써줘야 한다. [주] 경로명이 매우 길다. 한줄에 빠뜨리지 않도록 한다.

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

합성후 생성된 cpu.v 에 수정 사항이 있다.

module cpu(
    output [15:0] AB,
    input [7:0] DI,
    output [7:0] DO,
    input IRQ,
    input NMI,
    input RDY,
    output WE,
    input clk,
    input reset
);

를 아래와 같이 수정 할 것.

module cpu( AB, DI, DO, IRQ, NMI, RDY, WE, clk, reset);
    output [15:0] AB;
    input [7:0] DI;
    output [7:0] DO;
    input IRQ;
    input NMI;
    input RDY;
    output WE;
    input clk;
    input reset;

* 포트에 input, output을 지정하면 자동으로 wire가 된다. 생성된 cpu.v에 해당 포트들이 중복 선언되어 있어서 컴파일 오류가 발생한다.

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

시뮬레이션 스크립트는 RTL 때와 다를바 없다.

#***********************************************
# MTI compile scrips
# Vendor: GoodKook
# Associated Filename: simulate.do
# Purpose: SystemC testbench
# Revision History: 24 Jul 2023
#***********************************************
vsim -voptargs=+acc work.sc_main -t ps

단, 시간 해상도 지정이 피코 초(-t ps, pico-second)다. 표준 셀 라이브러리의 Verilog 모델에 지간 지연을 포함하고 있다. 보통 RTL 시뮬레이션의 시간 해상도는 나노 초(ns, nano-secod)이나 물리적 특성을 다루는 후반부 시뮬레이션에서는 게이트 통과 지연을 반영한 글리치(glitch)를 표현 하므로 해상도는 이보다 세밀한 피코-초(ps, pico-second)다.

디지털 회로의 물리적인 시간지연을 감안 하지 않고 논리적 행동만을 다룰때 펑셔널 시뮬레이션(functional simulation) 또는 전단 시뮬레이션(Pre-Simulation)이라 한다. 합성 이후 실제 공정의 물리적 정보를 포함하기 시작한 후반 시뮬레이션을 타이밍 시뮬레이션(Timing Simulation), 또는 포스트 시뮬레이션(Post-Simulation)이라 한다.

3-4. 클럭 버퍼 처리

6502 CPU를 검증하기 위한 입출력 장치 구동 소프트웨어 "Apple2_Screen"을 먼저 실행 시킨다. 이어 Verilog 타이밍 시뮬레이션을 진행하자.

    run 30 us

안타깝게도 오류를 일으킨다.


원인은 셋업(set-up)과 홀드(hold) 바이얼레이션(violation)이다. 틀어진 클럭(clock skew)으로 인해 디지털 회로 플립-플롭이 오동작 했음을 의미한다. QuestaSim의 데이터 플로우(data-flow) 기능은 오류가 처음 시작된 위치를 추적하는데 도움을 준다.

클럭 신호는 칩 전체에 분포한 플립-플롭 회로들을 작동시킨다. 매우 강력한 구동 능력을 가져야 하므로 특별히 취급 되어야 한다. 큰 구동을 위해 CLKBUF1 이라는 구동 셀(driver cell)이 추가 되어 있으나 그 능력이 모자란 것으로 보인다. 합성기는 클럭 신호에 11개의 클럭 버퍼 CLKBUF1을 삽입하였다. PDK의 셀 라이브러리의 타이밍 모델에 다르면 이 버퍼는 만만치 않은 지연을 가지고 있다.

module CLKBUF1 (A, Y);
input  A ;
output Y ;
   buf (Y, A);
   specify
     // delay parameters
     specparam
       tpllh$A$Y = 0.25:0.25:0.25,
       tphhl$A$Y = 0.26:0.26:0.26;
     // path delays
     (A *> Y) = (tpllh$A$Y, tphhl$A$Y);
   endspecify
endmodule

이 문제는 추후 해결 하기로 하고 먼저 합성의 기능적 문제만을 따져보기 위해 네트리스트 cpu.v 를 수정하자. QuestaSim의 Dataflow을 통해 찾아낸 클럭 버퍼의 인스턴스 이름은 CLKBUF1_insertXX이었다. 11개의 버퍼를 코멘트 처리하고,

2334: //CLKBUF1 CLKBUF1_insert34 (
2335: //.A(clk),
2336: //.Y(clk_bF$buf0)
2337: //);
2338: //
..........................
2378: //
2379: //CLKBUF1 CLKBUF1_insert25 (
2380: //.A(clk),
2381: //.Y(clk_bF$buf9)
2382: //);
2383: //
2384: //CLKBUF1 CLKBUF1_insert24 (
2385: //.A(clk),
2386: //.Y(clk_bF$buf10)
2387: //);
2388:

시간 지연이 없는 버퍼로 대체해 넣는다.

   buf (clk_bF$buf0, clk);
   buf (clk_bF$buf1, clk);
   buf (clk_bF$buf2, clk);
   buf (clk_bF$buf3, clk);
   buf (clk_bF$buf4, clk);
   buf (clk_bF$buf5, clk);
   buf (clk_bF$buf6, clk);
   buf (clk_bF$buf7, clk);
   buf (clk_bF$buf8, clk);
   buf (clk_bF$buf9, clk);
   buf (clk_bF$buf10, clk);

수정된 cpu.v 를 재 컴파일 하여 시뮬레이션을 수행하면 펑션 시뮬레이션과 동일하게 작동 되는 모습을 볼 수 있다.

파형을 관찰 하면 표준 셀의 통과 지연이 반영되고 있는 모습을 볼 수 있다. 클럭 구동의 문제가 있지만 오픈 소스 합성기 yosys 는 기능상 문제없다. cpu_postroute.v 에 대하여 동일한 시뮬레이션을 진행하여 자동 배치배선 기능을 확인해보자.

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

[참고]

1. Digital System에서 Setup/Hold, http://www.internex.co.kr/insiter.php?design_file=notice_v.php&article_num=13&PB_1247810668=3

2. 16 Ways to Fix Setup and Hold Time Violations, https://www.edn.com/ways-to-solve-the-setup-and-hold-time-violation-in-digital-logic/

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

예제 실습: "Verilog RTL에서 GDS 레이아웃 까지" 
[이전Project_6502 예제의 기능적 Co-Simulation 실시 방법
[처음SystemC 및 SDL2 라이브러리 빌드 하는 방법 


2023년 8월 17일 목요일

Project_6502 예제의 기능적 Co-Simulation 실시 방법

예제 실습: "Verilog RTL에서 GDS 레이아웃 까지"[3/4]

Project_6502 예제의 기능적 Co-Simulation 실시 방법

SystemC/C++로 작성된 검증 환경(테스트 벤치)의 목적은 합성 가능한 RTL의 Verilog 설계물을 검증하기 위한 것이다. 검증 환경의 구축에 C++를 동원한 높은 수준의 컴퓨팅언어를 사용하는 이유는 실제와 동일한 환경을 마련하기 위함이다. 추상성이 낮은 HDL 테스트 벤치로는 검증에 사용할 테스트 입력이 단순화 될 수 밖에 없다.

CPU를 설계하여 그를 검증하기 위한 가장 적절한 환경은 규모가 작더라도 입출력 장치를 갖춘 컴퓨터다. 앞서 구성한 SystemC/C++ 검증 환경은 6502 CPU를 사용하는 컴퓨터다.

Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기

CPU가 운용하게 될 메모리와 입출력 장치(키보드와 스크린)를 높은 추상화 수준에서 구축하였다.

아울러 CPU가 채택된 소규모 컴퓨터에서 실행 될 펌웨어(모니터 프로그램)을 적용해야 하는데, Apple-1 이 처음 발매 되었을 때 사용되었던 Wozniak[Link]의 모니터 롬 파일을 적재 시켰다. Co-Simulation으로 Apple-1의 모니터 프로그램 사용자 메뉴얼[Link]에 따라 작동 시킴으로써 6502 CPU의 RTL을 검증 하였다.

참고:

1. Steve Wozniak, https://en.wikipedia.org/wiki/Steve_Wozniak
2. Apple-1 Operation Manual, https://archive.org/details/Apple-1_Operation_Manual_1976_Apple_a

목차:

1. QuestaSim
2. 컴파일 스크립트
3. 시뮬레이션 스크립트
4. Co-Simulation 실행

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

1. QuestaSim

가장 믿을 만한 HDL 시뮬레이터로 VHDL, Verilog, SystemVerilog 뿐만 아니라 SystemC 를 지원한다. 이를 위해 GCC/G++ 를 내장하고 있다. 매우 고가의 시뮬레이터 이나 인텔 FPGA 툴과 함께 1년단위 라이센스를 무료로 배포하고 있다. 매우 고마운 일이 아닐 수 없다. QuestaSim의 설치는 아래 링크를 참조하자.

    https://fun-teaching-goodkook.blogspot.com/2023/07/questasimmodelsim.html

최정상 도구인 만큼 다양한 기능을 가지고 있고 사용자 매뉴얼이 2천여 쪽에 달한다. 외국어 공부할 때 사전을 다 외우지 않듯이 필요할 때 마다 찾아보기로 하자. 기능이 많다고 사용법이 어려운 것은 아니다. 매우 쉽다. 사용법을 보고 싶다면 아래 링크의 문서를 참조하라.

    http://www.ednc.com/wp/wp-content/uploads/2015/06/Questa_10.3d_tutorial.pdf

2. 컴파일 스크립트

베릴로그 파일을 시뮬레이션하려면 컴파일해야 한다. 추후 합성 과정을 거치면 컴퓨팅 언어에서 전자회로의 네트리스트로 바뀌기 전까지는 베릴로그도 컴퓨팅 언어이다. 컴퓨팅 언어로 묘사된 전자회로가 작동하는 모습을 관찰하는 것을 시뮬레이션이라고 한다. QuestaSim에서 Verilog의 컴파일 명령은 vlog 다.

    vlog <verilog filename>

수많은 옵션이 따라 붙지만 어쨌든 명령은 한개다. 컴파일 하면서 생성되는 중간 파일과 그 결과 파일은 모두 현재 작업 폴더에서 하위 폴더에 저장 되는데 이 폴더 명은 work 로 지정되어 있다. 따라서 컴파일 하기전에 work 라는 이름의 하위 폴더를 만든다.

    vlib work

앞서 VusialStudio로 SystemC와 C++의 소스 파일을 컴파일 했었다. 그때 생성되었던 실행 파일은 QuestaSim에서 사용 할 수 없다. 다행히도 QuestaSim에 GCC/G++를 내장하고 있어서 테스트 환경으로 사용했던 C++ 소스를 변경 없이 컴파일 할 수 있다. SystemC 컴파일 명령은 sccom 이다.

    sccom <c/cpp filename>

복수의 소스 파일을 컴파일 해야한다. 개발 중에 수없이 많은 컴파일을 반복 수행해야 한다. 그때마다 일일이 명령줄에서 입력하려면 여간 피곤한 일이 아닐 수 없다. QuestaSim 은 Tcl/Tk 스크립트를 쓸 수 있지만 아주 단순한 자체 스크립트 형식을 가지고 있다. 사실 배치 파일 형식이라 커맨드 라인 입력을 나열해 놓은 것에 불과하다. Do 스크립트라고 하는데 파일 확장자가 .do 다. Project_6502 예제의 스크립트는 TB/MTI 폴더에 있다.

그 중 한 스크립트를 보자.

#****************************************************
# filename:  Apple2_Co-Sim\TB\MTI_1_Async\compile.do
# MTI simulation scrips for
#   Arlet's Verilog-6502
# Vendor: GoodKook
# Purpose: SystemC testbench
# Revision History: 23 Jul 2023
#****************************************************************
onbreak {resume}
# create library
if [file exists work] {
    vdel -all
}
vlib work

# Verilog compile
vlog -reportprogress 300 -work work ../../Arlet_Verilog-6502_1_Async/ALU.v
vlog -reportprogress 300 -work work ../../Arlet_Verilog-6502_1_Async/cpu.v +define+SIM

# compile and link SC source files
sccom -reportprogress -g -work work ../sc_mem.cpp -DDEBUG_MESSAGE_REGISTER
sccom -reportprogress -g -work work ../sc_CPU6502.cpp -DCOSIM_VERILOG
sccom -reportprogress -g -work work ../Apple2.cpp  -DCOSIM_VERILOG
sccom -link -lcomdlg32

설명이 필요 없을만큼 단순하다. 합성하기 전의 소스 컴파일에는 별다른 옵션이 필요없다. 옵션이 많이 들어간다면 뭔가 조치가 필요할 만큼 문제가 있다는 뜻이 아닐까?

3. 시뮬레이션 스크립트

컴파일을 마쳤으면 실행 시킬 차례다. 소프트웨어의 실행 파일 .exe는 저장장치에 놓여 있다가 사용자의 명령(GUI 운영체제에서는 실행파일을 더블클릭)에 따라 목표 운영체제에서 메모리에 적재된 후 작동한다. 하드웨어 언어의 문장은 병렬실행(concurrent execution)이다. 따라서 일반적인 소프트웨어 운영체제에서 실행 될 수 없다. QuestaSim의 병렬 시뮬레이션 커널에서 실행 시켜야 한다. 실행 명령은 vsim 이다.

Project_6502 예제의 스크립트는 TB/MTI 폴더에 있다. 그중 한 시뮬레이션 스크립트를 보면 다음과 같다.

#********************************************
# MTI compile scrips
# Vendor: GoodKook
# Associated Filename: simulate.do
# Purpose: SystemC testbench
# Revision History: 24 Jul 2023
#*********************************************
vsim -voptargs=+acc work.sc_main

역시 간단하다. work 폴더에 있는 컴파일 된 모듈 중 sc_main을 최상위 모듈로 삼아 시뮬레이션을 진행하도록 적재(load) 하라는 명령 뿐이다.

입출력 신호들의 파형을 보고 싶다면 시뮬레이션을 실시하기 전에 파형(waveform) 창에 추가 시켜주자.

add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/clk
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/reset
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/AB
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/DI
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/DO
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/WE
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/IRQ
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/NMI
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/RDY

4. 실행

QuestaSim을 실행 시켜 작업 폴더로 이동 후 컴파일 스크립트 실행

컴파일이 무사히 완료되면 work 라이브러리들이 표시된다. Verilog 모듈과 SystemC 모듈이 보인다.

시뮬레이션 스크립트를 실행하여 최상위 모듈을 적재한다. 최상위 모듈 sc_main 아래로 SystemC 로 작성된 메모리 모델 sc_mem과 Verilog RTL 모델이 계층적으로 구성되었음을 알 수 있다.

QuestaSim에 적재된 시뮬레이션 모듈들은 CPU와 메모리 뿐이다. 6502 CPU의 입출력 장치는 윈도우즈의 키보드와 화면을 통해 구동하기로 한다.

MSVC의 "Apple2_Screen" 을 먼저 실행 시켜 놓은 후 QuestaSim의 커맨드 창에 실행 명령을 준다. 실행 명령은 run 이다.

QuestaSim에서 실행되는 Verilog의 CPU와 윈도우즈에서 구현된 입출력장치  어플리케이션 'Apple ][ screen'을 구동하는 모습을 보여준다. 이것이 Co-Simulation 이다.

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

예제 실습: "Verilog RTL에서 GDS 레이아웃 까지"
[이전Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기
[다음Project_6502 예제의 합성 후 Co-Simulation 실시 방법


Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기

예제 실습: "Verilog RTL에서 GDS 레이아웃 까지"[2/4]

Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기

Verilog HDL과 SystemC 테스트 벤치의 Co-Simulation 예제 중 SystemC/C++ 테스트 환경을 빌드하고 실행 하는 방법을 설명한다.

목차:

1. 사전 준비
2. 예제 내려받기
3. SystemC 테스트 환경 "Apple2" 빌드
4. 입출력 드라이버 "Apple2_Screen" 빌드
5. 실행
6. 요망사항
--------------------------------------------------------------------------

1. 사전 준비

예제를 수행하기 위해 다음과 같은 시뮬레이션 도구와 사전 라이브러리가 구축되어야 한다.

- VisualStudio 2022 Community Edition
- SystemC 2.3.3
- SDL2

사전준비는 아래의 링크에 따라 설치한다.

https://fun-teaching-goodkook.blogspot.com/2023/08/systemc-sdl2.html

2. 예제 내려받기

아래 링크에서 예제를 내려받아 압축을 푼다.

https://drive.google.com/file/d/152hO9EkAhfQ6mv0biaNVylZcI79n-4Sa/view?usp=drive_link

압축을 푼 후 폴더 구조에 유의하자.

- Verilog RTL 소스를 넣어 두는 폴더
- 테스트 환경 구축용 C++ 소스 파일 폴더
- VisualStudio 프로젝트 작업 폴더
- QuestaSim 작업 폴더

3. SystemC 테스트 환경 "Apple2" 빌드

예제를 푼 폴더에서 MSVC 폴더를 찾아 들어가면 Apple2.sln 이 있다.

이 프로젝트를 더블-클릭하여 VisualStudio 를 실행시킨다. "Apple2"를 빌드 해보자.

헤더 파일 systemc.h 를 찾을 수 없다는 메시지.

SystemC 는 MSVC C++의 기본 라이브러리가 아니기 때문이다. 앞서 구축한 SystemC 의 소스 폴더를 인클루드 검색 폴더에 추가 시켜야 한다.

컴파일 옵션을 확인하자. 헤더파일 systemc.h 는 앞서 systemc-2.3.3의 압축을 풀었던 폴더안에 있다.

프로젝트 옵션 중  Additional Include Directories 에 추가 시키자.

그외 SystemC 라이브러리를 구축할 때 사용했던 옵션들과 일치하는지 확인해 두자.



그리고 드러나지 않은 옵션이 하나 더있다. MSVC++가 표준 C++를 완벽히 지원하지 않아서 생긴 것이라고 한다. 사실 표준으로 제정된 C++ 가 워낙 방대해서 이를 모두 준수하는 컴파일러는 없다고 한다.

다시 "Apple2"를 빌드하면 컴파일은 순조롭게 진행 되지만 링크(Link)에서 수많은 오류가 난다. 대부분 un-resolved external 들이다. 우리가 사용하려는 SystemC 가 기본 라이브러리가 아니었기에 앞서 만들어 두었던 SystemC.lib를 추가 시켜야 한다.

앞서 구축한 SystemC.lib가 저장된 곳을 찾아보자.

이 라이브러리 파일을 프로젝트의 링커 옵션에 추가 시킨다.

이제 다시 빌드하면 기분좋게 실행 파일이 만들어진다.


4. 입출력 드라이버 "Apple2_Screen" 빌드

앞서 컴파일한 "Apple2"는 6502 CPU의 HDL을 검증하기 위한 Co-Simulation 테스트 벤치였다. "Apple2_Screen"은 6502 CPU를 채택한 컴퓨터를 구성하려고 한다. 기본 입출력 장치로 화면과 키보드를 SDL2 라이브러리를 활용하여 컴파일 한다.

예제의 ...\Project_6502\Apple2_Co-Sim\TB\MSVC\Apple2_Screen 에 MSVC 프로젝트 파일이 있다. 더블 클릭하여 빌드하면 헤더파일 SDL.h을 찾지 못한다는 오류 메시지를 보게된다. SDL2 의 압축을 풀었던 폴더에서 include 에 SDL.h 가 있다. 컴파일러 Additional Include Directories 에 추가시키자. 이 프로젝트는 SystemC 를 사용하지 않으므로 다른 옵션을 수정할 필요는 없다.

링크 시 un-resolved externals 라는 에러가 나올텐데 이 역시 SDL2.lib 를 추가시키지 않았기 때문이다. 찾아서 Linker:Input의 Additional dependencies 에 추가시키자.

다시 빌드하면 무난히 컴파일이 끝난다.

5. 실행

아직 Verilog 를 포함하지 않은 단계이지만 SystemC 만으로 만들어 놓은 테스트 환경만 실행시켜보자. 두개의 MSVC 어플리케이션을 만들어 놓았다. 두 어플리케이션 사에에 통신은 Windows IPC 중 PIPE 를 통해 데이터를 주고 받는다.

Apple2 테스트 벤치는 여러가지 시험을 할 수 있도록 작성되었다. sc_CPU6502.h 에 어떤 테스트를 할지 결정하는 define 매크로가 있다.

// Type of Test
#define TEST_MEMORY
//#define TEST_APPLE2_SCREEN
//#define TEST_APPLE1_SCREEN
//#define TEST_KEYBOARD
//#define TEST_BINARY_LOADER

매트로 정의 #define 앞에 붙은 코멘트를 제거함으로써 테스트할 항목을 지정할 수 있다. 키보드 입출력을 테스트 하려면 아래와 같이 코멘트를 지우고 Re-Build 한다.

//#define TEST_MEMORY

#define TEST_KEYBOARD

"Apple2_Screen" 프로젝트를 활성화 한 후 F5 키를 눌러 실행 시킨다. 이어 "Apple2" 프로젝트에서 F5를 눌러 실행 시행킨다. MSVC에서 F5 키는 디버그 실행을 의미한다. 그외, F9는 브레이크 설정, F10, F11은 소스코드 trace-in/out이다. MSVC의 다양한 디버깅 기법을 스스로 익혀보기 바란다.

"Apple2_Screen" 을 실행시켜 화면에 띄워진 "Apple ][ screen" 에 타이핑을 하면 입출력되는 모습을 보게 될 것이다.

* Verilog로 작성된 RTL의 CPU가 사용할 메모리를 SystemC 로 모델링 하였다. 이 메모리 모델이 추후 적용할 CPU에서 읽기 및 쓰기 동작에 부합 하는지 테스트 하기 위해 sc_CPU6502 라는 SystemC 모듈이 작성 되었다. 이 모듈은 실제로 6502 CPU의 기능을 수행 하지 않고 단지 메모리 접근 타이밍 만을 모델링 한 것이다. 이런 모델을 BFM (Bus Functional Model) 이라 한다. 

6. 요망사항

아직 Co-Simulation 단계에 들어가지 않았고 SystemC/C++ 로 Verilog HDL을 검증하기 위한 환경을 구축하였다. 예제의 C++와 SystemC를 모두 이해하려면 다소 시간이 필요하다. 앞으로 수차례에 걸쳐 살펴볼 것이다. 너무 어렵게 생각하지 않길 바라며 현재 위치에서 소스를 훑어보고 전체적인 구조와 흐름을 파악해 보자. 추후 강의 시간에 질문할 꺼리가 생기길 바란다.

[읽어보기]
디지털 반도체 설계자가 알아야할 C++ 언어

-----------------------------------------------------------------------
[이전SystemC 및 SDL2 라이브러리 빌드 하는 방법
[다음Project_6502 예제의 기능적 Co-Simulation 실시 방법

2023년 8월 16일 수요일

SystemC 및 SDL2 라이브러리 빌드 하는 방법

예제 실습: "Verilog RTL에서 GDS 레이아웃 까지"[1/4]

SystemC 및 SDL2 라이브러리 빌드 하는 방법

반도체 설계 HDL을 검증하기 위한 도구로서 SystemC와 SDL2을 적극 활용한다. 이에 필요한 라이브러리를 구축하는 방법을 설명한다.

목차:

A. 선행 설치할 컴파일러 도구들
    1. VisualStudio 2022 Community Edition
    2. QuestaSim/ModelSim Intel FPGA Starter Edition
B. 선행 구성이 필요한 라이브러리
    1. SystemC
    2. SDL2

[읽어보기]
디지털 반도체 설계자가 알아야할 C++ 언어

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

A. 선행 설치할 컴파일러 도구들

1. VisualStudio 2022 Community Edition

 - VisualStudion Installer에서 [수정] 버튼을 눌러 다음과 같이 설치되었는지 확인

C++ 를 이용하여 윈도우즈용 어플리케이션을 빌드하기 위한 도구 필수 선택

"C++를 사용한 데스크톱 개발" 항목에서 "설치세부정보">"선택사항" 중, 'MSVC v143 빌드도구 C++ MFC', 'Windows 11 SDK' 항목이 포함되었는지 확인 후 설치 포함 시킬것

추가 사항으로 "VisualStudio 확장개발", "C++를 사용한 Linux 및 임베디드 개발"

2. QuestaSim/ModelSim Intel FPGA Starter Edition

인텔 FPGA 개발도구 Quartus 에 포함되어 있으나 독립 설치 할 수 있음. 설치 방법은 아래 링크 참조

https://fun-teaching-goodkook.blogspot.com/2023/07/questasimmodelsim.html

* Quartus는 사용하지 않을 것이므로 QuestaSim 만 따로 설치 할 것.
* 설치시 반드시 "QuestaSim FPGA Starter Edition" 을 선택 해야 함.

B. 선행 구성이 필요한 라이브러리

1. SystemC

SystemC-2.3.3 을 아래링크에서 다운 받아 압축을 풀 것

https://www.accellera.org/images/downloads/standards/systemc/systemc-2.3.3.tar.gz

압축을 푼 폴더 탐색하여 MSVC 프로젝트(솔루션) 파일 더블클릭

......\systemc-2.3.3\msvc10\SystemC\SystemC.sln

VisualStudio 'Solution Explorer'의 SystemC의 빌드 옵션 변경


- Build Configuration를 Debug(x64)로 할 것
- Configuration Properties: Advanced 에서 Character Set을 반드시 Not Set 혹은 Use Multi-Byte Charadter Set 으로 할 것. Uni-Code 는 않됨.

C++의 Code Generation 에 Run-Time Library로 Multi-Threaded Debug(/MTd) 로 할 것

* Multi-Threaded Debug DLL 로 해도 좋으나 추후 어플리케이션 exe를 빌드할 때 맞춰 줄 것. 타 컴퓨터에서 어플리케이션 실행을 위해 VisualStudio C++ 런타임 DLL을 설치하는 절차가 필요함. 그외 디버깅 할 때 DLL을 로딩하는 경우가 생겨서 불편함.

C++:Language의 Enable Run-Time Type Information 에 Yes(/GR) 선택

컴파일 옵션 설정을 완료하고 SystemC 라이브러리 Build 하면 x64\Debug 에 SystemC.lib 가 생성 되었으므로 확인 할 것

2. SDL2

Simple Direct Layer 사이트를 방문하여 최신 소스코드를 내려받기

https://www.libsdl.org/

* SDL은 2D 게임 제작용으로 널리 사용되는 라이브러리인데 각종 멀티미디어 설계의 테스트벤치 제작용에 유용하게 사용할 수 있음. 익혀두면 널리 이로울 것임

압축을 푼 후 VisualC 폴더에 SDL.sln 실행하면,


프로젝트 하위 폴더에 SDL2.dll과 SDL2.lib  파일이 생성되어 있음

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

예제 실습: "Verilog RTL에서 GDS 레이아웃 까지" 
[다음Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기


2023년 8월 15일 화요일

[주간 세미나/강좌 공지] 오픈 소스 표준 셀 기반 설계(2) (2023년 8월 16일)

[주간 세미나/강좌 공지] 오픈 소스 표준 셀 기반 설계(2) (2023년 8월 16일)

[주간 강좌]
일시: 8월 16일
시간: 오전 10시 30분
장소: 전자정보대학관 211-2

내용:

    - 6502 RTL+SystemC/C++ Co-Simulation (실행 데모)
    - Pre- & Post-Simulation/SDF
    - 시뮬레이션은 QuestaSim을 사용 할 것임.
    - 아래 예제 파일을 개인 컴퓨터에 담아와서 수업 중 실습 및 질의응답

[예제파일 다운로드]
SDL2 라이브러리
SystemC 라이브러리

[주간 세미나]

일시: 8월 16일
시간: 오후1시
장소: 전자정보대학관 211-2

내용:
    - 독립심화학습 및 "MyChip 제작 서비스" 참여자 확인 팀 구성(CMOS 디지털 회로 부분)
    - 오픈소스 툴 플로우 OpenRoad 소개
    - 메모리 컴파일러 툴 소개


2023년 8월 14일 월요일

OpenRAM 오픈소스 메모리 컴파일러(RAM/ROM 생성기)

OpenRAM 오픈소스 메모리 컴파일러(RAM/ROM 생성기)

시스템 반도체에서 소프트웨어는 큰 비중을 차지한다. CPU 뿐만 아니라 기본 펌웨어(모니터)를 운영하기 위해 메모리를 내장 토록한다. 메모리는 치밀하게 반복된 구조를 가지고 있을 뿐만 아니라 디지털 비트로 따지면 매우 규모가 크다. 따라서 집적도가 높도록 따로 모아 생성한다.

OpenRAM은 메모리 RAM과 ROM을 생성해주는 도구다. 아래 링크를 참조한다.

    https://openram.org/

설치는 Git 을 통해 생성 스크립트를 내려 받을 수 있다. 주로 Python과 Makefile을 이용한 스크립트들이고 그외 PDK 가 필요하다. 도커(docker) 기반으로 설치하는 까닭에 온갖 것들을 다 끌어와서 쓸데없이 용량이 커진다(Python 기반이라 anaconda 또는 miniconda와 관련 패키지를 모두 끌어온다). 나중에 설치 최적화 할 때 정리하면 좋겠으나 설명 문서에 따르면 폴더구조를 바꾸지 말기를 권장 하고 있다.

스크립트를 내려받자.

    $ git clone https://github.com/VLSIDA/OpenRAM

준비된 예제를 실행 시켜보자.

    $ cd OpenRAM
    $ source setpaths.sh    # Env. vars for OpenRAM
    $ cd macros            # Examples
    $ make

파라메터 없이 make 유틸리티를 실행하면 아래와 같은 메시가 나타난다. 준비된 예제들의 목록이다.

Using OpenRAM at /home/goodkook/opencircuits/OpenRAM/compiler
 (which is version v1.2.29)
SRAM Configurations:
 - example_config_1rw_1r_scn4m_subm
 - example_config_1rw_1w_scn4m_subm
 - example_config_1rw_2mux_scn4m_subm
 - example_config_1w_1r_scn4m_subm
 - example_config_2rw_scn4m_subm
 - example_config_big_scn4m_subm
 - example_config_freepdk45
 - example_config_giant_scn4m_subm
 - example_config_medium_scn4m_subm
 - example_config_scn4m_subm
 - freepdk45_sram_1rw1r_32x2048_8
 - scn4m_subm_sram_16kbyte_1rw1r_32x4096_8
 - scn4m_subm_sram_1kbyte_1rw1r_32x256_8
 - scn4m_subm_sram_2kbyte_1rw1r_32x512_8
 - scn4m_subm_sram_32kbyte_1rw1r_2x32x4096_8
 - scn4m_subm_sram_4kbyte_1rw1r_32x1024_8
 - scn4m_subm_sram_8kbyte_1rw1r_32x2048_8
 - sky130_sram_1kbyte_1r1w_8x1024_8
 - sky130_sram_1kbyte_1rw1r_32x256_8
 - sky130_sram_1kbyte_1rw1r_8x1024_8
 - sky130_sram_1kbyte_1rw_32x256_8
 - sky130_sram_1rw1r_tiny
 - sky130_sram_1rw_tiny
 - sky130_sram_2kbyte_1rw1r_32x512_8
 - sky130_sram_2kbyte_1rw_32x512_8
 - sky130_sram_4kbyte_1rw1r_32x1024_8
 - sky130_sram_4kbyte_1rw_32x1024_8
 - sky130_sram_4kbyte_1rw_64x512_8
ROM Configurations:
 - sky130_rom_1kbyte

이 중에서 하나를 골라서,

    $ make example_config_1rw_1r_scn4m_subm

메모리 컴파일러를 작동 시키기 위한 도구들을 검사하는데, 처음 실행인 경우 OpenRAM/miniconda 에 독립 실행할 수 있도록 도커(docker)를 구성한다. 이때 온갖 필요한 패키지들을 끌어온다. OpenRAM/miniconda/bin 폴더를 보면 익히 봐왔던 magic, netgen 등이 포함되어 있음을 알 수 있다. 굳이 이래야 하나 싶지만 하드디스크 용량은 풍부하고 사용자 마다 설치 환경이 다르니 일일이 설치하는데 곤란을 겪지 않도록 배려 했다. 도커(Docker)의 큰 목적 이기도 하고......

도커를 구성하던 중간에 에러 메시지가 뜬다.

ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'

도커를 구성하는데 필요한 패키지 목록 파일을 못찾았다는 불평이다. 이어서, 아래와 같은 문구를 보게 된다.

Traceback (most recent call last):
  File "/home/goodkook/opencircuits/OpenRAM/sram_compiler.py", line 42, in <module>
    openram.init_openram(config_file=args[0])
  File "/home/goodkook/opencircuits/OpenRAM/compiler/globals.py", line 205, in init_openram
    from openram import characterizer
  File "/home/goodkook/opencircuits/OpenRAM/compiler/characterizer/__init__.py", line 14, in <module>
    from .linear_regression import *
  File "/home/goodkook/opencircuits/OpenRAM/compiler/characterizer/linear_regression.py", line 8, in <module>
    from sklearn.linear_model import Ridge
ModuleNotFoundError: No module named 'sklearn'
make[1]: *** [Makefile:85: example_config_1rw_1w_scn4m_subm.ok] Error 1
make: *** [Makefile:95: example_config_1rw_1w_scn4m_subm] Error 2

Make 유틸리티가 작동 하면서 에러가 났을 경우 그 이유를 보려준다. Python의 sklearn 이라는 모듈이 설치되어 있지 않다고 한다. Python의 추가 모듈 설치는 pip로 한다.

    $ sudo pip3 install scikit-learn

다시 make 유틸리티를 실행 시켜보자.

    $ make example_config_1rw_1r_scn4m_subm

필요한 도구들이 준비되었다면 성공적으로 메모리가 생성될 것이다. 이제 도구는 준비되었다. PDK에 맞도록 포팅할 일이 남았다.