Эффективный C-код для аппаратной реализации в Verilog - PullRequest
0 голосов
/ 24 ноября 2008

У меня есть простой C-код для Image code. Моя цель - разработать эффективную C-модель, которая будет взята и реализована в Hardware с использованием Verilog или некоторого такого языка описания Hardware. То, что я пытаюсь выяснить, это:

1.) Какие изменения необходимо внести в существующие структуры кода C, чтобы сделать его аппаратно эффективным

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

3.) Я слышал, что у модели H / W не должно быть условий или минимальных, насколько это возможно. О чем это?

(Рассмотрим общую реализацию аппаратного обеспечения с использованием некоторой FPGA, Verilog без подробной информации о шине, часах и т. Д.)

-AD

1 Ответ

2 голосов
/ 04 декабря 2008
  1. Это зависит от того, как последовательно или параллельно вы хотите использовать аппаратную реализацию вашего алгоритма.

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

  1. В RTL-дружественном Verilog у вас есть комбинационная логика (непрерывное назначение логического уравнения) и память (регистры и защелки) для сохранения состояния во времени. Ваши структуры данных, закодированные как RTL, вероятно, будут выводить регистры и защелки во время логического синтеза. Ваши структуры данных, вероятно, будут работать при правильном кодировании в Verilog, но то, что имеет смысл выполнять на микропроцессоре, может быть не лучшим способом встроить его в аппаратное обеспечение. Опять же, это зависит.

  2. «if» может использоваться как для комбинационной логики, так и для логики памяти (состояние удержания) «если», когда записано как троичный оператор (Verilog имеет тот же синтаксис, что и C для этого), синтезируется в мультиплексор (мультиплексор). «if» также может использоваться в описании логики для регистра, чтобы увидеть, был ли установлен вывод сброса после срабатывания всегда списка заблокированных событий (это только один пример). Будьте осторожны с «Если»: когда намереваетесь создать комбинационную логику с всегда блоком (список событий не содержит posedge clk или negedge clk, posedge reset, negedge reset и т. Д.) И присвойте комбинационную логическую переменную как часть оператор «если», но затем забудьте о «другом» выражении, которое будет зафиксировано во время синтеза. Отсутствие соответствующего оператора «else» для оператора «if» означает, что ничего не нужно делать (удерживайте значение).

Тип "reg" используется для описания как комбинационной логики, так и логики памяти; То, какая логика синтезируется, зависит от списка событий всегда блока и наличия полного регистра. Код на C обычно переводится в стиль, используемый всегда в блоках.

Тип «провод» используется для непрерывного назначения (комбинационная логика).

ImpulseC - это программно-аппаратный компилятор, который выглядит интригующе. HDL Coder является сопутствующим продуктом для MATLAB / Simulink для автоматической генерации описания вашего оборудования.

Даже если вы используете эти программные средства для создания описания аппаратного обеспечения, вам все равно захочется понять, что они сгенерировали.

...