Перейти к содержанию
    

Quartus. SystemVerilog

Продолжая эксперименты по теме, обсуждаемой в

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 настолько туп?!

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 ЛУТ 300 МГц для Спартана в ISE

40 ЛУТ 400(250) МГц для Циклона в Quartus-II

Я для CPGA писал, в качестве эксперимента.

А когда написать q <= c + a + b, сколько получается? То, что в скобках?

 

P.S. вы написали "Имхо, запись можно заметно упростить за счет индексов". Что вы имели в виду? Иерархический принцип?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Синтез исходного текста дает то-же самое, со скобками не экспериментировал - поверил на слово.

 

"Имхо, запись можно заметно упростить за счет индексов"

- имел в виду, что чем меньше индексов в выражениях, особенно разных и смещенных, тем легче воспринимается алгоритм. Пусть софт сам убирает лишние разряды и тп.

А выделениме мелкого модуля сделано только для ISE, иначе лепит лишнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

- имел в виду, что чем меньше индексов в выражениях, особенно разных и смещенных, тем легче воспринимается алгоритм. Пусть софт сам убирает лишние разряды и тп.

А мне так наоборот было проще писать именно те индексы, которые представляют соответствующие разряды в результате, чем бояться неправильно сдвинуть их в сумматорах. Нарисовали б на бумажке, было бы все прозрачно.

Еще мне показалось, что din1st в сумматоорах у вас используется неправильно. Внимательно не изучал, но... Нет, это я не разобрался.

upd. еще раз прикинул - мало у вас LUT, невероятно. У меня ж конвейер 4-ступенчатый, в каждой ступени 4*8 разрядов. Я понимаю, что можно и без конвейера, но важен был именно принцип.

 

Для EP3C5F256C8 мой код дает

со скобками 132LE 326.37MHz

без скобок 135LE 177.62MHz (а до фиттера цифра 159LE)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LE это или только ЛУТ, или только триггер, или ЛУТ + триггер.

Я привел только ЛУТ-ы, с триггерами обычно и так все понятно.

 

Привык выделять именно ЛУТ-ы, чтобы отслеживать оптимальность синтеза.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 % )                                ;
+------------------------------------+-----------------------------------------------+

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"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. Такое же, как у меня в лучшем варианте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Число триггеров слабо меняется при неоптимальном синтезе, а число ЛУТ - значительно. Поэтому и не смотрю на триггеры, только на ЛУТ-ы. Еще проверяю число уровней логики.

always@(posedge clk) q <= c + a + b; - в отдельном модуле - только для ISE, для Quartus - без разницы. Просто привел один общий вариант,

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

q <= c + a + b; - в отдельном модуле - только для ISE, для Quartus - без разницы

Какие есть соображения, почему в вашем варианте перестановка слагаемых не влияет на результат компиляции, а в моем влияет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...