Verilog Всегда блокировать, используя символ (*) - PullRequest
4 голосов
/ 15 мая 2011

У меня простой вопрос о том, как записать блок always в модуль Verilog.
Если у меня есть следующие входы в моем модуле Verilog:

input        [31:0] PCplus4 ;       // Value of PC + 4
input        [31:0] A;          // Value A, i.e. RSbus (Use Forwarded Value)
input        [31:0] B;          // Value B, i.e. RTbus (Use Forwarded Value)
input        [31:0] IMM;            // Extended Immediate Value
input        [25:0] TARGET;         // Target Address for Jumps
input         [3:0] BR;         // Branch Selector Input

Есть ли разницаЯ использую

always @ (*)  

вместо

always @ (PCplus4  or A or B or IMM or TARGET or BR)  

Этот синтаксис always @ (*) действителен для всех версий Verilog?

Ответы [ 6 ]

10 голосов
/ 15 мая 2011

Синтаксис always @(*) был добавлен в IEEE Verilog Std в 2001 году. Все современные инструменты Verilog (симуляторы, синтез и т. Д.) Поддерживают этот синтаксис.

Вот цитата из LRM (1800-2009):

Неполный список событийных выражений элемента управления событиями является распространенным источником ошибок при моделировании уровня передачи регистров (RTL).Неявное event_expression, @ *, является удобным сокращением, которое устраняет эти проблемы, добавляя все сети и переменные, которые читаются оператором (который может быть группой операторов) из процедурной_поддержки control_statement, к выражению события.

Итак, ваши две строки кода могут быть эквивалентны (это зависит от кода в теле вашего блока always).Однако синтаксис @* проще поддерживать.

3 голосов
/ 15 мая 2011

always @(*) был дополнением к языку в редакции стандарта в 2001 году.Это поддерживается всеми последними выпусками качественных инструментов.Я не беспокоюсь об использовании конструкции в коде, предназначенном для произвольного повторного использования, однако есть возможность встретить старый инструмент, который не поддерживает always @(*), особенно когда задействованы внутренние утилиты.

0 голосов
/ 24 декабря 2018

* означает, что все входы включены, поэтому это эквивалентно записи всех входов.Использование символа * также полезно всегда, если вы хотите, чтобы ваш модуль был комбинационным, а не последовательным, поскольку всегда есть что-то, что меняется при изменении любого входа.

0 голосов
/ 10 октября 2017

Для 1-го вопроса .... я бы сказал, что зависит, если во втором сценарии эти единственные входные данные, которые вы чувствуете, могут измениться, что вызовет срабатывание выхода. В идеале было бы лучше использовать *, поскольку это означает "для любого изменения входных данных", также это помогает избежать подробного кода.

По второму вопросу ..... он был введен в verilog-2001 и с тех пор широко используется.

0 голосов
/ 24 сентября 2013

Хотя оба эквивалентны, использование always@(*) позволяет избежать несоответствия имитационного синтеза. Предположим, у вас есть 15 сигналов в списке чувствительности, как показано ниже:

always@( a1 or a2 or ... or a15)

Теперь предположим, что дизайнер пропустил наличие a14 в этом списке по ошибке. Инструмент синтеза игнорирует этот факт и синтезирует код, предполагая, что все сигналы RHS в этом блоке находятся в списке чувствительности. Принимая во внимание, что инструмент моделирования ведет себя по-разному, поскольку он зависит от списка чувствительности.

0 голосов
/ 14 июля 2011

Это просто ярлык для перечисления всех проводов, от которых зависит всегда блок. Эти провода являются «списком чувствительности». Одним из преимуществ его использования является то, что синтезированный код вряд ли будет заботиться о том, что вы поместите в список чувствительности (кроме posedge и negedge), поскольку провода будут «физически» соединены вместе. Симулятор может полагаться на список, чтобы выбрать, какие события должны вызвать выполнение блока. Если вы измените блок и забудете обновить список, ваша симуляция может отличаться от фактического синтезированного поведения.

...