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

    

Умножитель для библиотеки SILTERRA18SG

Здравствуйте уважаемые форумчане!

Изучаю систему 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

 

 

zahleb.png

 

Пробовал

retime -prepare

retime -min_delay

в надежде что генус раскидает регистры, и все заработает, но не вышло.

 

Отсюда возникает 2 вопроса

- какая существует тактика для перемножения больших чисел на больших частотах?

- как пользоваться командой генуса - retime?

 

Заранее спасибо за любые рекомендации!

 

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


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

новичёк в Cadence, поэтому наиболее точный ответ может быть найден в гайде "Genus Datapath Synthesis / Datapath Optimization",

замечу только, что в Синопсисе быстрые реализации арифметики (в т.ч. умножение) было доступно лишь при наличии лицензии на DesignWare,

насколько я знаю у кейденс имеется аналогичная чипваре, но что внутри у неё подробности не узнавал.

 

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


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

Просто в лоб синтезируя код умножения на верилоге, Вы ничего хорошего не получите. Выхода два - либо расписывать дерево уолласа (или подобные алгоритмы) вручную, либо использовать плагины синтезатора. У DC это называется Design-Ware, у Генуса - загуглите, есть какойто аналог. Если кратко, то это библиотека конфигурируемых айпи, среди которых есть и умножители. Это айпи можно вызывать прямо из вериложного кода. Для моделирования RTL есть вериложные модели тих айпи.

 

Что касается ретайминга, то он глючит даже в DC. И толку с него будет немного, поскольку частоту у Вас держит последовательный перенос -к гадалке не ходить. Почитайте хорошенько, что это такое - обычно после прочтения разработчики отказываются от идеи использовать ретайминг. Ну а в глючном генусе я бы даже не стал и пытаться. Если рискнете - обязательно гоняйте комформал LEC после каждого синтеза.

 

Силтера 180нм - цифровые решения? )

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


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

Тема очень старая и также относится и к сумматорам.

Согласен с 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) и использовать их. Их недостаток состоит в том что они хорошо работают на высоких и не широких диапазонах частот.

 

Но эта тема для меня чужая, могу ошибаться.

Изменено пользователем designer78

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


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

Сперва покажите timing report, а не временные диаграммы, смысла в них нет.

Далее, если посмотрити на главу datapath optimization, там будет рассказно про разрядность на выходе, у вас она не align, в итоге оно не ложится идеально на designware компоненты.

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

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


Ссылка на сообщение
Поделиться на другие сайты
Просто в лоб синтезируя код умножения на верилоге, Вы ничего хорошего не получите. Выхода два - либо расписывать дерево уолласа (или подобные алгоритмы) вручную, либо использовать плагины синтезатора. У DC это называется Design-Ware, у Генуса - загуглите, есть какойто аналог. Если кратко, то это библиотека конфигурируемых айпи, среди которых есть и умножители. Это айпи можно вызывать прямо из вериложного кода. Для моделирования RTL есть вериложные модели тих айпи.

 

Что касается ретайминга, то он глючит даже в DC. И толку с него будет немного, поскольку частоту у Вас держит последовательный перенос -к гадалке не ходить. Почитайте хорошенько, что это такое - обычно после прочтения разработчики отказываются от идеи использовать ретайминг. Ну а в глючном генусе я бы даже не стал и пытаться. Если рискнете - обязательно гоняйте комформал LEC после каждого синтеза.

 

Силтера 180нм - цифровые решения? )

 

Про ядра интересно, надо поискать!

Да) цифра)

 

Всем огромное спасибо что откликнулись!

Перевариваю пока информацию

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


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

Метод "умножение в столбик" из школьной программы:

 

Представляете каждый 16-ти битовый операнд как блоки 2х8 бит.

Блоки попарно перемножаете. Получаете 4 16-ти битовых значения.

Суммируете 4 значения с соответствующими сдвигами.

 

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

 

+ открывается простор для ретайминга. Из очевидного: защелкивать значения после умножителей

- площадь возрастет, конечно

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти