14 / 24 · 개념
ready·valid와 멈춘 상태
출력 stage에 A가 있고 out_ready=0인데 새 입력 B의 valid가 1입니다. 다음 에지에서 stage와 입력 생산자는 어떻게 행동해야 하나요?
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
전송은 두 신호가 함께 허용할 때만
생산자는 valid로 현재 데이터가 준비됐음을 알리고 소비자는 ready로 그 데이터를 받을 수 있음을 알립니다. 상승 에지에서 valid와 ready가 모두 1이면 한 항목이 수락됩니다. 이때만 픽셀 인덱스, 열·행 카운터, 라인 버퍼와 부분합의 해당 입력 위치를 진행시킵니다. valid만 보고 이동시키면 소비자가 멈춘 순간 데이터를 잃습니다. ready만 보고 이동시키면 입력이 없는 순간 가짜 픽셀을 셉니다.
valid=1,ready=0인 동안 생산자는 같은 항목과 valid를 유지해야 합니다. 값이 바뀌면 소비자가 어느 항목을 기다리고 있었는지 알 수 없습니다. 출력이 막히는데 입력을 계속 받으려면 FIFO 같은 저장 공간을 마련하고 남은 용량으로 ready를 정해야 합니다. 이 단원의 RTL은 한 항목만 보관하는 간단한 stage입니다. 비어 있거나 현재 항목을 내보낼 수 있을 때 새 입력을 받습니다.
수락 횟수 예제
사이클 0부터 4의 valid가 [0,1,1,1,1], ready가 [0,1,0,1,1]이면 수락은 [0,1,0,1,1]입니다. 다섯 클록 동안 세 픽셀만 들어갑니다. 사이클 2의 데이터는 다음 수락 시점인 사이클 3까지 그대로 있어야 합니다. 폭이 4인 행 카운터는 아직 첫 행을 완성하지 않았습니다. 단순 클록 카운터로 다섯 항목을 받았다고 해석하면 이후 창의 좌표가 전부 어긋납니다.
한 항목 stage가 출력 A를 들고 out_valid=1,out_ready=0이면 in_ready=0입니다. 다음 에지에서도 A를 유지합니다. out_ready=1이 된 사이클에는 A를 보내면서 새 입력 B를 동시에 받아 out_valid를 계속 1로 둘 수 있습니다. 입력이 없다면 출력 valid를 0으로 바꾸어 비웁니다. 이 교체가 가능한지와 지연 시간을 인터페이스 계약에 기록하세요.
초기화와 프레임 종료
reset은 단순 값만 지우는 것이 아니라 유효 상태도 비웁니다. 초기화 직후 이전 프레임의 출력을 다시 내보내면 중복이 됩니다. 프레임을 새로 시작할 때는 행·열과 창의 유효 상태를 정의된 시점에 초기화합니다. 전체 입력을 받았다는 조건과 마지막 결과가 소비되었다는 조건은 다릅니다. done을 너무 일찍 내면 다음 프레임이 남은 부분합이나 출력을 덮어쓸 수 있습니다.
아래 RTL은 전달 stage이며 완성된 합성곱 회로가 아닙니다. 설치된 환경이 SystemVerilog 편집·시뮬레이션을 지원하면 파일을 수동 생성해 멈춤 동안 데이터 유지와 동시 교체를 테스트하세요. 이 과정에서는 RTL 시뮬레이터 실행을 주장하지 않습니다. 파형의 fire는 수락 조건을 설명하는 신호이며 그림은 실제 장치에서 캡처한 파형이 아닙니다.
module sample_stage (
input logic clk, reset,
input logic in_valid,
output logic in_ready,
input logic signed [7:0] in_data,
output logic out_valid,
input logic out_ready,
output logic signed [7:0] out_data
);
assign in_ready = !out_valid || out_ready;
always_ff @(posedge clk) begin
if (reset) begin
out_valid <= 1'b0;
out_data <= '0;
end else if (in_ready) begin
out_valid <= in_valid;
if (in_valid) out_data <= in_data;
end
end
endmodule파형 데이터 보기
| 신호 | 파형 | 버스 값 |
|---|---|---|
| clock | p.... | |
| valid | 01111 | |
| ready | 01011 | |
| fire | 01011 |
직접 생각해 보기
출력 stage에 A가 있고 out_ready=0인데 새 입력 B의 valid가 1입니다. 다음 에지에서 stage와 입력 생산자는 어떻게 행동해야 하나요?
해설 보기
stage는 in_ready=0을 내며 A와 out_valid를 유지합니다. 생산자는 B와 in_valid를 유지합니다. 양쪽 데이터가 바뀌지 않아야 이후 에지에서 각각 한 번만 전송할 수 있습니다.