Altifigence Academy

11 / 24 · 실습

실습: 두 단계와 bubble의 사이클 추적

이전 상태로 다음 상태를 계산하고 출력 tag·값·에지를 함께 비교합니다.

동시에 갱신되는 레지스터를 모델링하기

두 단계 f(a,b)=3(a+b)의 사이클 모델을 작성합니다. 각 반복은 상승 에지 하나를 나타냅니다. 반복의 첫 부분에서 에지 전 s2를 소비하고, 다음 상태를 구할 때는 에지 전 s1을 읽습니다. 마지막에 s1과 s2를 함께 바꿉니다. 먼저 s1을 새 입력으로 덮고 s2를 계산하면 한 거래가 같은 에지에 두 레지스터를 통과하는 잘못된 모델이 됩니다.

프로젝트에 pipeline-model.mjs를 수동으로 추가하고 저장한 뒤 Node.js 터미널에서 node pipeline-model.mjs를 실행하세요. 입력 4개를 에지 0~3에 수락하고 에지 4~5는 입력 없는 drain으로 사용합니다. 정지 없는 계약이므로 모든 입력은 수락됩니다. null은 빈 단계를 뜻하며 데이터 0과 다릅니다. 결과가 0인 유효 거래도 반드시 큐에 들어가야 합니다.

javascript
import assert from 'node:assert/strict';
const inputs = [[1,2], [250,10], [100,0], [255,255]];
let s1 = null, s2 = null;
const seen = [];
for (let edge = 0; edge < 6; edge++) {
  if (s2 !== null) seen.push({ edge, ...s2 });
  const next2 = s1 === null ? null : {
    tag: s1.tag, y: (s1.sum * 3) % 256
  };
  const next1 = edge < inputs.length ? {
    tag: edge, sum: inputs[edge][0] + inputs[edge][1]
  } : null;
  s1 = next1;
  s2 = next2;
}
assert.deepEqual(seen, [
  { edge: 2, tag: 0, y: 9 },
  { edge: 3, tag: 1, y: 12 },
  { edge: 4, tag: 2, y: 44 },
  { edge: 5, tag: 3, y: 250 }
]);
assert.equal(s1, null);
assert.equal(s2, null);
console.log('PIPELINE PASS: 4 ordered results, latency=2');
에지입력 수락출력 전달
0tag0:1+2없음
1tag1:250+10없음
2tag2:100+0tag0:y9
3tag3:255+255tag1:y12
4bubbletag2:y44
5bubbletag3:y250

두 번째 거래는 합 260을 보관하고 세 배한 780을 256으로 나눠 나머지 12를 얻습니다. 마지막 거래는 510×3=1530에서 250이 남습니다. 값뿐 아니라 에지와 tag까지 직접 작성한 기대 목록과 비교하므로 계산이 맞아도 한 사이클 빠르거나 느린 오류를 발견합니다. 에지 4의 bubble은 다음 s1을 비우고 에지 5의 bubble은 s2까지 비워 이전 출력을 반복하지 않게 합니다.

추가 입력 정지를 시험하려면 입력 항목을 특정 에지에 null로 두고 tag는 수락한 거래 번호로 따로 증가시키세요. 출력은 그 빈 사이클만큼 간격이 생기지만 각 유효 거래의 지연은 여전히 두 에지입니다. 이 모델에는 출력 backpressure가 없으므로 소비자가 멈추는 경우에는 다음 장의 elastic 규칙이 필요합니다. Node 실행이 통과했다는 사실은 이 상태 모델의 일관성 증거이며, HDL 컴파일이나 실제 DDS 시뮬레이션을 실행했다는 증거는 아닙니다.

직접 생각해 보기

두 번째 에지(에지 1)에 입력을 넣지 않고 B,C,D를 에지 2,3,4에 넣으면 tag0~3의 전달 에지는 어떻게 바뀌나요?

해설 보기

A는 에지 0에 수락되어 에지 2에 전달됩니다. B,C,D는 각각 2,3,4에 수락되어 4,5,6에 전달됩니다. 에지 3은 출력 bubble입니다. 입력 tag는 에지 번호가 아니라 수락 순서 0,1,2,3으로 부여해야 합니다.

실습 파일

pipeline-model.mjs ↓

선택은 이 브라우저에만 적용됩니다. 언제든 푸터에서 변경할 수 있습니다.