Jump to content

    

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

Recommended Posts

des00

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

 

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

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

 

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

Share this post


Link to post
Share on other sites

des00
боюсь, что это 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

Share this post


Link to post
Share on other sites

krux

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

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

 

keep_equivalent_registers

resource_sharing

keep_hierarchy

shreg_extract

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

keep_equivalent_registers

resource_sharing

keep_hierarchy

shreg_extract

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

 

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

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

Share this post


Link to post
Share on other sites

Inanity

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

 

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

 

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

Edited by Inanity

Share this post


Link to post
Share on other sites

des00
Если у вас выкидывается часть шины, то скорее всего она реально нигде не использована, иначе быть не может. Может этот кусок шины как-то дико в другом месте не очевидным для вас способом мульплексируется. Я, правда, не знаю 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

 

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

 

Share this post


Link to post
Share on other sites

Flood

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

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

Share this post


Link to post
Share on other sites

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

Хотя, конечно, до гуру мне далеко, да и на 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 пары одним пакетом. Чуть позже выложу картинку, из чипа скопа

Share this post


Link to post
Share on other sites

des00

Ну а теперь, всем кто желает проверить свои телепатические способности. Результат сборки в крутейшей виваде 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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.