Что входит в список чувствительности всегда @ *? - PullRequest
5 голосов
/ 12 марта 2012

Я немного озадачен тем, что считается вводом, когда вы используете подстановочный знак @ * в списке чувствительности блока.Например, в следующем примере, какие сигналы интерпретируются как входные данные, которые вызывают переоценку всегда блока?Из того, что я понимаю, clk и reset не включены, потому что они не отображаются справа от любого процедурного оператора в блоке Always. a и b включены, потому что они оба отображаются в правой части процедурных выражений в блоке Always.Но где я действительно запутался, так это en и mux .Поскольку они используются в качестве условий тестирования в операторах if и case , они считаются входными данными?Всегда ли блок пересматривается каждый раз, когда en и mux изменяют значение?Я в значительной степени новичок, и в 3 моих книгах Verilog я не нашел удовлетворительного объяснения.Я всегда находил объяснения здесь действительно полезными.Спасибо

module example
( 
    input wire clk, reset, en, a, b,
    input wire [1:0] mux,
    output reg x,y, z
);

always @*    
begin  
 x = a & b;    
  if (en)
    y= a | b;
  case(mux)
    2'b00: z = 0;
    2'b01: z = 1;
    2'b10: z = 1;
    2'b11: z = 0;
  endcase
end
endmodule

Ответы [ 3 ]

9 голосов
/ 12 марта 2012

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

В случае кода, который вы предоставили, это любой сигнал, который:

  • Оценивается с правой стороны задания (a и b)
  • Оценивается как часть условного (en и mux)

... но это любой сигнал, который будет оценен по любой причине.(Я не могу сейчас думать о каких-либо других причинах, но, может быть, кто-то еще может)

clk и reset нет в списке чувствительности, потому что они не используются.Просто как тот.В них нет ничего особенного;они сигналы, как и любой другой.

3 голосов
/ 12 марта 2012

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

a
b
en
mux

clk и reset не являются частью списка чувствительности.

Это полностью описано в IEEE Std для Verilog (1800-2009, например). Спецификация IEEE - лучший источник подробной информации о Verilog. В документации вашего симулятора также может быть описано, как работает @*.

0 голосов
/ 29 августа 2018

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

Итак, всегда используйте «всегда @ *» или еще лучше «всегда_комб» и забудьтеКонцепция списков чувствительности.Если элемент в коде оценивается, он запускает процесс.Просто как тот.Если элемент находится в if / else, в регистре, назначен переменной или чему-либо еще, он будет «оценен» и, таким образом, вызовет запуск процесса.

Но, просто помните, в цифровомсхемы, список чувствительности отсутствует.

...