Уменьшите задержку, поняв отчет Xilinx Synthesis

Я программирую набор инструкций 8051 на VHDL в Xilinx. Написав логику и сгенерировав отчет о синтезе, я увидел, что Задержка составляет 13,330 нс (частота 75,020 МГц) при Уровнях логики = 10.

Это значение довольно меньше (частота), и мне нужно его увеличить, но я не могу понять, что/где задержка, используя отчет о синтезе.

Это часть отчета, в которой говорится о сроках:

=========================================================================
Timing constraint: Default period analysis for Clock 'clk_div1'
  Clock period: 13.330ns (frequency: 75.020MHz)
  Total number of paths / destination ports: 156134 / 3086
-------------------------------------------------------------------------
Delay:               13.330ns (Levels of Logic = 10)
  Source:            SEQ/alu_op_code_1 (FF)
  Destination:       SEQ/alu_src_2L_7 (FF)
  Source Clock:      clk_div1 rising
  Destination Clock: clk_div1 rising

  Data Path: SEQ/alu_op_code_1 to SEQ/alu_src_2L_7
                                Gate     Net
    Cell:in->out      fanout   Delay   Delay  Logical Name (Net Name)
    ----------------------------------------  ------------
     FDE:C->Q             40   0.591   1.345  SEQ/alu_op_code_1 (SEQ/alu_op_code_1)
     LUT4:I1->O            2   0.643   0.527  ALU1/ci32_SW0 (N2251)
     LUT4:I1->O            1   0.643   0.000  ALU1/adder_comp/C11_F (N1292)
     MUXF5:I0->O           3   0.276   0.531  ALU1/adder_comp/C11 (ALU1/adder_comp/C1)
     MUXF5:S->O           12   0.756   0.964  ALU1/adder_comp/C21 (ALU1/adder_comp/C2)
     LUT4:I3->O            8   0.648   0.760  ALU1/ans_L<5>104 (ALU1/ans_L<5>104)
     LUT4:I3->O           17   0.648   1.054  ALU1/ans_L<7>95_SW0 (N264)
     LUT4:I3->O            1   0.648   0.000  SEQ/alu_src_2H_and000055_SW3_F (N1304)
     MUXF5:I0->O           1   0.276   0.423  SEQ/alu_src_2H_and000055_SW3 (N599)
     LUT4_D:I3->O         15   0.648   1.049  SEQ/alu_src_2L_mux0005<7>121228 (N285)
     LUT4:I2->O            1   0.648   0.000  SEQ/alu_src_2H_mux0007<6> (SEQ/alu_src_2H_mux0007<6>)
     FDE:D                     0.252          SEQ/alu_src_2H_1
    ----------------------------------------
    Total                     13.330ns (6.677ns logic, 6.653ns route)
                                       (50.1% logic, 49.9% route)

Может кто-нибудь объяснить, что происходит?


person Saurabh    schedule 28.10.2011    source источник
comment
Каковы ваши временные ограничения?   -  person    schedule 28.10.2011


Ответы (3)


Посмотрите на имена в отчете и сравните с исходным кодом.

По сути, у вас есть только комбинационная логика, протекающая в экземпляре «SEQ» от кода операции ALU к выходному сигналу ALU «alu_src_2L»:

Источник: SEQ/alu_op_code_1 (FF) Назначение: SEQ/alu_src_2L_7 (FF)

Глядя на детали, вы можете видеть, что в этом конкретном пути большую часть времени используется в вашем АЛУ «ALU1» и, в частности, в логике сумматора/сравнения «adder_comp». Если вы хотите иметь меньшую задержку в этом пути, вам придется либо оптимизировать логику, либо сократить путь с помощью другого регистра (и заставить остальную часть проекта по-прежнему работать с этим изменением).

person wjl    schedule 28.10.2011

Несколько определений:

  • Задержка ворот: для входа, чтобы вызвать изменение на выходе блока
  • Чистая задержка: время для сигнала, чтобы добраться до следующего блока

13.33ns состоит из двух частей. 6,677 нс задержка шлюза и 6,653 нс чистая задержка

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

