본문으로 건너뛰기
code0.HDL

Chisel 실습

짧은 Chisel 문제로 핵심 개념을 익혀 보세요. 회로 생성기를 수정하고 chiseltest 테스트벤치를 실행한 다음 풀이를 제출해 보세요.

작성 중인 코드와 완료한 문제는 이 브라우저에 저장됩니다.

장 바로가기

Module과 IO, 그리고 := 연결

문제 1개

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

  1. 01구현 문제생성기 루프로 상수 곱셈기 만들기Scala if로 factor의 비트를 검사해 생성기 루프가 in * factor에 필요한 덧셈기만 만들게 합니다.

Bool·UInt와 연산자

문제 1개

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

  1. 05구현 문제패리티 비트로 데이터 프레임 만들기7비트 데이터 위에 짝수 패리티 비트를 붙인 8비트 프레임을 만듭니다.

폭·SInt·산술

문제 2개

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

  1. 03검증 문제부호 있는 오프셋 더하기음수 오프셋이 8비트 주소를 앞으로 옮기는 원인을 찾아 고칩니다.
  2. 04구현 문제+&로 자리올림 보존하기4비트 Chisel 덧셈기가 5비트 합에 자리올림을 보존하도록 고칩니다.

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

문제 1개

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

  1. 06검증 문제고장 신호로 팬 속도 강제하기센서 고장 신호가 팬을 최고 속도로 강제하지 못하는 원인을 찾아 고칩니다.

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

문제 3개

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

  1. 20검증 문제burst 길이 표 고치기MuxLookup으로 만든 버스트 길이 표가 두 코드에서 잘못된 전송 횟수를 반환하는 원인을 찾습니다.
  2. 21구현 문제점검 과제 A: 네 연산 가운데 하나 선택하기2비트 sel이 a와 b에 적용할 비트 연산 네 개 가운데 하나를 골라 y에 출력하는 조합 회로를 처음부터 작성합니다.
  3. 22구현 문제가장 낮은 번호의 요청 선택하기번호가 가장 낮은 요청자의 데이터를 선택하고 요청이 없으면 0을 출력합니다.

조건부 갱신·유지·리셋

문제 1개

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

  1. 13검증 문제리셋에서 sticky 플래그 지우기옆의 오류 카운터는 지워지는데 오류 플래그만 리셋 뒤에도 남는 원인을 찾아 고칩니다.

RegNext·지연·파형

문제 3개

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

  1. 11구현 문제1인 사이클이 아니라 상승 에지 세기입력을 한 사이클 늦춘 레지스터를 추가해 0에서 1로 바뀌는 변화마다 한 번만 세게 합니다.
  2. 29구현 문제PWM duty를 주기 경계에서 래치하기듀티 레지스터를 주기가 끝나는 에지에서만 갱신하고, 파형의 count와 level로 타이밍을 확인합니다.
  3. 30검증 문제일시 정지 동안 tick 분주기의 phase 유지하기일시 정지 뒤의 tick이 엉뚱한 사이클에 나옵니다. en이 0인 동안 위상이 어떻게 바뀌는지 파형에서 찾습니다.

Bundle과 Vec

문제 2개

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

  1. 07검증 문제상태 워드 형식 맞추기상태 Bundle이 16비트 워드를 잘못된 배치로 묶고 푸는 원인을 찾아 고칩니다.
  2. 08구현 문제워드의 바이트 순서 뒤집기32비트 워드를 바이트 Vec으로 읽고 바이트 순서를 뒤집어 다시 묶습니다.

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

문제 3개

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

  1. 02검증 문제생성기 루프가 무시하는 매개변수 찾기ELABORATE 줄 수를 세어 두 이득 출력 가운데 하나만 틀리는 원인을 찾습니다.
  2. 09구현 문제하위 모듈로 세 값 정렬하기두 입력 정렬기를 하나 더 인스턴스화하고 연결해 세 입력 정렬기를 완성합니다.
  3. 10검증 문제레인마다 연산 모듈 두기네 레인의 절댓값 차이가 모두 같은 값으로 출력되는 원인을 찾아 고칩니다.

ChiselEnum과 상태 기계

문제 2개

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

  1. 18구현 문제노란불 상태 추가하기두 상태인 ChiselEnum 신호등에 초록과 빨강 사이의 노란 상태를 추가합니다.
  2. 19검증 문제잘못 번호 매겨진 opcode 찾기ChiselEnum 명령 코드 디코더가 정상 명령어 인코딩 하나를 거부하는 원인을 찾습니다.

요구사항으로 설계하기

문제 1개

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

  1. 12구현 문제점검 과제 B: clear와 enable이 있는 카운터clear가 enable보다 우선하고, enable일 때만 세며, 15 다음에 0으로 돌아가는 4비트 카운터의 업데이트를 작성합니다.

메모리

문제 2개

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

  1. 14구현 문제SyncReadMem 읽기 데이터에 valid 표시하기동기 읽기 메모리가 요청한 워드를 실제로 반환하는 사이클에 유효 플래그를 올립니다.
  2. 15검증 문제같은 사이클에 레지스터 파일 읽기레지스터 파일의 두 피연산자 포트가 이전 명령어의 레지스터 값을 반환하는 원인을 찾아 고칩니다.

인터페이스와 연결

문제 2개

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

  1. 16검증 문제요청과 tag를 함께 지연시키기한 사이클 지연 단이 각 요청을 다음 요청의 태그와 함께 내보내는 원인을 찾아 고칩니다.
  2. 17구현 문제ready-valid 밸브를 양방향으로 닫기통과 조건이 있는 Decoupled 단에서 역방향 ready를 구동해 생산자와 소비자가 같은 전송을 인식하게 합니다.

다형성과 매개변수화

문제 2개

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

  1. 23구현 문제범용 hold 레지스터 만들기타입 매개변수를 받는 모듈에 gen 템플릿 모양의 레지스터를 만듭니다.
  2. 24검증 문제한계값에 맞는 카운터 폭 정하기매개변수화한 순환 카운터가 일부 설정 한계값에 도달하지 못하는 원인을 찾습니다.

하드웨어에서 출력하기

문제 2개

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

  1. 25구현 문제16진 숫자를 ASCII 문자로 바꾸기10부터 15까지의 숫자를 a부터 f로 바꾸고, %x와 %c를 나란히 출력하는 printf로 사이클마다 확인합니다.
  2. 26검증 문제start 바이트에서 프레임 체크섬 다시 시작하기printf 출력을 읽고 새 프레임이 이전 프레임의 합에 계속 더해지는 원인을 찾습니다.

테스트벤치 기법

문제 2개

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

  1. 27구현 문제trigger를 3 사이클 펄스로 늘리기펄스 확장기의 카운터를 구현하고, 실패한 expect의 단계 번호로 아직 틀린 사이클을 찾습니다.
  2. 28검증 문제done을 내지 않는 카운트다운 고치기대기 루프가 유휴 사이클 타임아웃에 걸립니다. WAIT 출력으로 카운터가 멈추는 지점을 찾습니다.