32 / 37 · 실습
종합 실습: 주기 펄스와 enable 누산기 연결
이전 값으로 계산하는 모듈 간 전달을 명세하고 enable 정지·연속 펄스·동시 리셋을 참조 모델과 대조합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
모듈을 연결하기 전에 계약부터 정합니다
enable=1인 상승 에지마다 unsigned 4비트 sample을 받는 샘플러를 만듭니다. N번째 수락 sample마다 등록된 pulse를 냅니다. 누산기는 다음 상승 에지에서 그 pulse와 함께 저장한 sample을 소비하며, 이때 enable=0이어도 소비합니다. total은 8비트이며 256을 법으로 순환합니다. 동기 reset은 두 단계를 지우고 대기 중 sample도 버립니다.
한 에지의 지연은 계약에 포함됩니다. 누산기는 기존 pulse와 기존 saved_sample을 읽습니다. 같은 에지에서 다른 단계의 새로운 nonblocking 값을 즉시 볼 수 없습니다.
매개변수 강의의 modulo_tick을 modulo_tick.sv, 다음 모듈을 periodic_accumulator.sv로 저장하세요. N은 양수여야 합니다.
module periodic_accumulator #(parameter integer N = 3) (
input logic clk, rst, enable,
input logic [3:0] sample,
output logic pulse,
output logic [7:0] total
);
localparam integer CW = (N <= 1) ? 1 : $clog2(N);
wire [CW-1:0] count;
logic [3:0] saved_sample;
modulo_tick #(.N(N)) tick_u (
.clk(clk), .rst(rst), .enable(enable),
.count(count), .pulse(pulse)
);
always_ff @(posedge clk) begin
if (rst) saved_sample <= 4'b0;
else if (enable) saved_sample <= sample;
end
always_ff @(posedge clk) begin
if (rst) total <= 8'b0;
else if (pulse) total <= total + {4'b0, saved_sample};
end
endmodule데이터와 이벤트를 함께 추적합니다
N=3에서 다음 표를 사용하세요. 입력은 에지 전, 출력은 갱신 후 값입니다.
| 에지 | rst | enable | sample | 에지 후 pulse | 에지 후 total |
|---|---|---|---|---|---|
| E0 | 1 | 1 | 9 | 0 | 0 |
| E1 | 0 | 1 | 2 | 0 | 0 |
| E2 | 0 | 1 | 4 | 0 | 0 |
| E3 | 0 | 1 | 7 | 1 | 0 |
| E4 | 0 | 0 | 9 | 0 | 7 |
| E5 | 0 | 1 | 1 | 0 | 7 |
| E6 | 0 | 1 | 3 | 0 | 7 |
| E7 | 0 | 1 | 5 | 1 | 7 |
| E8 | 1 | 1 | 15 | 0 | 0 |
E4에서는 새 외부 입력 9가 아니라 7을 더합니다. enable은 새로운 수락만 제어하며 대기 중 이벤트를 취소하지 않습니다. E8의 reset은 대기 중 5를 버리고 total을 지웁니다. 누산 조건을 enable && pulse로 작성하면 E4 이벤트를 잃습니다.
시스템 경계의 참조 모델을 만듭니다
수락 sample 개수·선택적인 대기값·정수 total을 보관합니다. reset이 아닌 에지에서는 먼저 기존 대기값을 modulo 256으로 소비하고, 현재 enable/sample을 보고 새 N번째 sample이 대기값이 되는지 결정합니다. reset은 셋을 모두 지웁니다. tick_u.count나 saved_sample에 의존하지 않는 모델입니다.
테스트벤치 강의의 하강 에지 자극과 갱신 후 비교를 사용하세요. pulse와 total을 모든 에지에서 비교합니다. 대기 이벤트가 없으면 total이 유지되는지, 소비한 이벤트가 사라지는지도 확인합니다.
연결에서 생기는 오류를 검사합니다
- N=1로 연속 pulse를 만듭니다. 수락한 sample마다 다음 에지에서 정확히 한 번 소비해야 합니다.
- N=3에서 종료 sample 전후로 enable=0인 간격을 넣습니다. 모든 클록 에지가 아니라 수락한 에지를 셉니다.
- enable=0인 소비 에지에서 외부 sample을 바꿉니다. 저장된 sample을 사용해야 합니다.
- 대기 이벤트가 있을 때 reset을 켭니다. total과 대기 이벤트를 모두 버립니다.
- 255를 넘도록 충분히 누산하여 modulo-256 순환을 확인합니다.
누산기의 saved_sample을 sample로 바꿔 보세요. E4 검사가 실패해야 합니다. 소비를 enable로 막아도 실패하는지 확인합니다. 통과 실행을 기록하기 전에 올바른 구현을 복원하세요.
이 실습은 단일 클록·유한 폭의 기능 계약을 검증합니다. 다중 클록 전송·물리 타이밍 closure·DDS 무료 계정의 제품 실행 근거는 별도로 실행하고 수락해야 합니다.