본문으로 건너뛰기
code0.HDL

Verilog 실습

짧은 Verilog 문제로 핵심 개념을 익혀 보세요. 모듈을 수정하고 테스트벤치를 실행한 다음 풀이를 제출해 보세요.

작성 중인 코드와 완료한 문제는 이 브라우저에 저장됩니다.

장 바로가기

벡터·비트 선택·연산자

문제 2개

비트를 벡터로 묶고, 범위를 꺼내고, 중괄호로 이어 붙인 뒤, 비트·논리·축약 연산부터 산술·시프트·비교·우선순위까지 연산자마다 만들어지는 회로와 결과 폭을 익히고 실습에서 바이트를 재배치합니다.

  1. 01구현 문제바이트의 두 nibble 교환하기8비트 벡터의 상위 4비트와 하위 4비트를 출력의 반대쪽 절반으로 연결합니다.
  2. 02검증 문제마스크로 두 바이트 합치기마스크로 두 바이트를 합칠 때 새 값의 상위 비트가 사라지는 원인을 찾아 고칩니다.

리터럴·signed·식의 폭

문제 1개

폭을 적은 리터럴을 쓰고, 폭을 생략한 리터럴은 최소 32비트라는 규칙을 알고, 같은 패턴을 signed와 unsigned로 읽고, 덧셈이 자리올림을 잃지 않을 폭을 대상에 줍니다.

  1. 04구현 문제덧셈기의 자리올림 보존하기4비트 덧셈기가 자리올림을 버리지 않고 5비트 합 전체를 출력하도록 고칩니다.

net·변수·조합 always

문제 1개

net과 변수를 구분하고, 멀티플렉서를 assign의 ?:와 always @*의 case로 두 번 쓰고, 모든 경로가 출력에 대입해야 하는 이유를 확인하고, 조합 블록에서는 blocking 대입 =을 씁니다.

  1. 03구현 문제네 가지 연산 가운데 하나 고르기2비트 선택 신호에 따라 두 4비트 입력에 AND·OR·XOR·NOR 가운데 하나를 적용하는 조합 블록을 설계합니다.

리셋·enable·우선순위

문제 1개

레지스터에 동기 리셋과 enable을 주고, 리셋이 이기도록 if/else 연쇄의 순서를 정하고, 폭이 다하는 지점이 아니라 요구사항이 정한 값에서 카운터가 되돌아가게 합니다.

  1. 06구현 문제9 다음에 0으로 돌아가는 카운터동기 리셋을 유지하면서 클록 카운터가 9 다음에 0으로 돌아가도록 만듭니다.

레지스터 단계·관찰 시점·파형

문제 1개

레지스터를 단계로 이어 붙이고, 테스트벤치가 에지에서·#1 뒤에·$strobe로·파형에서 각각 무엇을 보는지 익히고, $dumpfile과 $dumpvars로 VCD 기록을 시작하고 `timescale로 시간에 단위를 주고, 펄스가 정확히 한 사이클인 상승 에지 검출기를 만듭니다.

  1. 09구현 문제레벨 신호를 한 사이클 펄스로 바꾸기입력이 0에서 1로 바뀔 때마다 레지스터 출력이 정확히 한 클록 사이클 동안만 1이 되게 하고, 파형에서 펄스 폭을 확인합니다.

인스턴스·계층·parameter

문제 1개

모듈을 다른 모듈 안에 인스턴스로 놓고, 포트를 이름으로 연결하고, parameter를 인스턴스마다 재정의하고, 인스턴스 사이를 내부 net으로 잇고, 4비트 리플 캐리 덧셈기를 계층으로 읽고, 연결 목록이 숨기는 elaboration 오류와 조용한 오배선을 알아봅니다.

  1. 05검증 문제반가산기 두 개로 전가산기 연결하기전가산기가 입력 하나를 무시하게 만드는 잘못된 포트 연결을 찾아 고칩니다.

상태표에서 상태 기계 만들기

문제 2개

상태표를 상태 레지스터, 다음 상태 case, 출력 논리로 옮기고, 두 상태 상승 검출기를 실행해 출력과 파형을 상태표와 비교한 뒤, 잘못된 전이를 고치고 세 상태 기계를 직접 설계합니다.

  1. 11검증 문제상태 기계에서 잘못된 전이 찾기두 상태 상승 검출기가 첫 번째 상승만 보고합니다. 출력과 상태표를 비교해 잘못된 전이를 찾아 고칩니다.
  2. 12구현 문제계약에서 세 상태 검출기 설계하기1이 두 번 연속 들어온 뒤 seen을 올리는 기계의 상태표를 쓰고, 상태 레지스터와 다음 상태 논리, Moore 출력을 직접 작성합니다.

메모리와 FIFO

문제 1개

메모리를 레지스터 배열로 선언하고, 에지에서 쓰고 비동기로 또는 한 사이클 지연이 있는 레지스터를 거쳐 읽은 뒤, count·full·empty가 어떤 push와 pop을 적용할지 정하는 파라미터화된 동기 FIFO를 만듭니다.

  1. 13구현 문제FIFO가 채워진 정도를 추적하게 하기WIDTH가 양수이고 DEPTH가 1부터 16일 때 동기 FIFO의 count, full, empty를 구현해, 가득 찼을 때의 push와 비었을 때의 pop을 무시하게 합니다.

테스트벤치 기법

문제 1개

reg 입력, wire 출력, dut 인스턴스로 테스트벤치를 쓰고, # 지연·클록·이벤트 제어로 시간을 흐르게 하고, 자극을 태스크로 묶어 모델과 !==로 비교하고, 실패하거나 멈춘 실행을 $fatal로 끝냅니다.

  1. 08검증 문제enable보다 리셋을 우선하기enable이 꺼진 동안 카운터가 리셋을 무시하는 원인을 찾아 우선순위를 고칩니다.

파형 기록

문제 1개

$dumpvars의 scope와 깊이로 VCD에 기록할 인스턴스를 고르고, 중간 계층을 건너뛴 파형을 읽고, 기록을 비우거나 늦추거나 얕게 만들거나 반올림된 지연으로 어긋나게 하거나 이름 없는 값을 빠뜨리는 실수를 알아봅니다.

  1. 10검증 문제지연선에서 사라진 단 찾기2단 지연선이 입력을 한 사이클 일찍 출력하는 원인을 파형에서 찾아 레지스터 갱신 방식을 고칩니다.

요구사항에서 설계하기

문제 1개

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

  1. 07구현 문제clear와 enable이 있는 카운터동기 clear가 enable보다 우선하고, 16을 주기로 세며, 그 밖에는 값을 유지하는 4비트 카운터를 설계합니다.