과정 · BSV
규칙으로 설계하는 동시 회로
규칙과 인터페이스로 동시 동작을 설계합니다.
만드는 것
- 갱신이 원자적 rule로 표현되는 카운터와 상태 기계
- 인터페이스의 method로 동작을 드러내고 서로 결합하는 모듈
- 준비 조건을 컴파일러가 스케줄하는 FIFO 파이프라인
준비 개념
레지스터, 클록 에지, 조합 회로가 무엇인지 알면 충분합니다. 다른 HDL 경험은 필요하지 않습니다.
목차
24개 장기초
- 모듈과 인터페이스
모듈 하나와 rule 하나로 된 가장 작은 BSV 프로그램을 실행해 출력을 예측하고, 레지스터 하나와 value method 하나를 가진 모듈과 그것을 읽는 테스트벤치를 읽고 실행한 뒤 한 곳을 바꿔 봅니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- Bool·Bit와 순수 함수
Bool과 Bit#(n)을 구분하고, 연결·선택·축약 연산으로 비트 벡터를 조립하고 분해하며, 호출한 자리에서 조합 회로가 되는 순수 함수를 작성합니다.
확인 지점: 실습 문제를 제출해 채점을 받습니다
- 타입·폭·명시적 변환
크기가 정해진 값이 스스로 폭을 바꾸지 않는 이유, 크기 없는 리터럴이 대상의 폭을 받는 규칙, 0 확장·부호 확장·절단·재해석에 쓰는 함수를 다룹니다.
확인 지점: 실습 문제를 제출해 채점을 받습니다
- 선택·case·don't-care 값
?: 연산자, case, 함수로 조합 선택 회로를 만들고, 모든 경로에 값을 주며, 아무도 관찰할 수 없는 자리에만 don't-care 값 ?를 씁니다.
확인 지점: 실습 문제를 제출해 채점을 받습니다
- 레지스터와 rule 하나
mkReg로 레지스터를 선언하고 rule 하나에서 <=로 쓰며, rule 안의 읽기는 사이클 시작 값을 보고 쓴 값은 다음 사이클에 나타난다는 사실을 확인합니다.
확인 지점: 실습 문제를 제출해 채점을 받습니다
규칙과 method
- guard: 유지와 정지
rule의 명시 조건으로 레지스터를 유지하고, 카운터를 한계값에서 정확히 멈추며, 한 rule이 남긴 상태가 다음 rule의 조건을 만족하지 못할 때 생기는 조용한 빈 구간을 찾습니다.
확인 지점: 실습 문제를 제출해 채점을 받습니다
- 상태를 공유하는 rule: 원자성·덮어쓰기·충돌
같은 사이클에 rule 두 개를 놓습니다. 서로 다른 상태를 다루면 둘 다 실행되고, 한 레지스터에 쓴 두 번째 쓰기는 경고와 함께 첫 쓰기를 덮으며, 진짜 충돌에는 읽기/쓰기 순환이 필요합니다. 모든 실행은 하나의 원자적 전이입니다.
확인 지점: 실습 문제를 제출해 채점을 받습니다
- method: value·Action·ActionValue
결과 타입으로 세 종류의 method를 구분하고, rule에서 호출하며, method 자신의 준비 조건이 호출한 rule의 실행 여부를 어떻게 정하는지 확인합니다.
확인 지점: 실습 문제를 제출해 채점을 받습니다
- 준비 조건·모듈 인자·합성 경계
매개변수·인자·proviso가 있는 모듈을 정의하고, method의 준비 조건을 헤더에 두어 조건이 거짓이면 호출하는 모든 rule이 멈추게 하며, 스택을 push와 pop으로 추적하고, 합성 경계에서 인터페이스가 지켜야 할 조건을 확인합니다.
확인 지점: 예제를 실행해 예측과 비교합니다
타입·패키지·값
- 사용자 정의 타입
typedef로 설계가 다루는 타입을 정의합니다. 이름만 바꾸는 동의어, 이름 붙은 레이블의 enum, 이름 붙은 필드의 구조체, 태그와 함께 대안 하나를 담는 tagged union을 선언하고, packed 폭을 계산하며, union을 패턴 매칭으로 읽습니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- rule로 만드는 상태 기계
설계의 상태에 enum으로 이름을 붙이고, 현재 상태를 레지스터에 두고, guard가 겹치지 않는 상태별 rule을 쓰며, 두 상태 기계를 사이클 단위로 예측합니다.
확인 지점: 이 장의 확인 문제에 답하세요
- 요구사항으로 설계하기
글로 된 요구사항을 인터페이스, 레지스터 하나, 올바른 우선순위로 갱신하는 동작으로 옮기고, 모델로 동작을 예측한 뒤, clear와 enable이 있는 카운터를 직접 만들어 채점받습니다.
확인 지점: 실습 문제를 제출해 채점을 받습니다
- 어휘 요소
bsc가 소스를 토큰으로 나누는 규칙과 식별자, 키워드, 주석, 정수·Real·문자열 리터럴, 컴파일러 지시어의 정확한 표기법을 다룹니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- 패키지
파일 하나가 패키지 하나이며, export가 공개할 이름을, import가 들여올 이름을 정하고, 패키지 경계는 하드웨어 경계가 아니라 이름의 공개 범위라는 사실을 다룹니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- 변수·반복문·리터럴의 문맥
변수는 값을 저장하지 않고 이름을 붙이며, 선언된 타입이 크기 미지정 리터럴의 의미를 정하고, 상수 경계의 반복문은 elaboration 중에 정해진 양의 하드웨어로 펼쳐진다는 사실을 다룹니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- 타입클래스와 proviso
타입클래스는 오버로드 연산의 묶음에 이름을 붙이고, 인스턴스는 타입별 구현을 제공하며, proviso는 다형 정의가 필요로 하는 인스턴스와 폭 관계를 선언하는데, 이 모두가 컴파일 시점에 결정되어 선택 회로를 만들지 않습니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- 패턴 매칭
패턴으로 구조화된 값을 분해합니다. 상수·변수·와일드카드 패턴, struct와 tagged union 패턴, 패턴 매칭 case, 조건 안의 패턴 검사, match 선언을 다룹니다.
확인 지점: 예제를 실행해 예측과 비교합니다
심화
- 값으로 다루는 rule
rule을 Rules 값으로 만들어 addRules로 모듈에 추가하고, elaboration에서 한 번 일어나는 호출과 추가된 rule이 실행되는 여러 사이클을 구분합니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- 정적·동적 의미론: 단계와 스케줄링 관계
BSV 설계의 의미를 정하는 세 단계인 elaboration, scheduling 분석, 실행과, 기본 모듈이 method 사이에 선언하는 C·CF·SB·SBR 관계가 어떤 호출을 같은 사이클에 둘 수 있는지 정하는 방식을 다룹니다.
확인 지점: 이 장의 확인 문제에 답하세요
- StmtFSM으로 만드는 유한 상태 기계
여러 사이클에 걸친 과정을 Stmt로 적고 mkFSM으로 실행하는 방법과 그 동작, 곧 seq에서 Action 하나가 반영되는 단계 하나라는 규칙, repeat·while·for 반복, await 대기, par 분기, 시작한 실행이 끝난 뒤에만 종료하는 방법을 다룹니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- FIFO·split·라이브러리 primitive
대부분의 설계가 쓰는 라이브러리 요소를 계약으로 읽습니다. 결과 타입이 분할 위치를 정하는 split과 튜플, implicit condition으로 호출자를 기다리게 하는 FIFO method, 준비 상태를 값으로 알리는 FIFOF 플래그, 시뮬레이션에만 있는 시스템 태스크를 다룹니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- 어트리뷰트로 컴파일러 제어하기
요청·증명되는 단언·신뢰되는 단언으로 나뉘는 어트리뷰트, synthesize와 noinline 경계, always_ready·always_enabled를 포함한 포트 이름 어트리뷰트, descending_urgency·execution_order·preempts와 rule 단언 같은 스케줄링 어트리뷰트, split과 클록·리셋·doc 어트리뷰트를 다룹니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- BSV 설계에 RTL 포함하기
타입이 있는 BSV와 외부 RTL을 잇는 import "BVI" 계약, enable·ready를 포함한 value method와 Action method 대응, default_clock과 default_reset, 모든 method 쌍의 schedule 관계, 정적 파라미터, 그리고 실패가 BSC 컴파일·Verilog elaboration·시뮬레이션 가운데 어디서 생겼는지 찾는 방법을 다룹니다.
확인 지점: 예제를 실행해 예측과 비교합니다
- BSV 설계에 C 포함하기
import BDPI로 BSV에서 C 함수를 호출합니다. 선언, 양쪽이 보는 전달 타입, packed 값과 넓은 값, 다형적 import, 반환 형태, 경계에서 생기는 오류의 모습을 다룹니다.
확인 지점: 예제를 실행해 예측과 비교합니다