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

Проясните про виваду

Всем доброго. Кто в курсе, проясните мне такой момент.

 

Есть артикс самый толстый, есть проект на 100к логики (75% этого чипа). Проект вылизан в симуляторе, написан без использования примитивов, прекрасно работает в арии, без каких либо манипуляций. Теперь про виваду

версия 2016.2, проект не работает. Начинаю разбираться, я первый раз вижу софт, который выкидывает шины данных. Т.е. есть сигнал 80 бит, он из него делает 67 и даже слова не говорит. Или есть интерфейс 8ми битный, он его обрезал до 4-х бит, как будто так и надо. Уже прибито гвоздями порядка 150 сигналов в проекте (keep/don't touch). При этом интерфейсы, о которых идет речь работают на частоте всего 120МГц. Или другой пример, есть два модуля и стыковая логика в топе. Несмотря на режим сборки с сохранением иерархии, часть сигналов стыковой логики оказывается внутри модулей, хотя ему жестко сказано - не трогать.

 

Эта у меня дистриб кривой, лицензия не та или у всех так?

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


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

боюсь, что это coding style.

вивада понимает SystemVerilog ещё хуже, чем квартус.

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


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

боюсь, что это coding style.

вивада понимает SystemVerilog ещё хуже, чем квартус.

coding style примитивный. можно посмотреть в моих проектах что выложены.

Вот я низачто не поверю, что в подобном коде (то место где он из 80 бит сделал 67) есть логическое обоснование его поведению

   input  logic [79 : 0] idat;
  //------------------------------------------------------------------------------------------------------
  // output stream data mux
  //------------------------------------------------------------------------------------------------------

  logic [79 : 0] dat_buffer;

  ...............

  always_ff @(posedge iclk) begin
    if (iclkena) begin
      // muxer
      if (byte_clock) begin
        if (fas_req)
          dat_buffer[7 : 0] <= {cSTATIC_PREA, trf_cnt.val[3 : 0]};
        else if (sfas_req)
          dat_buffer[7 : 0] <= trf_cnt.done ? {4'b1000, acm_err, 3'b111} : 8'b1_0000_000;
        else if (oserv_req)
          dat_buffer[7 : 0] <= iserv_dat;
        else if (acm_req)
          dat_buffer[7 : 0] <= acm;
        else if (otele_req)
          dat_buffer[7 : 0] <= itele_dat;
        else if (dat_req)
          dat_buffer <= oreq ? idat : (dat_buffer >> 8); // вот тут опачки и часть шины данных потерялась
      end
    end
  end

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


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

что XST, что vivado, очень жестко подходят к оптимизации по ресурсам.

кроме как попробовать крутить крутилки, на ум ничего не приходит:

 

keep_equivalent_registers

resource_sharing

keep_hierarchy

shreg_extract

 

ну либо пользовать synplify.

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


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

что XST, что vivado, очень жестко подходят к оптимизации по ресурсам.

По сравнению с Qurtus в начале подобные вещи кажутся жестью, но потом привыкаешь. Мало того, что он оптимизирует, он еще и переименовывает сигналы и тусует их по иерархии - вполне нормальна ситуация, когда сигналы из подмодулей в иерархии уровня 2-3 го оказываются в топовом. И атрибуты типа /*synthesis syn_hier="hard"*/; или настройка кипиерархи не особо помогают. Ключевые сигналы приходится по ИЛИ вытягивать на тестовый пин - тогда он их не оптимизирует и названия не меняет.

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


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

в виваде есть netlist flow, по-моему.

то есть synplify. ну это если лицензии, конечно

у меня дошло до того, что я модули завернул в обертки с фиксированными портами и без параметров, поставил Out Of Synthesis на каждую, отдельно каждую отсинтезировал. Проверил глазами схематик. А при сборке все равно части логики, которые есть в схематиках партициях пропадают или перемещаются по чипу. Причем ладно бы логика исчезновения прослеживалась, а то ощущение что все по генератору случайных чисел.

 

keep_equivalent_registers

resource_sharing

keep_hierarchy

shreg_extract

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

 

По сравнению с Qurtus в начале подобные вещи кажутся жестью, но потом привыкаешь. Мало того, что он оптимизирует, он еще и переименовывает сигналы и тусует их по иерархии - вполне нормальна ситуация, когда сигналы из подмодулей в иерархии уровня 2-3 го оказываются в топовом. И атрибуты типа /*synthesis syn_hier="hard"*/; или настройка кипиерархи не особо помогают. Ключевые сигналы приходится по ИЛИ вытягивать на тестовый пин - тогда он их не оптимизирует и названия не меняет.

ну т.е. я не один такой. На уме крутиться только одна фраза "Г...но оно и в африке г...но". Купился на 250 баксов выигрыша закупочной цены, по сравнению с арией. Теперь разгребать

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


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

Если у вас выкидывается часть шины, то скорее всего она реально нигде не использована, иначе быть не может. Может этот кусок шины как-то дико в другом месте не очевидным для вас способом мульплексируется. Я, правда, не знаю System Verilog, но не может Vivado генерировать неработающую схему, иначе с ней не реально было бы работать вообще. И никакие настройки синтезатора не должны ломать логику работы схемы (эти настройки влияют только на ресурсы и времянку).

 

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

 

Что-то я не понимаю, так должно быть включено. Чтобы синтезатор иерархию не ломал включайте keep_hierarchy. Включенный shreg_extract использует FF для регистров (бывает важно для синхронизаторов). Keep_equivalent_registers думаю и так понятно. Resource_sharing оставьте auto (вообще как-то не приходилось менять).

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

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


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

Если у вас выкидывается часть шины, то скорее всего она реально нигде не использована, иначе быть не может. Может этот кусок шины как-то дико в другом месте не очевидным для вас способом мульплексируется. Я, правда, не знаю System Verilog, но не может Vivado генерировать неработающую схему, иначе с ней не реально было бы работать вообще. И никакие настройки синтезатора не должны ломать логику работы схемы (эти настройки влияют только на ресурсы и времянку).

Как уже писал в первом сообщении, схема промоделирована и работает в квартусе с полпинка. Урезать она не может, т.к. заполнение шины 80 бит определяется скоростью потока данных и схема работает на полной скорости, когда летят слова по 80 бит на частоте 120МГц. Более того, к данным подшита КРК, которая проверяется до этого модуля и после. До него не валиться, а за ним валиться. И да, синтезатор ломает логику работы.

 

Что-то я не понимаю, так должно быть включено. Чтобы синтезатор иерархию не ломал включайте keep_hierarchy. Включенный shreg_extract использует FF для регистров (бывает важно для синхронизаторов). Keep_equivalent_registers думаю и так понятно. Resource_sharing оставьте auto (вообще как-то не приходилось менять).

Я написал что выключены все опции, которые могут заставить синтезатор заниматься самодеятельностью:

keep_hierarchy - стоит вручную, в коде, в виде атрибутов на модули.

shreg_extract - заменяет FF на SRL, отключено

Keep_equivalent_registers - специально сказано, не выкидывай ничего, делай как написано, т.к. есть много одинаковых блочков хлопающих на высокой тактовой и склеивание ресурсов только ухудшит ситуацию.

Resource_sharing - тоже сказано - математику не зашаривать

 

т.е. его работа отмапить то что есть, с минимумом мозга и подогнать фанауты под детскую времянку 120/125/250

 

ЗЫ. поговорил с коллегами хиловодами, они тоже полпроекта прибивают гвоздями. Мягко говоря, я в шоке.

 

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


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

Мягко говоря, я в шоке.

дык.

 

подождите, это вам ещё не приходилось в UCF RLOC-и руками вбивать.

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


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

подождите, это вам ещё не приходилось в UCF RLOC-и руками вбивать.

УГ. На доске в рабочей комнате

post-3453-1470753460_thumb.jpg

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


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

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

Хотя, конечно, до гуру мне далеко, да и на SV я ничего не делал.

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


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

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

Хотя, конечно, до гуру мне далеко, да и на SV я ничего не делал.

тут все много интереснее. Для затравки выложу код, который глючит при сборке, на предмет проблем с coding style

  //------------------------------------------------------------------------------------------------------
  // convers 8 bit serv to 2 bit serial stream
  //------------------------------------------------------------------------------------------------------

  logic [3 : 0] serv_val_line;

  always_ff @(posedge iclk or posedge ireset) begin
    if (ireset) begin
      serv_sop      <= 1'b0;
      serv_val_line <= '0;
    end
    else if (iclkena) begin
      serv_sop      <= ival & isop;
      serv_val_line <= ival ? 4'b1111 : (serv_val_line >> 1);
    end
  end

  assign serv_val = serv_val_line[0];

  logic [7 : 0] serv_dat_line;

  always_ff @(posedge iclk) begin
    if (iclkena) begin
      serv_dat_line <= ival ? idat : (serv_dat_line >> 2);
    end
  end

  assign serv_dat = serv_dat_line[1 : 0];

  //------------------------------------------------------------------------------------------------------
  // mux & scramble signal
  //------------------------------------------------------------------------------------------------------

  always_ff @(posedge iclk or posedge ireset) begin
    if (ireset)
      framer__ival <= 1'b0;
    else if (iclkena)
      framer__ival <= serv_val;
  end

  always_ff @(posedge iclk) begin
    if (iclkena) begin
      framer__isop <= serv_sop;
      framer__idat <= serv_dat;
    end
  end

Прошу всех, проанализировать данный код, на предмет возможных косяков синтеза. ИМХО код прозрачный как слеза младенца. Пришел байт по одиночному стробу - вышло 4 пары одним пакетом. Чуть позже выложу картинку, из чипа скопа

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


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

А вам точно нужен асинхронный сброс? Тут в конце https://forums.xilinx.com/t5/7-Series-FPGAs...set/td-p/473746 есть рекомендация по асинхронному сбросу

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


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

Ну а теперь, всем кто желает проверить свои телепатические способности. Результат сборки в крутейшей виваде 2016.2, из проекта убрано все, кроме минимально необходимого количества блоков. Проект занимает 15% плиса. Вот и кто вивада после этого ?

 

А вам точно нужен асинхронный сброс? Тут в конце https://forums.xilinx.com/t5/7-Series-FPGAs...set/td-p/473746 есть рекомендация по асинхронному сбросу

К делу он не относиться, и на топ левеле вообще отключен. Я все пишу в таком стиле, что бы потом не переписывать код.

 

ЗЫ. я не хочу разводить холивар, заранее извиняюсь, полагаю что бессонная неделя дает мне право сказать: зайлинкс Г...но. Не ожидал я такого.

post-3453-1470758627_thumb.png

post-3453-1470758631_thumb.png

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


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

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

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

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

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

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

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

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

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

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