Каждая строка в отчете говорит об одном логическом блоке. Итак, первая строка регистра alu_op_code_1 и время, которое проходит от вывода C (Clk) до вывода Q (выход). Столбец разветвления показывает, сколько логических блоков управляет выводом Q. В данном случае это 40, поэтому сетевая задержка достаточно высока. Однако вполне понятно, что часто используемый регистр, такой как код операции ALU, имеет большое разветвление.

Мы также можем посмотреть на путь в целом и увидеть, что он идет от кода операции в SEQ к ALU. через сумматор обратно в блок SEQ и, наконец, в другой регистр с именем alu_src_2H_1. Что это за путь, я не могу вам сказать. Это может сделать только тот, у кого есть источник, и тогда нужно попытаться увидеть, какая логика существует между этими двумя регистрами.

Что меня немного смущает, так это то, что этот путь выглядит так, как будто он соответствует времени (цель 13,33 нс), но вы говорите, что вам нужно «усилить его». Почему?

person Paul S    schedule 28.10.2011
comment
У меня есть исходный код. Что я пытаюсь спросить, так это то, что, глядя на сводный отчет, могу ли я узнать, какая часть моего кода медленная (другими словами, где задержка больше всего), чтобы я мог работать над ней и увеличить частота. - person Saurabh; 28.10.2011
comment
Отношения «один к одному» отсутствуют, но некоторые имена в отчете будут соответствовать вашему источнику. Обычно это начальная точка, конечная точка и имена блоков, через которые вы проходите. Это похоже на вывод ассемблера из компилятора C. Некоторые имена совпадают, другие генерируются компилятором. - person Paul S; 28.10.2011

Во-первых, при написании HDL или адаптации HDL для FPGA действительно полезно понимать возможности и ограничения вашей конкретной FPGA. Xilinx отлично документирует каждую модель FPGA. Глядя на блоки LUT4 и MUXF5, ваше семейство FPGA может быть Spartan 3? Изучая таблицы данных, вы можете увидеть, какие аппаратные конструкции очень эффективны для реализации, а какие требуют больше ресурсов. В целом, чем ближе аппаратная часть соответствует тому, что на самом деле находится на чипе, тем быстрее она будет работать и тем меньше места будет занимать.

Например, Xilinx LUT также можно использовать в качестве регистра сдвига, что означает, что вам не нужно использовать триггеры в слайсе. Это приводит к очень заметному улучшению, если вы убедитесь, что ваши сдвиговые регистры отображаются на LUT. XST делает все возможное с вашим HDL, чтобы вывести эти эффективные сопоставления, но часто есть глупые вещи, которые мешают этим эффективным сопоставлениям, например, сигнал включения проверяется перед сигналом сброса. Убедитесь, что вы изучаете выходные данные синтезатора, а также место и маршрут, чтобы определить случаи, когда вы можете улучшить отображение на FPGA. В документации Xilinx приведены примеры VHDL и Verilog, которые XST может использовать для определения более эффективных компонентов. Иногда бывает проще просто создать экземпляр компонента напрямую. А для сложных компонентов есть UNIMACRO и мастер COREGEN, которые производят очень эффективное оборудование.

Например, микроконтроллер PicoBlaze был написан специально для использования преимуществ архитектуры Xilinx FPGA. Может быть полезно изучить исходный код PicoBlaze, чтобы увидеть примеры такого эффективного сопоставления.

Во-вторых, если ваш комбинационный логический путь слишком длинный, это ограничит вашу максимальную тактовую частоту. Помимо переписывания вашего кода либо для лучшего отображения на FPGA, либо для устранения ненужных аппаратных ресурсов, вы также можете вставить триггеры (регистры) где-нибудь в середине вашей комбинационной логической цепочки. В компьютерной архитектуре это называется конвейерной обработкой и заставит вас увеличить количество циклов на инструкцию. Например, PicoBlaze использует два цикла на инструкцию. У Intel Pentium 4 было около 17 циклов на инструкцию. Если вы умны, вы можете написать свой HDL таким образом, чтобы вы начали обработку одной инструкции и в то же время закончили обработку последней инструкции. Это означает, что для каждой инструкции по-прежнему потребуется 2 такта (задержка), но вы сможете отказаться от одной инструкции за цикл (пропускная способность). Большинство микроконтроллеров, таких как 8051 и PicoBlaze, озабочены задержкой, а большинство микропроцессоров, таких как архитектура x86, — пропускной способностью.

person Nathan Farrington    schedule 29.10.2011