В чем разница между вариантами always блоков в Verilog/SystemVerilog? В Verilog есть блок always Так же сущемтвуют вариации этого блока вида always_*. В чем между ними разница?

22 Мар в 19:52
134 +1
0
Ответы
1

В языках Verilog и SystemVerilog блоки always и их вариации <code>alwayscomb</code>,<code>alwaysff</code>,<code>alwayslatch</code><code>always_comb</code>, <code>always_ff</code>, <code>always_latch</code><code>alwaysc omb</code>,<code>alwaysf f</code>,<code>alwaysl atch</code> используются для описания поведения цифровых схем, но у них есть важные различия в том, как они обрабатывают чувствительность и типы синхронного/асинхронного поведения.

1. always

Блок always используется для описания логики, где чувствуются изменения на определённых сигналах. Он может быть использован в различных вариантах — в синхронной или асинхронной логике, однако его использование требует более внимательного подхода к определению чувствительности, чтобы избежать ошибок. Например, для синхронных регистров можно использовать:

always @posedgeclockposedge clockposedgeclock begin
// логика
end

В этом примере чувствительность определяется явно.

2. always_comb

always_comb — это более современный вариант, который используется в SystemVerilog для описания комбинированной логики. Этот блок автоматически определяет список чувствительных сигналов на основе использованных в блоке переменных. Он гарантирует, что код будет срабатывать каждый раз, когда изменится одно из входных значений:

always_comb begin
// логика
end

Преимущества:

Не требует ручного определения списка чувствительности.Исключает возможность пропуска сигналов, что снижает вероятность ошибок.3. always_ff

always_ff используется для синхронных блоков, описывающих последовательную логику, такую как те, что используют триггеры например,D−триггерынапример, D-триггерынапример,Dтриггеры. Этот блок также автоматически требует, чтобы значения менялись только в ответ на сигналы синхронизации например,<code>posedge</code>или<code>negedge</code>длятактовогосигналанапример, <code>posedge</code> или <code>negedge</code> для тактового сигналанапример,<code>posedge</code>или<code>negedge</code>длятактовогосигнала:

always_ff @posedgeclockposedge clockposedgeclock begin
// логика
end

Преимущества:

Эксплицидно требует использование определенных синхронных событий.Помогает избежать ошибок, связанных с асинхронными сбросами или сигналами.4. always_latch

always_latch определяет асинхронные триггеры или запоминающие элементы латчилатчилатчи. Этот блок используется, когда необходимо сохранять значение, когда входные сигналы активны:

always_latch begin
// логика
end

Эти блоки помогают также исключить ошибки, связанные с latch-ами, когда не определены все возможные ветвления.

В заключениеБлоки always требуют явного определения чувствительности, и их использование более рискованное.Блоки always_comb, always_ff и always_latch вводят явные семантические правила, что упрощает написание и поддержку кода в Verilog/SystemVerilog. Использование более специфичных блоков рекомендуется для уменьшения вероятности ошибок и повышения читаемости кода.
22 Мар в 19:52
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир