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

Запрет оптимизации (выбрасывания) неподключенной логики в Vivado

Тема стара, как мир, тем не менее, однозначного решения найти не удалось.

 

Прототипируем фрагмент дизайна ASIC на самой большой UltraScale. Около 5000 ног интерконнекта висит в воздухе внутри FPGA, поэтому Vivada выбрасывает все, что не завязано на физические выводы, после чего часть дизайна перестает отзываться на запросы по интерфейсу, торчащему из FPGA.

В Quartus есть замечательный неинвазивный инструмент как раз для такого случая - Virtual Pin, который позволяет сохранить возможность эффективного синтеза/раскладки и сохранить нужную логику от выбрасывания.

 

Полный дизайн ASIC-а (включая подсистему, которую мучаю я) собирается и работает без проблем (т.к. в нем все ноги моей подсистемы подключены). Стоит задача собрать автономный дизайн с подсистемой, чтобы не ждать 1,5 дня на пересборку общего дизайна.

 

Что испробовано на данный момент:

1. (* keep = "true" *) на сигналы, висящие в воздухе

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

 

2. (* dont_touch = "true" *) на сигналы, висящие в воздухе

Эта директива работает "рекурсивно" ко всей подключенной логике, запрещая какую-либо оптимизацию вообще, из-за чего на пустом месте растет resource optimization и появляются большие слаки. Через интерфейс все равно видится только часть дизайна.

 

3. (* mark_debug = "true" *) на сигналы, висящие в воздухе

Какого-либо эффекта (в т.ч. автоматического создания ILA) не замечено. Через интерфейс видится только часть дизайна.

 

4. Выделение всей подсистемы в обертку в режиме Out-of-context.

OOC, как я понял, работает только для синтеза, если входы подсистемы болтаются в воздухе, то на этапе implementation Vivado выдает ошибку - входы LUT должны быть подключены. Если на входы подсистемы повесить константу, implementation видит "constant propagation" и выбрасывает еще больше логики.

 

На сайте Xilinx и нашем форуме поискал, в основном предлагаются перечисленные способы.

 

Есть ли еще какие-либо человеческие способы, которые можно попробовать до того, как возиться с сдвиговыми регистрами на входах и выходах?

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


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

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

Да в Vivado не все так просто. Например вариант с (* dont_touch = "true" *) или (* mark_debug = "true" *)  прекрасно работает если нет иерархии - то есть делает виртуальные порты  если логика расположена в этом же модуле.

...
(* mark_debug = "true" *)
logic [7:0]  in_reg1;
(* mark_debug = "true" *)
logic [7:0]  in_reg2;

(* mark_debug = "true" *)
logic [7:0]  ou_reg1;
(* mark_debug = "true" *)
logic [7:0]  ou_reg2;

always_ff @(posedge clk) begin
  ou_reg1 <= in_reg1 + in_reg2;
  ou_reg2 <= in_reg1 ^ in_reg2;
end
...

А вот для иерархии этого уже не достаточно - на выходе нужна доп прокладка  в виде промежуточной цепи с keep атрибутом или временных регистров чтобы оптимизация не выбрасывала логику из нижележащего модуля.  Ну и на нижележащий модуль надо навесить (* keep_hierarchy="yes" *)

Spoiler

(* keep_hierarchy="yes" *)
module test #(parameter WH=8) (
  input  wire           clk, 
  input  wire  [WH-1:0] in1,
  input  wire  [WH-1:0] in2,
  output logic [WH-1:0] ou1,
  output logic [WH-1:0] ou2
);

always_ff @(posedge clk) begin
  ou1 <= in1 + in2;
  ou2 <= in1 ^ in2;
end
endmodule

module top (
  input  wire  clk, //
  output logic ou
);

localparam PIN_WH = 4;

(* mark_debug = "true" *)
logic [PIN_WH-1:0]  in_pin1;
(* mark_debug = "true" *)
logic [PIN_WH-1:0]  in_pin2;

(* keep="true" *)
logic [PIN_WH-1:0]  ou_pin1;
logic [PIN_WH-1:0]  ou_pin2;

(* mark_debug="true"*)
logic [PIN_WH-1:0]  ou_reg1;
(* mark_debug="true"*)
logic [PIN_WH-1:0]  ou_reg2;

test #(.WH(PIN_WH)) i_test (
  .clk(clk    ),
  .in1(in_pin1),
  .in2(in_pin2),
  .ou1(ou_pin1),
  .ou2(ou_pin2)
);

assign ou_reg1 = ou_pin1;

always_ff @(posedge clk) begin
  ou_reg2 <= ou_pin2;
end

endmodule

Да и (* mark_debug = "true" *) не создает ILA сам, а только помечает цепи чтобы их можно было легко подключить. Для создания ILA надо либо ручками это делать открыв проект после синтеза. Либо скриптом tcl подключив последний как constraint файл.

Удачи! Rob.

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


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

On 3/11/2019 at 4:07 PM, hdl_student said:

2. (* dont_touch = "true" *) на сигналы, висящие в воздухе

Эта директива работает "рекурсивно" ко всей подключенной логике, запрещая какую-либо оптимизацию вообще, из-за чего на пустом месте растет resource optimization и появляются большие слаки. Через интерфейс все равно видится только часть дизайна.

а если в два приёма?

1. синтезим нужную часть подсистемы в режиме оut-of-context (со всеми мыслимыми и немыслимыми оптимизациями)

