Как Verilog «всегда» операторы реализуются на аппаратном уровне?


8

alwaysЗаявление Verilog , а именно

always @(/* condition */)
    /* block of code */

выполняет block of codeвсякий раз, когда conditionвыполняется. Как такой alwaysблок реализован аппаратно?


Я думаю, что это сильно зависит от того, что block of codeэто ..
м.Алин

1
И будет ли это состояние posedge xили простоx
Джастин

@Justin: давайте предположим, что нет posedge.
Randomblue

Ответы:


16

Во-первых, обратите внимание, что не все проекты Verilog являются синтезируемыми. Обычно, только очень специфическое подмножество конструкций может быть использовано в проекте, который должен быть реализован аппаратно.

Одно важное ограничение, которое появляется, состоит в том, что каждая regпеременная может быть назначена не более чем в одном alwaysоператоре. Другими словами, они regимеют сродство с alwaysблоками.

alwaysОбычно могут использоваться блоки следующих типов .

always @(*) begin
    // combinational
end

always @(posedge clk) begin
    // sequential
end

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

С alwaysдругой стороны, регистры, имеющие сходство с блоками последнего типа, являются выходами D-триггеров, которые синхронизируются по переднему фронту clk(если negedgeиспользуется спадающий фронт ). Входы в триггеры, опять же, вычисляются с помощью комбинационной логики из других сигналов.

Рассмотрим следующий, несколько надуманный пример.

reg out, out_n;
always @(*) begin
    out_n = !out;
end
always @(posedge clk) begin
    out <= !out;
end

Здесь out_nсвязан с первым alwaysблоком, outсо вторым. out_nбудет реализован с помощью единственного шлюза NOT, который будет управлять out_nи из которого следует управлять out(обратите внимание, что это чисто комбинационная логика). С другой стороны, outбудет управляться триггером с тактовой частотой clk. Вход для триггера снова будет вычисляться с помощью логического элемента NOT from out(который управляется вышеупомянутым триггером). Оптимизирующие синтезаторы объединят два элемента НЕ и будут использовать один элемент НЕ и один триггер.

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

always @(posedge clk or posedge rst) begin
    if (rst)
        // reset
    else
        // sequential
end

Спасибо. Что касается *, я думал, что это указывает на то, что блок должен выполняться всякий раз, когда изменяется какой-либо сигнал в блоке (в отличие от проекта ).
Randomblue

@Randomblue, ты прав, я исправлю ответ. Обратите внимание, однако, что эти два поведения эквивалентны.
Авакар,

Правда; справедливо!
Randomblue

2

alwaysБлок обычно используется для описания флип-флоп, защелку, или мультиплексор. Код будет реализован с помощью триггера, защелки или мультиплексора.

В FPGA триггер и защелка, как правило, представляют собой две разные конфигурации устройства регистрации более общего назначения. Мультиплексор будет построен из одного или нескольких логических элементов общего назначения (LUT).

В общем, есть два способа разработки Verilog:

  1. Визуализируйте логику, которую вы хотите, с точки зрения логических элементов и регистров, а затем выясните, как описать ее в Verilog. Руководства по синтезу от поставщиков ПЛИС или инструментов для синтеза дают представление о наиболее распространенных структурах, с которыми вы, возможно, захотите работать.

  2. Просто напишите Verilog и не беспокойтесь о том, как выглядит базовое оборудование. Однако, даже если вы сделаете это, вам все равно придется знать, что есть, а что нет. Итак, еще раз, вы посмотрите на шаблон, предоставленный поставщиком инструмента, и адаптируете его к вашему приложению.

РЕДАКТИРОВАТЬ

Ответ Авакара гораздо лучше на ваш вопрос, но это вызвало интересную дискуссию о различиях между Xilinx и Altera, поэтому я не буду его удалять.


"триггер и защелка - это, как правило, две разные конфигурации". Я ожидаю, что защелки будут реализованы с LUT (осторожно, если LUT не без сбоев).
avakar

@avakar, я знаю, что во всех ПЛИС Xilinx (или, по крайней мере, во всех недавно удаленных) защелки используют то же оборудование, что и триггер, отличающийся только одним битом в битовом потоке конфигурации. Я не уверен насчет других брендов.
Кевин Кэткарт

Хм. В некоторых более старых проектах Altera были пути обратной связи, которые позволяли использовать LUT для реализации защелок. Похоже, основная маршрутизация может потребоваться для реализации защелок в более новых проектах. Это не удивительно, так как в современном дизайне RTL фактические защелки (а не триггеры) редко желательны.
Кевин Кэткарт

@avakar, я больше знаком с Xilinx, где устройство регистрации можно настроить как триггер или защелку. Если это невозможно в Altera или каком-либо другом поставщике, это сделает общий совет «не проектировать с защелками» еще сильнее.
Фотон

@KevinCathcart и Photon: я вижу, я не знаком с Xilinx, только с серией Altera Cyclone, у которой нет специальной схемы защелки.
avakar

0

Как уже было сказано, не все блоки являются синтезируемыми. Есть также некоторые блоки, которые будут приняты инструментами синтеза, но которые будут давать результаты, которые отличаются от того, что будет создавать симулятор.

Сначала от списка чувствительности. Обычное правило состоит в том, что оно должно либо содержать только конструкции обнаружения краев (и, как правило, существует ограниченный выбор возможных комбинаций), либо оно должно содержать (возможно, с помощью * или systemverilog's Always_comb) каждый сигнал, используемый в качестве входа в блок. Мы называем первый комбинаторным блоком, а второй - последовательным или блоком. Как правило, если вы включите только подмножество входов в инструменты комбинаторного синтеза блоков, вы просто проигнорируете вас и будете действовать так, как если бы был указан полный список (создавая несоответствия моделирования / синтеза)

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

В последовательном блоке неблокирующие назначения моделируют регистр достаточно напрямую, в то время как блокируют переменные модели назначений (что может или не может подразумевать регистры в зависимости от порядка установки и чтения). Как правило, набор "reg", использующий блокирующие назначения в последовательном блоке, должен читаться только в одном и том же блоке, а блокирующие и неблокирующие назначения не должны смешиваться в одном и том же "reg".

Смешение блокирующих и неблокирующих назначений для одного и того же элемента может привести к ошибкам синтеза. Создание блокировки блока в одном блоке и чтение его в другом может вызвать несоответствия моделирования / синтеза (и, возможно, даже несоответствия между различными прогонами моделирования).

Теперь у нас есть основные правила, с помощью которых мы можем рассмотреть, как компилятор превращает код в логику.

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

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

Инструмент тогда, вероятно, попытается применить некоторые варианты.

В Quartus вы можете увидеть результаты этого процесса после построения вашего проекта, зайдя в «tools-> netlist viewers-> rtl viewer».

После генерации этого структурного представления в терминах абстрактных логических элементов инструмент перейдет к отображению этих абстрактных элементов на ресурсы, которыми фактически обладает чип.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.