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

Помогите ускорить проект на Verilog

1 hour ago, Nick_K said:

Скорее всего и оптимальнее, да. Symplify далеко не дурной синтезатор (может даже один из лучших, которіх я видел), сам сможет построить нужную логику, чтобы не далать лишние преобразования.

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

Спасибо.

2 minutes ago, lexx said:

Перейдите на one hot. Это быстрее, чем текущий if-else.

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

Что такое one Hot ?

Констрейн на тактовый стоит. Это единственный констрейн в моем проекте (((

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


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

One hot - только один валидный бит в один момент  времени. Имплементация проще в этом случае.

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


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

20 minutes ago, lexx said:

One hot - только один валидный бит в один момент  времени. Имплементация проще в этом случае.

Так изначально и было. Изначальный листинг в самом первом моем сообщении этой темы.

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


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

Приветствую!

2 hours ago, dimka76 said:

Так изначально и было. Изначальный листинг в самом первом моем сообщении этой темы.

Изначально   у вас  шло сравнение со всеми 12 битами sel,  и даже  если на sel был onehot  то при таком стиле описания case ghb синтезе получалось крит. цепочка логики :  регистр sel -> компаратор 12 бит -> кодирование ->  mux -> выходной регистр.

Пример описания case для onehot я приводил. И в том же Synplify в справке для атрибутов синтеза  вы увидите в чем разница при синтезе case с разными атрибутами 

//
  case (1'b1) // synthesis parallel_case full_case
    sel_r[0]: begin
      register[15:0] <= data_in_1[31:16];
      data_out[15:0] <= data_in_1[15:0];
    end

    sel_r[8]: begin
     register[15:0] <= data_in_2[31:16];
     data_out[15:0] <= data_in_2[15:0];
    end
...        

 

 

21 hours ago, dimka76 said:

Боюсь, что это может разойтись с логикой работы моего устройства. Да и все данные, которые здесь используются формируются внутри ПЛИС и привязаны к одному и тому же клоку.

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

 

Успехов!   Rob.

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


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

21 час назад, Plain сказал:

в явном виде описать коммутацию на 1-битных мультиплексорах

 

assign mux1_1[31:0] = (sel[1]) ? data_in_1[31:0] : data_in_2[31:0];
assign mux1_2[31:0] = (sel[1]) ? data_in_3[31:0] :    z_in_1[31:0];
assign mux1_3[31:0] = (sel[1]) ?    z_in_2[31:0] :    z_in_3[31:0];

assign mux2_1[31:0] = (sel[2]) ?    mux1_1[31:0] :    mux1_2[31:0];
assign mux2_2[31:0] = (sel[2]) ?    mux1_3[31:0] :          32'd:0;

always @(posedge clk)
if (sel[3]) begin
 register[15:0] <= mux2_1[31:16];
 data_out[15:0] <= mux2_1[15:0];
end else begin
 register[15:0] <= mux2_2[31:16];
 data_out[15:0] <= mux2_2[15:0];
end

 

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


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

52 minutes ago, RobFPGA said:

Приветствую!

Изначально   у вас  шло сравнение со всеми 12 битами sel,  и даже  если на sel был onehot  то при таком стиле описания case ghb синтезе получалось крит. цепочка логики :  регистр sel -> компаратор 12 бит -> кодирование ->  mux -> выходной регистр.

Пример описания case для onehot я приводил. И в том же Synplify в справке для атрибутов синтеза  вы увидите в чем разница при синтезе case с разными атрибутами 


//
  case (1'b1) // synthesis parallel_case full_case
    sel_r[0]: begin
      register[15:0] <= data_in_1[31:16];
      data_out[15:0] <= data_in_1[15:0];
    end

    sel_r[8]: begin
     register[15:0] <= data_in_2[31:16];
     data_out[15:0] <= data_in_2[15:0];
    end
...        

 

Сделал как вы предложили. Достижимая частота выросла до 159,9 МГц.

Спасибо !

7 minutes ago, Plain said:

 


assign mux1_1[31:0] = (sel[1]) ? data_in_1[31:0] : data_in_2[31:0];
assign mux1_2[31:0] = (sel[1]) ? data_in_3[31:0] :    z_in_1[31:0];
assign mux1_3[31:0] = (sel[1]) ?    z_in_2[31:0] :    z_in_3[31:0];

assign mux2_1[31:0] = (sel[2]) ?    mux1_1[31:0] :    mux1_2[31:0];
assign mux2_2[31:0] = (sel[2]) ?    mux1_3[31:0] :          32'd:0;

always @(posedge clk)
if (sel[3]) begin
 register[15:0] <= mux2_1[31:16];
 data_out[15:0] <= mux2_1[15:0];
end else begin
 register[15:0] <= mux2_2[31:16];
 data_out[15:0] <= mux2_2[15:0];
end

 

Спасибо !

58 minutes ago, RobFPGA said:

 

22 hours ago, dimka76 said:

Боюсь, что это может разойтись с логикой работы моего устройства. Да и все данные, которые здесь используются формируются внутри ПЛИС и привязаны к одному и тому же клоку.

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

Это был ответ на предложенный вами pipeline FF

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


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

Приветствую!

4 minutes ago, Plain said:

 


assign mux1_1[31:0] = (sel[1]) ? data_in_1[31:0] : data_in_2[31:0];
assign mux1_2[31:0] = (sel[1]) ? data_in_3[31:0] :    z_in_1[31:0];
assign mux1_3[31:0] = (sel[1]) ?    z_in_2[31:0] :    z_in_3[31:0];

assign mux2_1[31:0] = (sel[2]) ?    mux1_1[31:0] :    mux1_2[31:0];
assign mux2_2[31:0] = (sel[2]) ?    mux1_3[31:0] :          32'd:0;
...

 

И все ваши титанические :bb: усилия  пойдут прахом  если не зафиксировать этот сизифов труд атрибутами  которые не позволят синтезатору переделать все как ему будет удобнее.:moil:

Да и смысла особого в этом нет так как проблема не в самом mux а именно в декодировании  управления для оного. 

 

Удачи! Rob. 

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


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

32 minutes ago, RobFPGA said:

И все ваши титанические :bb: усилия  пойдут прахом  если не зафиксировать этот сизифов труд атрибутами  которые не позволят синтезатору переделать все как ему будет удобнее.:moil:

Не скажу и именно по FPGA, но Synopsys не рекомендует использовать атрибуты синтеза.

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


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

19 минут назад, RobFPGA сказал:

зафиксировать ... атрибутами  которые не позволят синтезатору переделать все как ему будет удобнее

 

wire [31:0] mux1_1 /* synthesis keep */;

Так?

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


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

Приветствую!

47 minutes ago, Plain said:

 


wire [31:0] mux1_1 /* synthesis keep */;

Так?

Можно  и так - но в таком случае получится вдвойне сизифов труд -  так как это запретит синтезатору  возможность объединить mux_1 в  одной LUT со следующим каскадом mux.  Соответственно вы получите на уровень логики больше  чем могли бы получить в оптимальном случае.

 

Заниматься низкоуровневой оптимизацией  на примитивах  при современном развитии синтезаторов смысла особого нет.  За исключением очень редких случаев  использования нерегулярных возможностей архитектуры FPGA. В том же  Xilinx например  не факт что mux  с использованием примитива mux8/mux16 получится быстрее  чем при с использованием структуры AND/OR  на carry-chain (или наоборот).

 

Полезнее просто изучить особенности реализации базовый блоков на вашей архитектуре (и вашем синтезаторе)  и учитывать их при дизайне. 


Удачи! Rob. 

 

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


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

9 минут назад, RobFPGA сказал:

это запретит синтезатору  возможность объединить mux_1 в  одной LUT со следующим каскадом mux

Для 2-битного мультиплексора нужна 6-входовая LUT, вряд ли в этом Lattice такие.

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


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

Если требуется разгон латисов до 350мгц тогда придется смотреть  нетлист или совсем ставить мултиплексер  отдельно.

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


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

2 hours ago, Aldec said:

Если требуется разгон латисов до 350мгц тогда придется смотреть  нетлист или совсем ставить мултиплексер  отдельно.

До 350 не требуется.

Как я изначально писал, у меня тактовая 125 МГц, а синтезатор предельную выдавал 125,4. Т.е. запаса по частоте не было. 

Сейчас с помощью сообщества предельная стала 160 МГц.

Что дает уже некоторый запас по частоте. И, в принципе, я этим доволен.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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