2. делаем обёртку под неё (stub) и подключаем подсистему как black-box, а в обёртке уже делаем где надо keep|dont_touch

 

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


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

11.03.2019 в 16:07, hdl_student сказал:

В Quartus есть замечательный неинвазивный инструмент как раз для такого случая - Virtual Pin, который позволяет сохранить возможность эффективного синтеза/раскладки и сохранить нужную логику от выбрасывания.

Доброго времени суток!

Ох как не хватает мне данного функционала в Vivado.

Выходит, что "самый крутой САПР" по объёмам использования не в состоянии дать мне простой инструмент синтеза СФ блока с количеством выводов больше, чем есть в ПЛИС?

Если делать обёртку, то получается, что для проверки работоспособности СФ блока в части временных задержек, мне необходимо делать надстройку, да к тому же ещё её верифицировать. Времени жалко.

Сф блок проходит верификацию и далее у Intel- проверка таймингов, а у Xilinx - сразу вставляем в проект верхнего уровня.

Неужели к 2020 году не появилось простого инструмента синтеза СФ блоков?

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


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

10 minutes ago, warrior-2001 said:

Неужели к 2020 году не появилось простого инструмента синтеза СФ блоков?

а времянка после синтеза вроде всегда анализ был

Безымянный.png

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


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

Я прогнал проект и имплементация вываливается у меня по ошибке "4000% загрузка IO".

Параметр поставил, как советует саппорт Xilinx.

Результат тот же. Может я не умею готовить Vivado?

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


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

31 minutes ago, warrior-2001 said:

Выходит, что "самый крутой САПР" по объёмам использования не в состоянии дать мне простой инструмент синтеза СФ блока с количеством выводов больше, чем есть в ПЛИС?

Вопрос в адекватности подхода. Зачем пытатся запихнуть проект в кристалл, если он точно не будет там использоваться (пинов же недостаточно)? Почему не "поменять" (изменить в настройках) на кристалл побольше - сразу все проблемы уйдут.

С другой стороны, если Вы пытаетесь протестировать субблок для большего проекта, Ваши проверки дадут только 50% от резальтата, так как не будут проверены входные-выходные соединения и соответственно логика между ними (а иногда это критические места в больших проектах).

Ну и подход с враппером не так и плох. Как минимум он позволит совместить тестбенч и имплементационную модель + добавить клоковый генератор. Да и пишется относительно быстро - повесить регистры на входы-выходы и загнать в мультиплексоры.

28 minutes ago, des00 said:

а времянка после синтеза вроде всегда анализ был

На плисах никто не делает промежуточный STA так как там много неопределённостей, а затрат на разработку уйма.

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


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

Just now, Nick_K said:

На плисах никто не делает промежуточный STA так как там много неопределённостей, а затрат на разработку уйма.

если вы этого не делаете, это не значит что его нет. при оптимизации архитектуры небольших блоков, проект не разводят. смотрят на синтез, раскладку, анализ логики и оценку времени после синтеза.

25 minutes ago, warrior-2001 said:

Я прогнал проект и имплементация вываливается у меня по ошибке "4000% загрузка IO".

эмм, совет идет по синтезу, а вам нужна имплементация. вы не видите здесь никаких разногласий?

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


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

44 минуты назад, des00 сказал:

эмм, совет идет по синтезу, а вам нужна имплементация. вы не видите здесь никаких разногласий?

Понятно. Слона-то я и не заметил. Спасибо за информацию. Это уже хоть что-то.

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


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

1 hour ago, des00 said:

если вы этого не делаете, это не значит что его нет

Как раз я то это делаю. Причём отдельным тулом. Но и разработка у меня не на FPGA.

1 hour ago, des00 said:

смотрят на синтез, раскладку, анализ логики и оценку времени после синтеза

Это написано в одном рипорте и то кратко: утилизация, анализ частоты и ещё по мелочи. Полноценного STA я там не видел ниразу

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


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

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

12 minutes ago, Nick_K said:

Как раз я то это делаю. Причём отдельным тулом. Но и разработка у меня не на FPGA.

Это написано в одном рипорте и то кратко: утилизация, анализ частоты и ещё по мелочи. Полноценного STA я там не видел ниразу

А что в вашем понимании "полноценный STA после синтеза"?

 

Удачи! Rob.

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


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

2 minutes ago, RobFPGA said:

А что в вашем понимании "полноценный STA после синтеза"?

Смотря в какой сфере идёт речь. Для FPGA это, наверное, анализ фанаута, приблизительного роутинга (нагрузки и плотности элементов на выходах), анализ всех временных констрейнов, кросклок и т.д.

Но насколько мне известно, для FPGA не делается приблизительный анализ рутинга после синтеза. Посему и STA недоступен. Хотя может я просто не нашёл)

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


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

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

2 minutes ago, Nick_K said:

Но насколько мне известно, для FPGA не делается приблизительный анализ рутинга после синтеза. Посему и STA недоступен. Хотя может я просто не нашёл)

Судя по всему не особо то и искали  :unknw:

sta.thumb.png.d4fd640dd4baa3bddb61be3ebecb1ccc.png

 

Удачи! Rob.

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


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

7 minutes ago, RobFPGA said:

Судя по всему не особо то и искали  :unknw:

Значит был неправ :wink2: Буду знать на будущее)

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


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

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

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

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

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

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

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

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

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

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