Altifigence Academy

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-вектор объединяет биты, а не восемь последовательных во времени значений.

SystemVerilog
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;
endmodule

extended_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: неизвестное условие может не сообщить нужную ошибку.

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