본문으로 건너뛰기
code0.HDL

요구사항에서 설계하기

요구사항을 포트·폭·선택 대응·우선순위·샘플링 시점·경계 사례로 읽고, 카운터 계약을 사이클 단위로 예측한 뒤, 두 점검 과제를 스스로 설계합니다.

이 장에서 배울 내용

  • 코드를 쓰기 전에 요구사항에서 포트, 폭, 대응, 우선순위, 샘플링 시점, 경계 사례를 뽑아낼 수 있습니다
  • 폭이 허용하는 모든 코드에서 출력에 대입하는 case로 조합 선택 블록을 쓸 수 있습니다
  • clear, enable, 유지가 요구사항의 우선순위를 따르는 카운터를 쓸 수 있습니다
  • 공개 테스트벤치를 읽어 각 출력 줄이 레지스터의 어느 시점 값인지 정하고, 채점기가 하는 방식으로 경계 사례를 확인할 수 있습니다
이 장에서 배우는 개념
  • 요구사항으로 RTL 설계
먼저 알아야 할 개념

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에지 직후
010
101
201
311
401
500
601

확인 문제

에지에서 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 과정은 같은 회로를 다른 두 언어로 만듭니다.

확인 지점

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

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

실습

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