Altifigence Academy

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

Лабораторная работа: эталонная модель восьмибитного АЛУ

Проверьте ADD, SUB, AND, XOR, перенос и заём в автономной исполняемой программе.

Сделайте числовую спецификацию исполняемой

В этой лабораторной работе комбинационное АЛУ моделируется целыми числами JavaScript. Операнды лежат от 0 до 255, а операции — от 0 до 3. Выход y всегда помещается в восемь бит. Флаг означает перенос ADD или заём SUB и равен нулю для логических операций. В этом интерфейсе заём равен единице, когда a меньше b. Другие архитектуры могут иначе определять флаги вычитания; наша спецификация явная.

Создайте локальную папку или вручную создайте пустой проект и добавьте alu-model.mjs в Digital Design Studio. Сохраните следующий файл. В терминале с установленным Node.js перейдите в папку и выполните node alu-model.mjs. Редактирование файла в DDS и выполнение JavaScript — отдельные действия. Установка пакетов или автоматический импорт не требуются.

javascript
import assert from 'node:assert/strict';
function alu(a, b, op) {
  if (op === 0) {
    const wide = a + b;
    return { y: wide & 255, flag: Number(wide > 255) };
  }
  if (op === 1) return { y: (a - b) & 255, flag: Number(a < b) };
  if (op === 2) return { y: a & b, flag: 0 };
  if (op === 3) return { y: a ^ b, flag: 0 };
  throw new RangeError('operation');
}
assert.deepEqual(alu(250, 10, 0), { y: 4, flag: 1 });
assert.deepEqual(alu(3, 5, 1), { y: 254, flag: 1 });
assert.deepEqual(alu(170, 204, 2), { y: 136, flag: 0 });
assert.deepEqual(alu(170, 204, 3), { y: 102, flag: 0 });
let checks = 0;
for (let a = 0; a < 256; a++) {
  for (let b = 0; b < 256; b++) {
    const add = alu(a, b, 0), sub = alu(a, b, 1);
    assert.equal(add.y + 256 * add.flag, a + b);
    assert.equal(sub.y - 256 * sub.flag, a - b);
    assert.equal(alu(a, b, 2).y | alu(a, b, 3).y, a | b);
    checks += 3;
  }
}
console.log(`ALU PASS: ${checks} identities`);

Для 250+10 значения y=4 и carry=1 восстанавливают 260. Для 3-5 значения y=254 и borrow=1 восстанавливают -2. Двоичное 170 — это 10101010, а 204 — 11001100: AND даёт 136, а XOR — 102. Цикл перебирает все 65536 пар операндов и проверяет три тождества для каждой пары. Успешный запуск сообщает о 196608 проверках.

Используйте в эталонной модели метод, отличный от RTL. Если аппаратная схема извлекает перенос из девятибитного сумматора, эта модель проверяет математический диапазон. Это уменьшает вероятность одинаковых ошибок реализации. Эти проверки не оценивают значения HDL X/Z, задержки распространения или тактовое поведение. Повторно используйте векторы в симуляторе при реализации RTL. Всегда сравнивайте флаги вместе с данными; правильные биты после циклического переполнения могут скрывать неверный граничный флаг.

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

Если SUB всегда возвращает flag=0, какое числовое тождество нарушается? Проверьте вручную a=0, b=1 и исправьте реализацию.

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

y равно 255. При flag=0 выражение y-256×flag равно 255 вместо -1, поэтому восстановление вычитания не проходит. При borrow=1 получаем 255-256=-1. Проверка только y пропустила бы эту ошибку.

Lesson files

alu-model.mjs ↓

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