08검증 문제
enable보다 리셋을 우선하기
1. 요구 동작
event_counter는 enable 입력과 동기 리셋을 가진 4비트 카운터입니다. reset은
active-high입니다. 상승 에지에서 각 입력의 효과는 다음 우선순위로 결정됩니다.
| 우선순위 | 조건 | count의 다음 값 |
|---|---|---|
| 1 | reset = 1 | 0. enable 값과 무관합니다 |
| 2 | reset = 0, enable = 1 | 현재 값 + 1 |
| 3 | reset = 0, enable = 0 | 현재 값 유지 |
2. 현재 증상
시작 코드는 컴파일되고 enable이 1인 동안에는 올바르게 셉니다. 공개 테스트벤치는 cycle 8에서
enable이 0인 상태로 reset을 올립니다. 그런데 count는 4에 머물고, 이후 0이 아니라
4부터 다시 셉니다. 포트, 동기 리셋, 공개 테스트벤치는 그대로 두고 always 블록의 결함을
고치세요.
3. 출력 읽기
테스트벤치는 하강 에지에서 입력을 바꾸고 상승 에지에서 출력합니다. 각 줄의 reset과
enable은 그 에지에서 설계가 샘플링한 값이고, count는 에지 직전의 레지스터 값입니다.
따라서 cycle 8에서 샘플링된 리셋은 cycle 9 줄에 count=0으로 나타나야 합니다.
수정하기 전에 올바른 설계의 cycle 8부터 13까지 count 열을 적어 보세요. 그다음
reset=1 enable=0을 시작 코드의 중첩 if에 대입해 실행되는 분기를 찾으세요. 테스트벤치
장의 self-check 예제에서는 누산기의 clear가 같은 종류의 우선순위를 정합니다.
블록을 다시 구성해 실행한 뒤 cycle 8부터 13까지를 적어 둔 열과 비교하세요. 수정 전과
후에 cycle 0부터 7까지의 출력이 같은 이유도 설명해 보세요. 그 구간에서 reset은
enable이 1인 동안에만 1입니다.
4. 완료 조건
enable값과 관계없이 상승 에지에서reset이 카운터를 0으로 만듭니다. 전원 인가 직후 레지스터에 값이 없는 상태도 포함합니다.- 리셋은 입력이 올라가는 순간이 아니라 상승 에지에서 적용됩니다.
reset이 0이면enable만으로 증가와 유지가 결정됩니다. 4비트 값은 15 다음에 0으로 돌아갑니다.
5. 단계형 힌트
힌트 1
두 조건은 대등하지 않습니다. 한 조건은 다른 조건의 값과 관계없이 먼저 검사되어야 합니다.
힌트 2
시작 코드는 enable이 이미 1인 분기 안에서만 reset을 검사합니다. 다른 경우에 도착한
리셋이 어떻게 처리되는지 확인해 보세요.
힌트 3
첫 조건이 리셋인 if/else if 연쇄 하나로 블록을 다시 구성하세요. reset을 감지
목록에 추가하면 비동기 리셋이 되므로 이 카운터의 요구 동작과 달라집니다.
6. 추가 실험
테스트벤치가 시간 0부터 enable을 0으로 유지한다고 가정해 보세요. 시작 코드가 모든 줄에서
출력할 값과 x가 나타나는 원인을 예측해 보세요. 다른 입력에 의존하는 리셋으로는
레지스터 초기화를 보장할 수 없습니다.