dimka76 42 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба 1 hour ago, Nick_K said: Скорее всего и оптимальнее, да. Symplify далеко не дурной синтезатор (может даже один из лучших, которіх я видел), сам сможет построить нужную логику, чтобы не далать лишние преобразования. Одним словом попробуйте описать проще все конструкции и посмотреть что будет, может синтезатор сам сможет разрулить и выдать толковую частоту. Нет, тогда уже смотреть критические пути и пайплайнить. Спасибо. 2 minutes ago, lexx said: Перейдите на one hot. Это быстрее, чем текущий if-else. И сделайте констрейны на тактовой сигнал, синтезатор хотя бы попытается все это привести к нужному виду. Без настоящего клока, синтез только получит функцию, без каких-либо оптимизаций. Что такое one Hot ? Констрейн на тактовый стоит. Это единственный констрейн в моем проекте ((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexx 0 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба One hot - только один валидный бит в один момент времени. Имплементация проще в этом случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба 20 minutes ago, lexx said: One hot - только один валидный бит в один момент времени. Имплементация проще в этом случае. Так изначально и было. Изначальный листинг в самом первом моем сообщении этой темы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба Приветствую! 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба Приветствую! 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; ... И все ваши титанические усилия пойдут прахом если не зафиксировать этот сизифов труд атрибутами которые не позволят синтезатору переделать все как ему будет удобнее. Да и смысла особого в этом нет так как проблема не в самом mux а именно в декодировании управления для оного. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexx 0 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба 32 minutes ago, RobFPGA said: И все ваши титанические усилия пойдут прахом если не зафиксировать этот сизифов труд атрибутами которые не позволят синтезатору переделать все как ему будет удобнее. Не скажу и именно по FPGA, но Synopsys не рекомендует использовать атрибуты синтеза. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба 19 минут назад, RobFPGA сказал: зафиксировать ... атрибутами которые не позволят синтезатору переделать все как ему будет удобнее wire [31:0] mux1_1 /* synthesis keep */; Так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба Приветствую! 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 26 июня, 2020 Опубликовано 26 июня, 2020 · Жалоба 9 минут назад, RobFPGA сказал: это запретит синтезатору возможность объединить mux_1 в одной LUT со следующим каскадом mux Для 2-битного мультиплексора нужна 6-входовая LUT, вряд ли в этом Lattice такие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aldec 0 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба Если требуется разгон латисов до 350мгц тогда придется смотреть нетлист или совсем ставить мултиплексер отдельно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба 2 hours ago, Aldec said: Если требуется разгон латисов до 350мгц тогда придется смотреть нетлист или совсем ставить мултиплексер отдельно. До 350 не требуется. Как я изначально писал, у меня тактовая 125 МГц, а синтезатор предельную выдавал 125,4. Т.е. запаса по частоте не было. Сейчас с помощью сообщества предельная стала 160 МГц. Что дает уже некоторый запас по частоте. И, в принципе, я этим доволен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться