본문으로 건너뛰기
code0.HDL

요구사항으로 설계하기

글로 된 요구사항을 인터페이스, 레지스터 하나, 올바른 우선순위로 갱신하는 동작으로 옮기고, 모델로 동작을 예측한 뒤, clear와 enable이 있는 카운터를 직접 만들어 채점받습니다.

이 장에서 배울 내용

  • 말로 된 요구사항을 포트·폭·method로 이루어진 인터페이스로 옮길 수 있습니다
  • 상태 전체를 레지스터 하나에 두고, 우선순위를 한 action 안의 배타적 분기로 표현할 수 있습니다
  • 카운터를 작성하기 전에 사이클 단위로 예측하고, 요구사항에서 정상·경계·리셋 테스트 사례를 고를 수 있습니다
  • 선택형 연산기와 clear·enable이 있는 카운터를 직접 작성해 채점을 통과할 수 있습니다
이 장에서 배우는 개념
  • 요구사항으로 규칙 기반 설계
먼저 알아야 할 개념

1. 요구사항을 인터페이스로 읽습니다

앞의 모든 장은 코드에서 시작했습니다. 이 장은 실제 작업처럼 문장에서 시작합니다.

4비트 카운터 q. clear는 0으로 되돌립니다. enable은 1 증가시킵니다. 같은 사이클에 둘이 모두 켜지면 clear가 이깁니다. 둘 다 없으면 유지합니다. 15 다음은 0으로 되감깁니다.

설계의 첫 단계는 문장을 바깥에서 관찰할 수 있는 것과 명령할 수 있는 것으로 나누는 일입니다. 관찰은 value method가 되고, 명령은 Action method가 됩니다.

구절BSV 요소
"4비트 카운터 q"Reg#(Bit#(4)). value method로 읽음
"clear는 0으로", "enable은 1 증가"명령. Action method 둘, 또는 둘을 인자로 받는 Action 하나
"clear가 이깁니다"다음 상태 회로 안의 우선순위
"유지합니다"그 사이클에 쓰기 없음
"0으로 되감깁니다"Bit#(4) 산술. 모듈로 16

채점 문제는 채점에 쓰는 인터페이스를 선언합니다. 두 명령을 Bool 인자로 받는 Action method 하나 step(clear, enable)과 value method value입니다. 그 인터페이스를 구현하세요. 채점기는 문제가 이름 붙인 method를 호출하므로 다른 인터페이스를 고안하면 안 됩니다. 별개의 clear와 enable Action method도 이 문장의 올바른 해석이지만, 그 선택이 무엇을 바꾸는지는 3절의 주의에 있습니다.

2. 레지스터 하나가 상태 전부입니다

카운터의 상태는 값 하나이므로 레지스터 하나가 담습니다. Reg#(Bit#(4)) q <- mkReg(0);입니다. 리셋 값은 공통 기초의 리셋이고, 사이클 0 전에 적용됩니다. 되감기에는 비용이 없습니다. 15를 가진 Bit#(4)에 1을 더하면 실행 중에 0이 됩니다. 산술은 피연산자의 폭을 유지하기 때문입니다. 타입·폭·명시적 변환 장에서 본 대로 리터럴 16만 거절됩니다.

확인 문제

q가 15이고 enable이 1, clear가 0입니다. 에지 뒤에 q는 무엇입니까?

3. 우선순위는 한 동작 안의 배타적 분기입니다

같은 사이클에 두 명령이 들어올 수 있고, 레지스터는 다음 값을 하나만 받을 수 있습니다. 우선순위를 한 동작 안의 if와 else if로 써서 정확히 한 분기만 쓰게 하세요.

형식

if (first)       r <= valueA;   // 이기는 명령
else if (second) r <= valueB;   // 첫 명령이 없을 때만 고려
// 어느 분기도 아니면 쓰기 없음. 레지스터는 유지

분기 순서가 우선순위입니다. rule이나 method 하나에서 같은 레지스터에 조건 없이 두 번 쓰는 것은 "마지막이 이긴다"가 아닙니다. 동작의 모든 문장은 동시에 일어나고 레지스터는 값 둘을 한 번에 받을 수 없으므로 bsc는 컴파일 오류 G0004로 거절합니다. 빠진 else가 유지입니다.

확인 문제

q가 5이고 같은 사이클에 clear가 1, enable이 1입니다. 에지 뒤에 q는 무엇입니까?

확인 문제

method 본문에 조건 없는 q <= 0; 다음에 조건 없는 q <= q + 1;이 있습니다. 어떻게 됩니까?

