1. 요구사항은 코드를 쓰기 전에 여섯 가지 질문에 답합니다
지금까지의 장은 코드를 주고 예측을 요구했습니다. 이 장은 요구사항 두 개를 주고 코드는 주지 않습니다. 필요한 기술은 새 문법이 아닙니다. 요구사항을 코드가 내려야 할 여섯 가지 결정으로 읽는 일이며, 순서는 다음과 같습니다.
| 질문 | 뽑아낼 것 | 코드에서의 위치 |
|---|---|---|
| 포트 | 모든 입력과 출력의 이름과 방향 | 포트 목록 |
| 폭 | 각 값이 담아야 하는 범위 | 포트와 레지스터의 [N-1:0] |
| 대응 | 선택 입력이 있으면 각 코드의 뜻 | case의 라벨 또는 ?: 연쇄 |
| 우선순위 | 한 에지에 두 입력이 함께 켜질 때 이기는 쪽 | if/else if 연쇄의 순서 |
| 샘플링 시점 | 테스트벤치가 무엇을 언제 출력하는가 | 설계가 아니라 추적을 읽는 방법 |
| 경계 사례 | 최댓값, 되돌림, 중간의 리셋, 두 입력 동시 인가 | 손으로 확인할 경우들 |
편집기를 열기 전에 여섯 답을 적어 두세요. 컴파일은 되지만 채점에 실패하는 설계는 거의 언제나 이 가운데 하나를 건너뛴 것입니다.
2. 조합 대응은 모든 코드를 덮는 case가 됩니다
첫 번째 문제 select-op은 선택 코드로 입력에 적용할 연산을 고르는 모듈을 기술합니다. 그
코드 표가 요구사항입니다. 각 코드는 정확히 하나의 결과를 내야 하고, 폭이 허용하는 모든 코드가
어딘가에 나타나야 합니다. 2비트 선택 입력은 표에 네 줄이 있든 세 줄이 있든 코드가 네 개입니다.
빠진 코드는 net·변수·조합 always
장의 요구대로 default 분기나 ?: 연쇄의 마지막 :이 받습니다.
폭이 두 번째 함정입니다. 연산 가운데 덧셈이 있으면 자리올림이 어디로 가는지 정하세요. 더 넓은 결과 포트에 들어가는지, 요구사항이 그렇게 말하므로 의도적으로 버리는지입니다. 요구사항이 무엇을 원하는지 알면 리터럴·signed·식의 폭 장의 규칙이 나머지를 정합니다.
확인 문제
선택 입력이 [1:0]으로 선언되어 있습니다. 설계는 몇 개의 코드에 결과를 주어야 합니까?
확인 문제
요구사항이 2비트 선택 입력에 연산 세 개를 나열합니다. 네 번째 코드는 무엇이 처리합니까?
3. 순차 계약은 우선순위 순서의 연쇄가 됩니다
점검 문제 clear-enable-counter는 모든 상승 에지에 대한 계약을 말합니다. clear가 1이면
count는 0이 됩니다. 그렇지 않고 enable이 1이면 count는 1 증가하며 15 다음에 0으로
되돌아갑니다. 그렇지 않으면 count는 유지됩니다. 이 문장을
리셋·enable·우선순위 장의 연쇄로 읽으세요. 첫
조건을 먼저 검사하고, 둘째 조건은 첫 조건이 거짓일 때만 검사하며, 유지는 대입이 없는
것입니다. 브라우저 모델 counter4가 이 계약입니다. 코드를 쓰기 전에 표를 채우세요. 두 입력은
각 사이클을 끝내는 에지에서 샘플링된 값이고, q는 그 에지 뒤의 값입니다.
예측한 뒤 비교 · counter4
비교하기 전에 모든 칸을 채우세요. 빈칸도 불일치로 처리합니다.
| 사이클 | clear에지에서 샘플링한 입력 | enable에지에서 샘플링한 입력 | q에지 직후 |
|---|---|---|---|
| 0 | 1 | 0 | |
| 1 | 0 | 1 | |
| 2 | 0 | 1 | |
| 3 | 1 | 1 | |
| 4 | 0 | 1 | |
| 5 | 0 | 0 | |
| 6 | 0 | 1 |
확인 문제
에지에서 q가 15, enable이 1, clear가 0입니다. 에지 뒤에 q는 무엇입니까?
표에서 확인한 clear와 enable의 동시 인가, 두 입력이 모두 0인 유지를 문제에서도 검사하세요. 15에서 0으로 되돌아가는 경우도 따로 확인해야 합니다. 위의 짧은 입력 순서는 15에 도달하지 않으므로 표만으로는 이 경계를 검사할 수 없습니다.
4. 추적을 읽기 전에 테스트벤치를 읽습니다
설계는 채점기가 실행하는 것의 절반입니다. 각 문제의 표시 아래에 있는 공개 테스트벤치가
무엇을 언제 출력하는지 정하고, 레지스터
단계·관찰 시점·파형 장에서 본 대로 그것이 어느 값을 보는지 정합니다.
always @(posedge clock) 안의 $display는 그 에지 이전 값을 보이고, 하강 에지나 #1 뒤의
출력은 에지 이후 값을 보입니다. 출력 문장을 찾아 어느 관점인지 정하고, 실행 전에 그 관점으로
기대 추적을 적으세요.
확인 문제
테스트벤치가 always @(posedge clock) 안에서 $display로 count를 출력합니다. 각 줄은 어느 시점의 값입니까?
5. 채점기가 확인하는 방식으로 확인합니다
공개 테스트벤치는 몇 줄만 출력합니다. 채점기는 더 많은 패턴을 넣고 모두 비교하므로, 보이는
줄은 출발점일 뿐 증명이 아닙니다. 제출을 누르기 전에 1절의 경계 사례로 코드를 손으로
따라가 보세요. 최댓값, 되돌림, 두 입력 동시 인가, 리셋 뒤 첫 에지입니다. 각각은 추측이 아니라
한 줄의 추론이어야 합니다. 어느 줄이 예측과 어긋나면 설계가 틀렸는지 샘플링 시점을 잘못
읽었는지 먼저 구분하세요. 샘플링 시점이 문제라면 레지스터
단계·관찰 시점·파형 장의 관찰 시점 표를 보고 설계 코드를 고치기 전에 출력 해석부터 확인하세요.
6. 시작하세요
먼저 select-op을 열고 표에서 조합 모듈을 쓰세요. 그다음 점검 과제 clear-enable-counter를
열고 방금 예측한 계약에서 카운터를 쓰세요. 이 장에는 의도적으로 해답 코드가 없습니다. 두
설계에 필요한 모든 것은 벡터와 연산자부터 레지스터 단계와 관찰 시점까지 이 과정의 앞 장들에
있습니다.
7. 정리
| 요소 | 뜻 |
|---|---|
| 포트, 폭 | 포트 목록과 모든 [N-1:0] |
| 대응 | default가 있는 case. 모든 코드에 대입 |
| 우선순위 | if/else if 연쇄의 순서. 유지는 대입 없음 |
| 샘플링 시점 | 설계의 동작이 아니라 추적이 보이는 값을 정함 |
| 경계 사례 | 채점 전에 손으로 확인하는 경우들 |
Verilog 과정의 마지막 장입니다. 모든 단계 뒤의 규칙은 앞 장들에 있고, BSV와 Chisel 과정은 같은 회로를 다른 두 언어로 만듭니다.