15 / 20 · Практика
Лабораторная работа: обратное давление и сброс
Выполните глобальную паузу, удержание результата и сброс прерванного задания.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Приостанавливайте логическое время целиком
Наш учебный массив использует глобальный advance. Граничный планировщик и все PE движутся только при доступности следующего пакета логического шага. Канал, запланированный недостоверным, не требует реального операнда. Продвижение только одного потока нарушает сдвиг. Независимо останавливаемые связи требуют дополнительной буферизации и правил сопоставления за рамками базового варианта.
Выход использует отдельное соглашение valid/ready. Когда результат готов, удерживайте valid, data и job стабильными до фронта с valid&&ready, который передаёт его ровно один раз. Простая оболочка не запускает новое задание, пока старый результат ожидает. Готовность потребителя не обязана останавливать вычисление при достаточном хранении результатов.
Сохраните это как stall-lab.mjs и выполните node stall-lab.mjs. Модель представляет PE из двух членов плюс регистр результата, не требует пакетов и печатает Stall/reset lab passed.
import assert from 'node:assert/strict';
let s;
function reset(){s={step:0,acc:0,valid:false,data:0,job:7};}
const pairs=[[-2,3],[4,-5]];
function tick({advance=true,ready=false,rst=false}={}){
if(rst){reset();return null;}
if(s.valid){if(!ready)return null;
const out={data:s.data,job:s.job};s.valid=false;return out;}
if(advance&&s.step<pairs.length){
const [a,b]=pairs[s.step];s.acc+=a*b;s.step++;
if(s.step===pairs.length){s.data=s.acc;s.valid=true;}}
return null;
}
reset();tick();assert.equal(s.acc,-6);
const held={...s};tick({advance:false});assert.deepEqual(s,held);
tick();assert.equal(s.data,-26);assert.equal(s.valid,true);
const blocked={...s};tick({ready:false});tick({ready:false});
assert.deepEqual(s,blocked);
assert.deepEqual(tick({ready:true}),{data:-26,job:7});
assert.equal(tick({ready:true}),null);
reset();tick();tick({rst:true,advance:false});
assert.deepEqual(s,{step:0,acc:0,valid:false,data:0,job:7});
tick();tick();assert.equal(s.data,-26);
console.log('Stall/reset lab passed');Интерпретируйте проверки
Пауза удерживает первую сумму −6 и позицию расписания. Второй член даёт −26. Два заблокированных выходных фронта сохраняют результат; готовый фронт передаёт его один раз. Сброс во время неполного задания очищает аккумулятор, позицию и valid результата, поэтому восстановление перезапускает задание.
Добавление двух глобальных пауз к четырёхшаговому расписанию 2×2 даёт четыре фронта advance и шесть физических фронтов. Результаты и списки потреблённых k должны совпадать с выполнением без остановок. Формула логического завершения остаётся неизменной.
Это синхронный эталон управления. Физическая синхронизация сброса и пересечения тактовых доменов требуют отдельного проектирования. Задание, прерванное сбросом, не должно сообщать об успешном завершении; очистите вышестоящие буферы перед перезапуском. Успех модели не устанавливает приёмку RTL, установленного приложения или аппаратуры.
Попробуйте сами
Удерживайте valid=1 и ready=0 три фронта, затем установите ready. Какие сигналы должны удерживаться, сколько происходит передач и что если reset приходит во время ожидания?
Прочитать объяснение
Удерживайте data, job и valid. Во время ожидания передаётся ноль результатов; готовый фронт передаёт один. Reset отбрасывает ожидающий valid и не должен выдавать это задание как успешное. Уведомление об отмене требует отдельной спецификации статуса.