Altifigence Academy

11 / 24 · Практика

Лабораторная работа: проследите две ступени и пустые такты

Вычисляйте следующее состояние из старого и сравнивайте выходные метки, значения и фронты.

Моделируйте регистры, обновляющиеся вместе

Постройте потактовую модель двухступенчатой функции f(a,b)=3(a+b). Каждая итерация представляет один передний фронт. Сначала потребите старое s2. Затем вычислите новую вторую ступень из старого s1 и обновите обе ступени. Обновление s1 перед вычислением s2 ошибочно позволяет входу пройти два регистра за один фронт.

Вручную добавьте pipeline-model.mjs в проект, сохраните его и выполните node pipeline-model.mjs в терминале Node.js. Примите четыре входа на фронтах 0–3, затем опустошите конвейер на фронтах 4 и 5. По этому соглашению о постоянной готовности принимаются все входы. Null означает пустую ступень, а не числовой ноль. Достоверный нулевой результат всё равно представляет транзакцию.

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
4Пустой тактtag2:y44
5Пустой тактtag3:y250

Вторая транзакция сохраняет сумму 260 и сужает 780 до 12. Последняя сужает 1530 до 250. Явное сравнение фронта, метки и значения выявляет и временные, и арифметические ошибки. Пустые такты при опустошении очищают обе ступени, чтобы старые выходы не повторялись.

Для исследования отсутствующих входов вставьте null на выбранных фронтах приёма и увеличивайте метки только для принятых транзакций. Пропуски выхода следуют пустым тактам, а достоверные транзакции сохраняют задержку в два фронта. У этой модели нет обратного давления выхода. Следующая глава добавит эластичное поведение. Успешные проверки Node подтверждают эту модель состояния, а не компиляцию HDL или запуск симуляции DDS.

Попробуйте сами

Если на фронте 1 нет входа, а B,C,D приняты на фронтах 2,3,4, на каких фронтах выдаются метки 0–3?

Прочитать объяснение

A передаётся на фронте 2. B,C,D передаются на фронтах 4,5,6. На фронте 3 — пустой выходной такт. Присваивайте метки в порядке приёма 0,1,2,3, а не по номеру физического фронта.

Lesson files

pipeline-model.mjs ↓

Выбор действует в этом браузере. Его можно изменить внизу страницы.