Altifigence Academy

21 / 37 · Теория

function automatic и повторно используемые выражения

Пишите функции без затрат времени моделирования и проверяйте ширину, знак и независимость эталона.

Повторно используйте расчёт, не скрывая контракт

Функция SystemVerilog возвращает значение, не расходуя времени моделирования. В синтезируемой комбинационной RTL задавайте явные входы, присваивайте результат на всех путях и не добавляйте задержки или управление событиями. automatic разделяет аргументы и локальные переменные каждого вызова, не добавляя регистр или такт. Фиксированный цикл вычисляет XOR восьми бит как комбинационную чётность.

SystemVerilog
module parity_function (
  input  logic [7:0] data,
  output logic       parity,
  output logic [7:0] with_parity
);
  function automatic logic parity8(input logic [7:0] value);
    logic p;
    integer bit_index;
    begin
      p = 1'b0;
      for (bit_index = 0; bit_index < 8; bit_index = bit_index + 1)
        p = p ^ value[bit_index];
      parity8 = p;
    end
  endfunction
  assign parity = parity8(data);
  assign with_parity = {data[6:0], parity8(data)};
endmodule

with_parity отбрасывает data[7] и добавляет чётность: остаётся восемь бит, а не девятибитовый код с сохранением всего входа. Корректная функция не предотвращает потерю информации вызывающей схемой.

Разрядность и знак результата

Здесь возвращается один бит logic. Сложение двух беззнаковых восьмибитовых входов с сохранением переноса требует девяти бит результата. Вызов не расширяет автоматически приёмник. Держите правила ширины и константы у интерфейса; скрытые зависимости от меняющихся глобальных сигналов затрудняют повторное использование и тестирование.

Вызов не означает последовательное разделение ресурса

Два вызова не заставляют синтез создать один оператор с разделением во времени. Инструмент может оптимизировать комбинационную логику; последовательное разделение требует протокола приёма, состояния и момента результата. Не выводите площадь или пропускную способность из числа вызовов. Task тестового стенда может ждать событий; функции и задачи с временем имеют разные обязанности. Следующий урок использует task для стимулов на спадающем фронте и наблюдения после нарастающего.

Практика: другой эталон

data=0,1,3,8'h80,8'hFF должны дать чётность 0,1,0,1,0. Для 8'h80, with_parity=8'h01: старший бит удалён, parity=1. Проверьте все 256 значений, считая единицы целочисленно и беря остаток по модулю 2, без вызова parity8 из DUT. Измените границу цикла на 7:8'h80 должен провалиться, хотя младшие значения скрывают ошибку. Потом расширьте выход до девяти бит {data, parity8(data)} и обновите модель: это изменение интерфейса, не форматирования.

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