Разделение в языке Verilog

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

поэтому я смущен, не может verilog обрабатывать простое разделение? является ли оператор / бесполезным?

8 ответов


все зависит от того, какой тип кода ты пишешь.

если вы пишете код, который вы собираетесь синтезировать, что вы собираетесь перейти в FPGA или ASIC, то вы, вероятно, не хотите использовать операторы деления или по модулю. Когда вы помещаете любой арифметический оператор в RTL, синтезатор создает схему для выполнения задания; сумматор для + & -; повышающий коэффициент за *. Когда вы пишете / вы просите схему делителя, но схема делителя очень сложная вещь. Он часто занимает несколько тактовых циклов и может использовать таблицы поиска. Это требует много инструмента синтеза, чтобы сделать вывод, что вы хотите, когда вы пишете a / b.

(очевидно, деление на степени 2 просто, но обычно вы бы использовали операторы сдвига)

если вы пишете код, который вы не хотите синтезировать, например, это часть тестового стенда, то вы можете использовать разделение все, что хотите.

Итак, чтобы ответить на ваш вопрос,/ оператор не бесполезен, но вы должны быть осведомлены о том, где и почему вы его используете. То же самое верно и для *, но в меньшей степени. Мультипликаторы довольно дороги,но большинство синтезаторов способны вывести их.


деление и по модулю никогда не бывают "простыми". Избегайте их, если это возможно, например, с помощью битовых масок или операций сдвига. Особенно переменный делитель действительно сложно реализовать в аппаратном обеспечении.


Так что я запутался. не может verilog обрабатывать простое разделение? это оператор бесполезно?

спецификация синтеза verilog (IEEE 1364.1) фактически указывает, что все арифметические операторы с целочисленными операндами должны поддерживаться, но никто не следует этой спецификации. Некоторые инструменты синтеза могут выполнять целочисленное деление, но другие отвергают его (я думаю, что XST все еще делает), потому что комбинационное деление обычно очень неэффективно. Реализации Multicycle являются нормой, но эти невозможно синтезировать из'/'.


вы должны думать в оборудовании.

когда вы пишете a

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

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

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

затем в вашем verilog вы можете реализовать свое приблизительное деление на умножение (что не слишком дорого на современных FPGAS) с последующим сдвигом (сдвиг на фиксированное количество бит по существу свободен в аппаратном обеспечении). Убедитесь, что вы разрешаете достаточно битов для промежуточного результата.

Если вам нужен точный ответ или если вам нужно разделить на что-то, что не является предопределенной константой, вам придется решить, какой разделитель вы хотите. Если пропускная способность низкая, то вы можете использовать подход на основе государственной машины,который делает одно деление каждые n тактов. Если ваша пропускная способность высока, и вы можете позволить себе область устройства, то более подходящим может быть конвейерный подход, который делает разделение за такт (но требует нескольких циклов для прохождения результата).

часто поставщики инструментов будут предоставлять готовые блоки (altera называет их мегафункциями) для такого рода вещей. Преимущество этих заключается в том, что поставщик инструмента, вероятно, будет тщательно оптимизировал их для устройства. Недостатком является то, что они могут принести vendor lockin, если вы хотите перейти к другому поставщику устройств, вам, скорее всего, придется поменять блок, и блок, который вы меняете, может иметь разные характеристики.


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

когда вы синтезируете свой код для конкретного чипа, есть ограничения. Ограничения, как правило, основаны на том, что поставщик инструментов считает "разумным", а не на том, что возможно.

в старые времена деление на что-либо, кроме степени двух, считалось неразумным для кремний же занимал много места и бежал очень медленно. На данный момент некоторые синтезаторы с помощью create "divide by a constant" создают для вас схемы.

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


  1. схемы, включая только деление на 2 : просто сдвиньте бит:)
  2. другое, чем 2 .... смотрите, вы всегда должны думать, что на уровне схемы verilog не C или c++
  3. / и % не синтезируется или если он становится( в новых версиях), я считаю, что вы должны сохранить свою собственную схему деления, потому что ip, который они предоставляют, будет общим ( скорее всего, они сделают для плавающей не фиксированной)
  4. держу пари, вы прошли через компьютер Морриса Мано architechure книга, там в некоторых последних главах весь поток дается вместе с algo, пройти через него следовать за ним и сделать свой собственный
  5. см. теперь, если ваши работы идут только для проверки логики, и никакая реальная схема не нужна, обязательно перейдите к / и % . нет проблем, это будет работать для моделирования

разделение с помощью ' / ' возможно в verilog. Но это не синтезируемый оператор. То же самое относится к умножению с использованием '*'. Существуют определенные алгоритмы для выполнения этих операций в verliog, и они используются, если код должен быть синтезируемым. то есть. если для этого требуется эквивалентное оборудование.

Я не знаю никаких алгоритмов для деления, но для умножения я использовал алгоритм Бута.


используя result <= a/b и прекрасно работает.

помните, при использовании <= оператор, ответ вычисляется немедленно, но ответ вводится внутри регистра "результат" на следующем положительном крае часов.

Если вы не хотите ждать до следующего использования положительного края часов result = a/b.

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

его, как когда-10 Бородавочник штурмовик атакует танк он стреляет много пуль. Вот как действует схема делителя при делении, она выплевывает случайные биты. Через пару наносекунд он закончит деление и вернет стабильный хороший результат.

вот почему мы ждем следующего такта для регистра "результат". Мы стараемся защитить его от случайных мусорных номеров.

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