Лучший способ дополнительно зарегистрировать входы

У меня есть модуль systemverilog с МНОЖЕСТВОМ входных сигналов разного размера. Я хочу дополнительно зарегистрировать их перед использованием. Вот мои желаемые критерии для кода, который выполняет эту необязательную регистрацию:

  1. Мне нужно написать задания только один раз (без повторяющегося кода)
  2. Мне не нужно использовать какие-либо макросы (я не хочу проблем с областью действия)

Вот минимальный воспроизводимый пример моего текущего решения:

module optional_register #(
  parameter bit REGISTER_INPUTS=1
)(
  input wire clk,
  
  input wire a_in,
  input wire b_in,
  input wire c_in,
  input wire d_in,
  
  output logic a_out,
  output logic b_out,
  output logic c_out,
  output logic d_out
    );

  function assign_inputs();
    a_out <= a_in;
    b_out <= b_in;
    c_out <= c_in;
    d_out <= d_in;
  endfunction

generate if (REGISTER_INPUTS) begin
  always_ff @ (posedge clk)
    assign_inputs();
end else begin
  always_comb
    assign_inputs();
end endgenerate

endmodule

Этот код правильно синтезируется в Vivado 2020.2 как с включенными, так и с выключенными регистрами. Но я обеспокоен тем, что неблокирующие назначения в функции технически недействительны, в соответствии с IEEE Std для Verilog (1364-2001), раздел «10.3.4 Правила функций», в котором говорится:

A function shall not have any nonblocking assignments.

Поэтому меня беспокоит то, что это не будет работать в других синтезаторах и может привести к неожиданному поведению при моделировании. Кто-нибудь может говорить об этом?

Любые другие идеи?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это код SystemVerilog, вы должны использовать IEEE 1800-2017 LRM.

Неблокирующие назначения разрешены внутри функции, если цель LHS не является переменной с автоматическим временем жизни. Не используйте NBA для назначения выходных данных аргументов или возвращаемого значения функции со статическим временем жизни, поскольку их текущие значения копируются до того, как произойдет обновление NBA.

Вы должны объявить свою функцию без возвращаемого значения.

function void assign_inputs();

Использование NBA в комбинационной логике не является лучшим для производительности моделирования, но, как правило, является приемлемым с точки зрения функциональности.

Другие вопросы по теме