본문으로 건너뛰기
code0.HDL

과정 · Chisel

하나의 회로에서 하드웨어 생성기까지

Scala 기반 생성기로 매개변수화한 회로를 설계합니다.

만드는 것

  • Chisel 하드웨어 타입으로 포트와 논리를 구성한 모듈
  • 레지스터, Bundle, Vec을 연결한 순차 설계
  • 매개변수화한 클래스 하나로 여러 회로를 만드는 생성기

준비 개념

레지스터와 클록 에지를 알면 충분합니다. Scala 문법은 각 장에서 필요한 지점에 설명합니다. 다른 HDL 경험은 필요하지 않습니다.

하드웨어 기초

목차

17개 장

기초

  1. Module과 IO, 그리고 := 연결

    Chisel 모듈을 회로를 만드는 Scala 클래스로 읽고, 연결 :=와 Scala 이름을 구분하고, 테스트벤치 출력을 예측한 뒤 실행하고, 매개변수 하나를 바꿔 다른 회로가 만들어지는 것을 확인합니다.

    확인 지점: 예제를 실행해 예측과 비교합니다

  2. Bool·UInt와 연산자

    1비트 Bool과 여러 비트 UInt를 구분하고, 8비트 값에 비트 연산자·비트 필드·Cat·축약 연산자를 손으로 적용해 예측한 뒤 예제를 실행하고, 시프트·산술·비교가 만드는 회로와 결과 폭을 실행으로 확인하고, 패리티 프레임을 만듭니다.

    확인 지점: 실습 문제를 제출해 채점을 받습니다

  3. 폭·SInt·산술

    .W로 포트에 폭을 지정하고, Chisel이 리터럴에 정하는 폭을 읽고, 부호 있는 값이 연결과 형변환을 거치는 과정을 따라간 뒤, +가 잃는 자리올림을 +&가 보존하는 이유를 확인합니다.

    확인 지점: 실습 문제를 제출해 채점을 받습니다

  4. Mux·when·Wire와 모든 경로의 기본값

    Mux와 when으로 값을 선택하고, Wire에 기본값을 주고, 마지막 연결 우선 규칙을 출력에서 읽어 내고, 아무것도 구동하지 않는 경로가 남으면 무슨 일이 생기는지 확인합니다.

    확인 지점: 실습 문제를 제출해 채점을 받습니다

  5. MuxCase·MuxLookup·PriorityMux·Mux1H로 선택하기

    MuxCase·MuxLookup·PriorityMux·Mux1H로 여러 입력 가운데 하나를 고르고, 선택 신호의 성질에 따라 어떤 것을 쓸지 정합니다.

    확인 지점: 예제를 실행해 예측과 비교합니다

  6. 레지스터·RegInit·클록 진행

    리셋 값이 있는 레지스터를 만들고, :=의 오른쪽에서 현재 값을, 왼쪽에서 다음 값을 읽은 뒤, 테스트벤치에서 poke·peek·step으로 구동하며 에지 전에 움직이는 출력과 에지 뒤에만 움직이는 출력을 구분합니다.

    확인 지점: 예제를 실행해 예측과 비교합니다

  7. 조건부 갱신·유지·리셋

    when 아래에서만 레지스터를 갱신하고 그 밖에서는 유지하게 하며, 생성 방식으로 리셋이 바꾸는 레지스터를 가려내고, 암묵적 리셋이 클록 에지에서 작용함을 확인하고, 우선순위를 소스 순서로 씁니다.

    확인 지점: 실습 문제를 제출해 채점을 받습니다

  8. RegNext·지연·파형

    RegNext로 신호를 에지 하나만큼, 둘을 이어 에지 둘만큼 늦추고, 늦춘 복사본으로 상승 에지 검출기를 만든 뒤, 기록된 파형에서 리셋·poke·레지스터 변화를 읽습니다.

    확인 지점: 실습 문제를 제출해 채점을 받습니다

응용

  1. Bundle과 Vec

    이름 있는 필드는 Bundle로, 번호가 붙은 원소는 Vec으로 묶고, asUInt와 asTypeOf가 따르는 비트 배치를 읽고, Scala 인덱스와 하드웨어 인덱스를 구분하며, Flipped로 인터페이스 선언 하나를 연결의 양쪽 끝에 씁니다.

    확인 지점: 예제를 실행해 예측과 비교합니다

  2. 하위 Module·매개변수·생성기

    Module(new ...)으로 모듈 안에 모듈을 놓고 하위 입력을 모두 구동하며, require와 desiredName을 갖춘 매개변수화된 클래스 하나로 여러 정의를 만들고, companion apply로 모듈을 호출하고, for와 def로 쓴 생성기를 만들어진 하드웨어 수로 읽습니다.

    확인 지점: 실습 문제를 제출해 채점을 받습니다

  3. ChiselEnum과 상태 기계

    ChiselEnum으로 상태마다 이름을 붙이고 레지스터에 담으며, switch와 is로 분기하고, 열거형과 원시 비트를 안전하게 변환하며, Chisel이 고른 폭을 읽습니다.

    확인 지점: 실습 문제를 제출해 채점을 받습니다

종합

  1. 요구사항으로 설계하기

    글로 된 요구사항을 포트, 리셋 값이 있는 레지스터, 순서가 곧 우선순위인 when 사슬, 되돌아가는 덧셈으로 옮기고, 기능상의 clear를 암묵적 reset과 구분하며, 채점 전에 사이클 표로 설계를 검사합니다.

    확인 지점: 실습 문제를 제출해 채점을 받습니다

심화

  1. 메모리

    VecInit과 Counter로 만드는 ROM, 조합 읽기 메모리 Mem, 한 사이클 읽기 지연과 정의되지 않는 읽기를 가진 동기 읽기 메모리 SyncReadMem, 쓰기 마스크와 SRAM API, 그리고 메모리 종류를 고르는 기준을 다룹니다.

    확인 지점: 예제를 실행해 예측과 비교합니다

  2. 인터페이스와 연결

    인터페이스를 Bundle로 기술하고 <>로 한꺼번에 연결하며, 짝이 없는 필드에서 무슨 일이 생기는지 확인하고, Decoupled로 ready-valid 연결을 동작시킵니다.

    확인 지점: 예제를 실행해 예측과 비교합니다

  3. 다형성과 매개변수화

    Scala 타입 매개변수와 상한을 값 매개변수와 구분하고, 타입 템플릿·설정 객체·선택적 포트·by-name 모듈 인자로 여러 회로를 생성합니다.

    확인 지점: 예제를 실행해 예측과 비교합니다

  4. 하드웨어에서 출력하기

    printf와 cf 보간으로 회로 안에서 값을 출력하고, 하드웨어 출력과 elaboration 시점의 println을 구분하며, 컴파일러가 val에 붙이는 신호 이름을 읽습니다.

    확인 지점: 예제를 실행해 예측과 비교합니다

  5. 테스트벤치 기법

    실패한 expect를 그 값을 만든 step까지 읽어 내고, 테스트를 멈추지 않는 방식으로 사건을 기다리며, idle cycle timeout으로 느린 설계와 멈춘 설계를 구분합니다.

    확인 지점: 예제를 실행해 예측과 비교합니다