14 / 24 · 개념
한 칸 elastic 레지스터 설계
빈 칸 또는 동시 배출일 때 입력을 받아 정지와 교체를 처리합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
저장 공간을 기준으로 ready를 만든다
한 칸 버퍼는 full 비트와 payload 레지스터로 표현할 수 있습니다. full=0이면 빈 칸이므로 소비자가 멈춰도 입력을 하나 저장할 수 있습니다. full=1이어도 소비자가 현재 출력을 이번 에지에 받으면 공간이 생겨 새 입력으로 교체할 수 있습니다. 그래서 input-ready=!full OR output-ready입니다. output-valid=full이며 출력 payload는 저장된 값입니다. 이 구조는 빈 칸의 입력이 출력으로 조합 통과하는 fall-through가 아니라 한 레지스터 지연을 갖습니다.
업데이트 조건도 ready와 같아야 합니다. input-ready가 1이면 다음 full은 input-valid입니다. 입력이 있으면 payload를 저장하고, 입력이 없으면 full을 비웁니다. input-ready=0이면 기존 full과 payload를 모두 보존합니다. '소비자가 받았다'만 보고 full을 0으로 만들면 같은 에지에 들어오는 입력을 잃습니다. 반대로 input-valid만 보고 저장하면 full인 버퍼를 덮어쓰게 됩니다.
module elastic_byte (
input logic clk, rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data, in_tag,
output logic out_valid,
input logic out_ready,
output logic [7:0] out_data, out_tag
);
logic full;
assign in_ready = !full || out_ready;
assign out_valid = full;
always_ff @(posedge clk) begin
if (rst) full <= 1'b0;
else if (in_ready) begin
full <= in_valid;
if (in_valid) begin
out_data <= in_data;
out_tag <= in_tag;
end
end
end
endmodule| 에지 전 full | out-ready | in-valid | 에지의 행동 |
|---|---|---|---|
| 0 | 0 | 1 | 새 입력 저장, full=1 |
| 1 | 0 | 1 | 입력 거절, 기존 출력 보존 |
| 1 | 1 | 1 | 기존 출력 전달과 새 입력 저장 |
| 1 | 1 | 0 | 기존 출력 전달, full=0 |
숫자로 추적해 봅시다. 에지 0에는 빈 버퍼에 tag0,y9를 넣습니다. 에지 1에 소비자 ready=0이면 tag0가 남고 다음 tag1은 생산자 쪽에서 대기합니다. 에지 2에 ready=1이면 tag0를 전달하며 동시에 tag1,y12를 저장합니다. 버퍼는 그 뒤에도 full=1입니다. 에지 3에는 tag1이 전달되고 새 입력이 없으면 비어집니다. 교체를 허용하기 때문에 채워진 상태에서도 멈춤 없이 매 사이클 한 거래를 전달할 수 있습니다.
여러 elastic 단계를 연결하면 ready가 뒤에서 앞으로 조합적으로 이어질 수 있습니다. 데이터 지연을 줄인 것만으로 긴 ready 경로가 해결되지는 않습니다. 큰 설계에서는 ready를 등록하고 여분의 칸을 둔 skid 구조나 FIFO로 끊을 수 있지만, 통보가 한 사이클 늦는 동안 들어오는 거래를 보관할 용량이 필요합니다. AXI 같은 특정 버스의 조합 경로 금지 규칙을 만족하는지 별도로 확인해야 합니다.
payload가 8비트인지 수백 비트인지는 full의 수락 규칙을 바꾸지 않습니다. 다만 모든 tag와 제어 필드가 같은 조건으로 저장되어야 합니다. 먼저 네 경우의 표를 손으로 확인하고, full·ready·valid·payload를 동시에 검사하는 기준 모델을 만들면 복잡한 흐름 제어를 작은 저장 규칙의 조합으로 이해할 수 있습니다.
직접 생각해 보기
full=1, out-ready=1, in-valid=1인 에지에 기존 tag7을 소비하고 tag8을 입력합니다. 에지 후 full과 out-tag는 무엇인가요? full을 무조건 0으로 하면 어떤 오류가 생기나요?
해설 보기
input-ready=1이므로 tag8을 저장하고 full=1을 유지합니다. out-tag=8입니다. 무조건 full=0으로 만들면 tag8을 이미 수락했는데 유효 출력으로 남기지 않아 입력 하나를 잃습니다.