Suicide 0 13 июля, 2018 Опубликовано 13 июля, 2018 · Жалоба Здравствуйте уважаемые форумчане! Изучаю систему Cadence, в частности NC-Verilog и Genus Синтезирую под библиотеку Silterra 180nm CL180G Вот модуль 8-бит умножителя, который хорошо работает на частоте 130 Mhz module multik (clk, A, B, out, reset); input clk; input reset; input [7:0] A; input [7:0] B; output [15:0] out; reg [7:0] Ar,Br; reg [15:0] out_r; reg [7:0] helpers16 [40:0]; reg [15:0] helpers31 [40:0]; integer i; always @ (posedge clk) begin Ar<=A; Br<=B; helpers31[0]<=Ar*Br; for(i=1; i<10; i=i+1) helpers31 [i] <= helpers31[i-1]; end assign out=helpers31[i-1]; endmodule Вот код умножителя на 16-бит, который "захлебывается", т.е. периодически показывает неверные значения на частоте 130 Mhz. Во вложении скрин, там где желтые значения. module multik (clk, A, B, out, reset); input clk; input reset; input [15:0] A; input [15:0] B; output [31:0] out; reg [15:0] Ar,Br; reg [31:0] out_r; reg [15:0] helpers16 [40:0]; reg [31:0] helpers31 [40:0]; integer i; always @ (posedge clk) begin Ar<=A; Br<=B; helpers31[0]<=Ar*Br; for(i=1; i<10; i=i+1) helpers31 [i] <= helpers31[i-1]; end assign out=helpers31[i-1]; endmodule Пробовал retime -prepare retime -min_delay в надежде что генус раскидает регистры, и все заработает, но не вышло. Отсюда возникает 2 вопроса - какая существует тактика для перемножения больших чисел на больших частотах? - как пользоваться командой генуса - retime? Заранее спасибо за любые рекомендации! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 4 13 июля, 2018 Опубликовано 13 июля, 2018 · Жалоба новичёк в Cadence, поэтому наиболее точный ответ может быть найден в гайде "Genus Datapath Synthesis / Datapath Optimization", замечу только, что в Синопсисе быстрые реализации арифметики (в т.ч. умножение) было доступно лишь при наличии лицензии на DesignWare, насколько я знаю у кейденс имеется аналогичная чипваре, но что внутри у неё подробности не узнавал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shivers 0 13 июля, 2018 Опубликовано 13 июля, 2018 · Жалоба Просто в лоб синтезируя код умножения на верилоге, Вы ничего хорошего не получите. Выхода два - либо расписывать дерево уолласа (или подобные алгоритмы) вручную, либо использовать плагины синтезатора. У DC это называется Design-Ware, у Генуса - загуглите, есть какойто аналог. Если кратко, то это библиотека конфигурируемых айпи, среди которых есть и умножители. Это айпи можно вызывать прямо из вериложного кода. Для моделирования RTL есть вериложные модели тих айпи. Что касается ретайминга, то он глючит даже в DC. И толку с него будет немного, поскольку частоту у Вас держит последовательный перенос -к гадалке не ходить. Почитайте хорошенько, что это такое - обычно после прочтения разработчики отказываются от идеи использовать ретайминг. Ну а в глючном генусе я бы даже не стал и пытаться. Если рискнете - обязательно гоняйте комформал LEC после каждого синтеза. Силтера 180нм - цифровые решения? ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
designer78 0 14 июля, 2018 Опубликовано 14 июля, 2018 (изменено) · Жалоба Тема очень старая и также относится и к сумматорам. Согласен с Shivers что из детского кода ничего хорошего не вырастет. Использовать DesignWare/AmbitWare можно но считаю врятли хорошая идея. Зачем подвязываться на что-то конкретное и закрытое. Вдруг придется тоже самое например в плисах сделать, что переписывать под плис. Гораздо более продуктивно будет изучить тему изнутри, прокачать скилл. Тем более что статей/дисеров написано уже наверно тыщи. Ищите что-то типа Fast Multiplier Carry Lookahead Unit (CLU) — схема ускоренного переноса. Carry Look-ahead Adder (CLA) — схема сумматора с ускоренным переносом. Пример i.stanford.edu/pub/cstr/reports/csl/tr/94/617/CSL-TR-94-617.pdf Ну а дальше 1) Как учил Shivers ручками кодите те самые Wallace tree 2) Если сможете опять же ручками кодите ретаймин этих самых деревьев 3) Если рабочая частота у вас стабильна не от 1MHz до 130MHz, то можно попробовать найти/сделать библиотеку с так называемыми динамическими триггерами (CMOS Dynamic Flip-Flops) и использовать их. Их недостаток состоит в том что они хорошо работают на высоких и не широких диапазонах частот. Но эта тема для меня чужая, могу ошибаться. Изменено 14 июля, 2018 пользователем designer78 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexx 0 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба Сперва покажите timing report, а не временные диаграммы, смысла в них нет. Далее, если посмотрити на главу datapath optimization, там будет рассказно про разрядность на выходе, у вас она не align, в итоге оно не ложится идеально на designware компоненты. А вообще плохая идея переписывать "библиотечные элементы", там уже заоптимизировано все. По умолчанию синтезатор и так использует библиотеку, чтобы успеть по таймингам, площадь вторична. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Suicide 0 16 июля, 2018 Опубликовано 16 июля, 2018 · Жалоба Просто в лоб синтезируя код умножения на верилоге, Вы ничего хорошего не получите. Выхода два - либо расписывать дерево уолласа (или подобные алгоритмы) вручную, либо использовать плагины синтезатора. У DC это называется Design-Ware, у Генуса - загуглите, есть какойто аналог. Если кратко, то это библиотека конфигурируемых айпи, среди которых есть и умножители. Это айпи можно вызывать прямо из вериложного кода. Для моделирования RTL есть вериложные модели тих айпи. Что касается ретайминга, то он глючит даже в DC. И толку с него будет немного, поскольку частоту у Вас держит последовательный перенос -к гадалке не ходить. Почитайте хорошенько, что это такое - обычно после прочтения разработчики отказываются от идеи использовать ретайминг. Ну а в глючном генусе я бы даже не стал и пытаться. Если рискнете - обязательно гоняйте комформал LEC после каждого синтеза. Силтера 180нм - цифровые решения? ) Про ядра интересно, надо поискать! Да) цифра) Всем огромное спасибо что откликнулись! Перевариваю пока информацию Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 1 28 июля, 2018 Опубликовано 28 июля, 2018 · Жалоба Метод "умножение в столбик" из школьной программы: Представляете каждый 16-ти битовый операнд как блоки 2х8 бит. Блоки попарно перемножаете. Получаете 4 16-ти битовых значения. Суммируете 4 значения с соответствующими сдвигами. По той же методе можно разбить операнды на большее количество меньших блоков, хотя вы сами пишете, что 8х8 уже вписывается в ограничения + открывается простор для ретайминга. Из очевидного: защелкивать значения после умножителей - площадь возрастет, конечно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться