Jump to content

    

Умножитель для библиотеки 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?

 

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

 

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

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

Edited by designer78

Share this post


Link to post
Share on other sites

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

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

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

Share this post


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

 

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

 

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

 

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

Да) цифра)

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

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

 

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

 

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now