답

주의. 인터페이스가 별개의 Action method 둘이고 테스트벤치가 한 사이클에 둘을 모두 호출할 수 있으면, 우선순위는 더 이상 한 본문 안의 분기로 정해지지 않습니다. 두 호출자가 한 레지스터에 쓰는 것은 상태를 공유하는 rule 장의 가림 상황입니다. 문제의 step(clear, enable) method 하나에서는 두 명령이 한 호출로 들어오므로 위의 if/else if가 답의 전부입니다.

4. 만들기 전에 카운터를 예측하세요

요구사항이 요구하는 동작으로 표를 채우세요. 사이클 0은 리셋 값 q = 0에서 시작합니다. 두 입력 열은 그 사이클에 카운터가 보는 clear와 enable이고, 채울 열은 사이클을 끝내는 에지 뒤의 q입니다.

예측한 뒤 비교 · counter4

비교하기 전에 모든 칸을 채우세요. 빈칸도 불일치로 처리합니다.

상태표
사이클clear에지에서 샘플링한 입력enable에지에서 샘플링한 입력q에지 직후
001
101
211
301
400
501

이 표는 요구사항의 브라우저 모델이고 여러분의 BSV가 아닙니다. 설계를 작성하면 채점기가 같은 종류의 입력 시퀀스를 실제 툴체인으로 실행합니다.

5. 요구사항에서 시험 사례를 고르세요

세 가지 동작을 가진 요구사항에는 정상 경로 하나로는 부족합니다. 실행 전에 채점기가 확인할 만한 사례와 각 사례가 보여야 할 것을 적으세요.

종류사례기대
정상몇 사이클 동안 enable0, 1, 2, 3 … 사이클마다 한 단계
유지둘 다 꺼짐연속한 관찰에서 같은 값
우선순위clear와 enable 동시이전 값과 무관하게 0
경계15에서 enable다음 관찰에서 0
리셋clear 뒤에 enable0부터 다시 셈

설계는 샘플 출력이 맞아 보일 때가 아니라 모든 행이 동작할 때 끝납니다. 고정 상수, 유지해야 할 때의 불필요한 쓰기, 뒤바뀐 우선순위는 서로 다른 행에서 실패할 수 있습니다.

6. 적용: 문제 두 개

첫 실습 문제 expressions/select-op은 순수 함수입니다. 2비트 sel이 두 4비트 피연산자의 AND, OR, XOR, NOR 가운데 결과를 고릅니다. 형태는 선택·case· don't-care 값 장의 case로 sel의 값마다 arm 하나이고, 연산자는 Bool·Bit와 순수 함수 장의 연산자입니다. NOR에는 전용 연산자가 없으므로 OR의 보수로 만듭니다.

채점 문제 modules-and-interfaces/clear-enable-counter가 이 장의 카운터입니다. 다음 순서로 작업하세요. 문제가 선언한 인터페이스를 읽고, 레지스터를 인스턴스화하고, 3절의 우선순위로 동작을 쓰고, 이 문제의 value method는 첫 장의 예처럼 레지스터 값을 그대로 반환하게 하세요. 실행해서 4절의 표와 비교한 뒤 제출을 누르세요. 채점은 5절의 행들을 모듈에 대해 확인합니다.

7. 설계의 경로

단계출처 장
요구사항을 관찰과 명령으로 나눔모듈과 인터페이스, method
독립된 상태 하나마다 레지스터 하나레지스터와 rule 하나
명시적 우선순위와 유지를 가진 다음 상태 회로선택·case·don't-care 값, guard
타입에서 오는 폭과 되감기타입·폭·명시적 변환
한 레지스터를 두고 경쟁하지 않는 rule상태를 공유하는 rule
정상·경계·우선순위·리셋 사례 시험guard, 이 장

이 장으로 원리에서 설계를 세우는 구간이 끝납니다. 뒤따르는 장들에는 이 구간이 의도적으로 뺀 규칙이 있습니다. 큰 소스 트리의 어휘·패키지 규칙, proviso와 타입클래스, FIFO 같은 라이브러리 상태, 그리고 rule 사이의 우선순위를 명시하는 scheduling 어트리뷰트입니다.

확인 지점

실습 문제를 제출해 채점을 받습니다

채점은 서버의 비공개 테스트로 진행되며, 결과는 이 브라우저에만 기록됩니다.

실습

다음 단계로 짧은 BSV 문제에 이 개념을 적용해 보세요.

참고 자료

참고한 자료의 라이선스와 고지