ViKo 1 14 ноября, 2010 Опубликовано 14 ноября, 2010 · Жалоба Продолжая эксперименты по теме, обсуждаемой в http://electronix.ru/forum/index.php?showt...mp;#entry839222 создал 4-ступенчатый конвейерный сумматор-аккумулятор module exAdderPipe ( input wire [31:0] din, input wire clk, output logic [32:0] dout ); bit [31:8] din1st; bit [8:0] sum1st; bit [31:16] din2st; bit [16:8] sum2st; bit [7:0] dout2st; bit [31:24] din3st; bit [24:16] sum3st; bit [15:0] dout3st; bit [32:24] sum4st; bit [23:0] dout4st; always @(posedge clk) begin din1st <= din[31:8]; sum1st <= din[7:0] + sum1st[7:0]; din2st <= din1st[31:16]; sum2st <= sum1st[8] + (din1st[15:8] + sum2st[15:8]); dout2st <= sum1st[7:0]; din3st <= din2st[31:24]; sum3st <= sum2st[16] + (din2st[23:16] + sum3st[23:16]); dout3st <= {sum2st[15:8], dout2st[7:0]}; sum4st <= sum3st[24] + (din3st[31:24] + sum4st[32:24]); dout4st <= {sum3st[23:16], dout3st[15:0]}; end assign dout = {sum4st, dout4st}; endmodule И обнаружил одно неприятное свойство (замечал и раньше, но здесь - уже "вопиющее безобразие"). В Q9.1SP2 для EPM1270T144A5 с настройками Speed (эта, похоже - вообще ничего не решает никогда), Standard Fit, Default required fmax = 150 MHz, Classic Timing Analisis дает 171.82 MHz и проект укладывается в 135 LE. Стоит только убрать круглые скобки в выражениях суммирования в показанном коде (во всех 3-х местах), изменить порядок вычисления, как получается 114 MHz и 159 LE. Неужели Quartus настолько туп?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 1 февраля, 2011 Опубликовано 1 февраля, 2011 · Жалоба 32 ЛУТ 300 МГц для Спартана в ISE 40 ЛУТ 400(250) МГц для Циклона в Quartus-II В настройках надо запретить shifter, в ISE еще keep_hierarchy = yes. module tst(output [32:0] dout, input [31:0] din, input clk); reg [31:0] din1st, din2st, din3st; reg [31:0] dout2st, dout3st, dout4st; wire [8:0] sum1st, sum2st, sum3st, sum4st; always @(posedge clk) begin din1st <= din[31:8]; din2st <= din1st[31:8]; din3st <= din2st[31:8]; dout2st <= sum1st[7:0]; dout3st <= {sum2st[7:0], dout2st[ 7:0]}; dout4st <= {sum3st[7:0], dout3st[15:0]}; end sum m1(sum1st, sum1st, din[7:0], 0, clk); sum m2(sum2st, sum2st, din1st[7:0], sum1st[8], clk); sum m3(sum3st, sum3st, din2st[7:0], sum2st[8], clk); sum m4(sum4st, sum4st, din3st[7:0], sum3st[8], clk); assign dout = {sum4st[8:0], dout4st[23:0]}; endmodule module sum(output reg [8:0] q, input [7:0] a, b, input c, clk); always@(posedge clk) q <= a + b + c; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба 32 ЛУТ 300 МГц для Спартана в ISE 40 ЛУТ 400(250) МГц для Циклона в Quartus-II Я для CPGA писал, в качестве эксперимента. А когда написать q <= c + a + b, сколько получается? То, что в скобках? P.S. вы написали "Имхо, запись можно заметно упростить за счет индексов". Что вы имели в виду? Иерархический принцип? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба Синтез исходного текста дает то-же самое, со скобками не экспериментировал - поверил на слово. "Имхо, запись можно заметно упростить за счет индексов" - имел в виду, что чем меньше индексов в выражениях, особенно разных и смещенных, тем легче воспринимается алгоритм. Пусть софт сам убирает лишние разряды и тп. А выделениме мелкого модуля сделано только для ISE, иначе лепит лишнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба - имел в виду, что чем меньше индексов в выражениях, особенно разных и смещенных, тем легче воспринимается алгоритм. Пусть софт сам убирает лишние разряды и тп. А мне так наоборот было проще писать именно те индексы, которые представляют соответствующие разряды в результате, чем бояться неправильно сдвинуть их в сумматорах. Нарисовали б на бумажке, было бы все прозрачно. Еще мне показалось, что din1st в сумматоорах у вас используется неправильно. Внимательно не изучал, но... Нет, это я не разобрался. upd. еще раз прикинул - мало у вас LUT, невероятно. У меня ж конвейер 4-ступенчатый, в каждой ступени 4*8 разрядов. Я понимаю, что можно и без конвейера, но важен был именно принцип. Для EP3C5F256C8 мой код дает со скобками 132LE 326.37MHz без скобок 135LE 177.62MHz (а до фиттера цифра 159LE) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба LE это или только ЛУТ, или только триггер, или ЛУТ + триггер. Я привел только ЛУТ-ы, с триггерами обычно и так все понятно. Привык выделять именно ЛУТ-ы, чтобы отслеживать оптимальность синтеза. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба LE это или только ЛУТ, или только триггер, или ЛУТ + триггер. +------------------------------------------------------------------------------------+ ; Flow Summary ; +------------------------------------+-----------------------------------------------+ ; Flow Status ; Successful - Wed Feb 02 15:43:55 2011 ; ; Quartus II Version ; 9.1 Build 350 03/24/2010 SP 2 SJ Full Version; ; Revision Name ; exAdder ; ; Top-level Entity Name ; exAdderPipe ; ; Family ; Cyclone III ; ; Device ; EP3C5F256C8 ; ; Timing Models ; Final ; ; Met timing requirements ; N/A ; ; Total logic elements ; 132 / 5,136 ( 3 % ) ; ; Total combinational functions ; 39 / 5,136 ( < 1 % ) ; ; Dedicated logic registers ; 132 / 5,136 ( 3 % ) ; ; Total registers ; 132 ; ; Total pins ; 66 / 183 ( 36 % ) ; ; Total virtual pins ; 0 ; ; Total memory bits ; 0 / 423,936 ( 0 % ) ; ; Embedded Multiplier 9-bit elements; 0 / 46 ( 0 % ) ; ; Total PLLs ; 0 / 2 ( 0 % ) ; +------------------------------------+-----------------------------------------------+ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба "Total combinational functions ; 39 / 5,136 " -это и есть ЛУТ-ы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба "Total combinational functions ; 39 / 5,136 " -это и есть ЛУТ-ы. "Ну вы, блин, даете!" (с) Триггеры вас принципиально не интересуют? А как запретить shifter в Quartus? Вот это - Allows the Compiler to infer shift registers of any size even if they do not meet the design's current minimum size requirements. никогда не пользовался. еще нашел - Allows the Compiler to find a group of shift registers of the same length that can be replaced with the altshift_taps megafunction. The shift registers must all use the same clock and clock enable signals, must not have any other secondary signals, and must have equally spaced taps that are at least three registers apart. стояло Auto или это - Allows the Compiler to find a group of shift registers of the same length that can be replaced with the altshift_taps megafunction. The shift registers must all use the same aclr signals, must not have any other secondary signals, and must have equally spaced taps that are at least three registers apart. To use this option, you must turn on the Auto Shift Register Replacement logic option. это было On Проверил ваш вариант. И в случае always@(posedge clk) q <= c + a + b; и как написано - дает одинаковое количество LE и Fmax. Такое же, как у меня в лучшем варианте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба Число триггеров слабо меняется при неоптимальном синтезе, а число ЛУТ - значительно. Поэтому и не смотрю на триггеры, только на ЛУТ-ы. Еще проверяю число уровней логики. always@(posedge clk) q <= c + a + b; - в отдельном модуле - только для ISE, для Quartus - без разницы. Просто привел один общий вариант, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба q <= c + a + b; - в отдельном модуле - только для ISE, для Quartus - без разницы Какие есть соображения, почему в вашем варианте перестановка слагаемых не влияет на результат компиляции, а в моем влияет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 3 февраля, 2011 Опубликовано 3 февраля, 2011 · Жалоба С Квартусом мало работал, по нему ничего не скажу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться