5 / 37 · Теория
logic, wire, X/Z и явная разрядность
Разделите тип, источник и хранение; проверьте литералы, сравнения, расширения и неизвестные значения.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Тип, источник и хранение — разные вопросы
logic — тип с четырьмя состояниями; wire описывает сетевое соединение, тоже способное передавать четыре состояния. Переменная logic может быть комбинационным результатом или тактовым состоянием согласно правилам источников. Имя не гарантирует триггер: найдите непрерывное присваивание, комбинационный или фронтовой процесс. Используйте один предусмотренный источник на обычный сигнал. Разрешаемые сети с несколькими источниками и двунаправленные интерфейсы требуют другого электрического и инструментального контракта и выходят за эти примеры.
Определите разрядность и интерпретацию
logic [7:0] u имеет восемь беззнаковых бит; logic signed [7:0] s интерпретирует те же биты в дополнительном коде. 8'hFF означает 255 для u и −1 для s. packed-вектор объединяет биты, а не восемь последовательных во времени значений.
module typed_examples (
input logic [3:0] a, b,
input logic signed [7:0] s,
output logic [4:0] full_sum,
output logic signed [8:0] extended_s,
output logic negative,
output logic any_bit, all_bits, parity
);
assign full_sum = {1'b0, a} + {1'b0, b};
assign extended_s = {s[7], s};
assign negative = s < 8'sd0;
assign any_bit = |a;
assign all_bits = &a;
assign parity = ^a;
endmoduleextended_s повторяет знаковый бит; добавление нуля превращает −1 в +255. Конкатенация является беззнаковым выражением: знаковой арифметике нужна явная интерпретация или подходящее промежуточное значение. Здесь нужный набор бит присваивается signed-приёмнику. Используйте 4'd15,8'hFF,8'sd0, когда ширина важна. Целый литерал без размера может расширить выражение: проверьте оба операнда и контекст присваивания, не только левую часть.
Три семейства операторов
a & b работает побитно; a && b проверяет истинность обоих векторов и выдаёт один бит;&a свёртывает условие всех бит 1. a=0011, b=0101 дают 0001,1,0. ^a вычисляет чётность,0 для 0011. Разбивайте неоднозначные выражения на промежуточные значения с записанными диапазонами.
Неизвестность не является третьим напряжением
X означает неизвестность, Z — высокое сопротивление, а не точные напряжения. Модель с двумя состояниями не доказывает поведение с четырьмя состояниями. Сбрасывайте явно, не скрывая X нулём. == может вернуть X при неопределённом решении; actual !== expected в стенде отмечает X/Z против известного ожидания. Case equality не обнаруживает физический X в обычной аппаратуре.
Практика: расширяйте, складывайте, сравнивайте
a=15, b=1 даёт full_sum=10000. s=8'h80 даёт extended_s=110000000, negative=1; s=8'h7F даёт 001111111, negative=0. Проверьте ноль, максимум положительного, минимум отрицательного и −1. Замените расширение на {1'b0, s} и обнаружьте отрицательные ошибки. Замените !== на != и внесите X в actual: неизвестное условие может не сообщить нужную ошибку.