2016-11-02 4 views
3

Одной из наиболее полезных функций современных компиляторов для компьютерных языков, таких как C/C++, Fortran, Julia и т. Д., Является их способность выполнять оптимизацию кода перед созданием двоичного кода. Если бы я должен был написать функцию, например, Verilog, чтобы сделать специальную функцию FPGA «hardware», выполнит ли компилятор какие-либо оптимизации? В качестве конкретного примера, скажем, я хочу настроить полиномиальный оценщик, который использует Estrin's scheme for parallelized evaluation, а некоторые из коэффициентов равны 0, будет ли компилятор видеть это и оптимизировать эффективные NOOP?Составители для языков ПЛИС выполняют оптимизацию?

ответ

5

Да. Оптимизация в вашем примере называется «постоянное распространение». Когда дело доходит до оптимизации булевых или арифметических выражений, методы одинаковы во всех компиляторах. Компилятор упростит любое выражение. Другая оптимизация - «« Исключение мертвого кода »« Если условие ветвления оказывается константой, разблокированные ветви могут быть устранены, а принятая ветвь становится безусловной. Но после того, как RTL преобразуется в аппаратное представление, процесс оптимизации сильно отличается от программных компиляторов.

+0

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

+2

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

+0

Это не может быть так, не так ли? Я не специалист по аппаратным средствам, поэтому я могу ошибаться, но могу себе представить, что аппаратное обеспечение должно иметь возможность выполнять повторение, которое выполняется всякий раз, когда уменьшающийся счетчик не равен нулю, и установлен флаг «готов к следующей итерации». Являются ли они невозможными или не практичными (то есть неустойчивыми) в некотором роде? –

0

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

+1

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

Смежные вопросы