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

использование ILA в Vivado non-project CLI-mode

8 минут назад, dxp сказал:

Это вместо (* mark_debug="true" *)? 

Я их использую вместе. Но в project mode.

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


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

Ещё бы знать, когда это добавлять. В подавляющем большинстве случаев mark_debug делает, что надо, и только иногда шина ломается. Причём, при очередной сборке может и не сломаться - тут результат по прихоти оптимизатора P&R. Или уж тогда для шин всегда это применять. 

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


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

On 1/1/2020 at 9:30 AM, dxp said:

Вопрос не в том, как добавить скриптом сигналы в дебаг, а в том что вивада оптимизирует часть сигналов, несмотря на (* mark="true" *) - например, есть шина данных: 

Вы не попробовали вариант который я написал? Да? Он не отменяет оптимизацию. Он принудительно называет сигналы и объединяет их в шины так, как это было до оптимизации. 

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


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

Не очень понимаю, как write_debug_probe даже с ключом -force сможет добыть сигнал (чтобы объединить его в шину), которого, например, нету - оптимизатор его выкинул. И даже если не выкинул, а просто переименовал в какое-то внутреннее имя, которое вам заранее неизвестно.

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


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

А, кажется понял... Проблема в оптимизации ДО создания дебаг  ядра? Т.е. Именно при синтезе?

Ну так атрибуты keep для сигналов и keep_hierarchy для модулей, если хочется сохранить порты модуля. Вроде ни разу не подводили.

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

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

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


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

On 4/28/2016 at 3:54 PM, RobFPGA said:

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

 

Естественно валится - это-ж черновик

width_of_probe - надо заменит число нужной Вам ширины probe

partial_name_of nets - соответственно имя цепей

 

Естественно ваяя сотни строк такой писанины скучно и с голоду можно помереть

поэтому можно и нужно все это оформить в виде такого "комплексного_обеда.tcl"

 

 


# первое...
# create probe
proc mk_probe {{ila u_ila_0} {mode DATA_AND_TRIGGER} {len 1}} {
    set probe_obj [create_debug_port $ila probe]
    set_property PROBE_TYPE $mode [get_debug_ports $probe_obj]
    set_property PORT_WIDTH $len  [get_debug_ports $probe_obj]
}

# второе...
# add sorted list of pins/nets to last probe port
proc add2probe {ila net_obj} {
    set len [llength $net_obj]
    if {$len>0} {
        set net_obj [lsort -dictionary $net_obj]
        #   mark a nets as debug for simple search and view in the schematic
        set_property mark_debug true $net_obj
        # get last probe port
        set probe_obj [lindex  [get_debug_port $ila/probe*] end]
        # set probe_len [llength [get_nets -of [get_pins [get_debug_ports $probe_obj]]]]
        set probe_len [llength [string map {0 ""} [get_property is_connected [get_pins [get_debug_ports $probe_obj]]]]]
        # adjust probe width
        set_property PORT_WIDTH [expr $probe_len+$len] [get_debug_ports $probe_obj]
        # and connect new nets to end of probe port
        connect_debug_port $probe_obj $net_obj
        puts "Connecting $len nets"
    }
}

# компот...
# get list of nets connected to Q output of register
proc get_q_nets {name} {
    set net_obj [get_nets -of [get_pin -hier -filter "NAME =~ $name/Q"]]
    return $net_obj
}

# десерт...
...

# вкусняшки...
...

# приятного аппетита...

# первая порция бесплатно от шеф-повара
#mk_probe u_ila_0 -  (probe_0 создается автоматом при создании Ila_* )
add2probe u_ila_0 [get_nets -hier -filter {NAME =~ i_pc720_sys/pcie_7x_0/pl_ltssm_state*}]
add2probe u_ila_0 [get_nets -hier -filter {NAME =~ i_pc720_sys/pcie_7x_0/pl_phy_lnk_up}]

# вторая и остальные порции за деньги 
mk_probe u_ila_0
add2probe u_ila_0 [get_nets -hier -filter {NAME =~ i_pc720_sys/*m_axis_rx_TUSER*}]
add2probe u_ila_0 [get_nets -hier -filter {NAME =~ i_pc720_sys/*m_axis_rx_TLAST*}]
add2probe u_ila_0 [get_nets -hier -filter {NAME =~ i_pc720_sys/*m_axis_rx_TVALID*}]
add2probe u_ila_0 [get_nets -hier -filter {NAME =~ i_pc720_sys/*m_axis_rx_TREADY*}]

# третья - выбираем только самое вкусное 
mk_probe u_ila_0 DATA
add2probe u_ila_0 [get_nets -hier -filter {NAME =~ i_pc720_sys/*m_axis_rx_TDATA*}]

#... оффициант !  повторите все для свежего топора ila_1
create_debug_core u_ila_1 ila
....
 

:biggrin:

Причем кушать все это можно как на бегу (в командном строке) так и сидя в зале (project_mode GUI)

 

Успехов! Rob.

Обнаружил такую вещь. Допустим, я хочу добавить в отладчик шину m_axis_rx_TDATA[31:0]. Если для добавления сигналов я использую строку типа:

get_nets -hier -filter {NAME =~ i_pc720_sys/*m_axis_rx_TDATA*}

то у меня добавится больше чем 32 сигнала. Все дело в том, что в нетлисте, кроме нужных m_axis_rx_TDATA[31:0] как правило содержатся технологические сигналы тип m_axis_rx_TDATA[0]_neg_0 и т.д. И все эти технологические сигналы удовлетворяют критериям фильтра. Если конечно же использовать вышеуказанную функцию add2probe, которая автоматически определяет размер проба, то отладчик соберется, но в нем будет много мусора - вместо нужных 32-х сигналов будет, скажем, 50-60. Поэтому думаю нужны более жесткие правила фильтрации. Например m_axis_rx_TDATA[*]. В этом случае технологические сигналы не будут удовлетворять условиям фильтра.

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


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

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

15 hours ago, attaboy said:

Обнаружил такую вещь. Допустим, я хочу добавить в отладчик шину m_axis_rx_TDATA[31:0]. Если для добавления сигналов я использую строку типа:


get_nets -hier -filter {NAME =~ i_pc720_sys/*m_axis_rx_TDATA*}

то у меня добавится больше чем 32 сигнала. Все дело в том, что в нетлисте, кроме нужных m_axis_rx_TDATA[31:0] как правило содержатся технологические сигналы тип m_axis_rx_TDATA[0]_neg_0 и т.д. И все эти технологические сигналы удовлетворяют критериям фильтра. Если конечно же использовать вышеуказанную функцию add2probe, которая автоматически определяет размер проба, то отладчик соберется, но в нем будет много мусора - вместо нужных 32-х сигналов будет, скажем, 50-60. Поэтому думаю нужны более жесткие правила фильтрации. Например m_axis_rx_TDATA[*]. В этом случае технологические сигналы не будут удовлетворять условиям фильтра.

Это был всего лишь пример концепции для автоматизации имплементации  ILA. Мой рабочий вариант фильтрации сигналов/пинов/портов немного сложнее (на пару экранов текста)  :wink2:

 

Удачи! Rob.

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


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

1 hour ago, RobFPGA said:

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

Это был всего лишь пример концепции для автоматизации имплементации  ILA. Мой рабочий вариант фильтрации сигналов/пинов/портов немного сложнее (на пару экранов текста)  :wink2:

 

Удачи! Rob.

А можете поделиться рабочим вариантом. Концепция конечно же отличная,  но на её "обработку напильником" может уйти достаточно много времени. В частности, кроме вышеуказанной проблемы, я обнаружил ещё одну. Если сигналы выбирать опять же при помощи команды:

get_nets -hier -filter {NAME =~ i_pc720_sys/*m_axis_rx_TDATA*}

то Вивадо шину собирает не по порядку, и в итоге в окне wave вместо одной шины [31:0] появляются несколько, например [10:0],[11:11],[19:12] и т.д. Работать с такой шиной невозможно. Одно из решений, которое я нашел на просторах интернета (но пока ещё не проверил на практике), использовать команду 

lsort -dictionary

Сложно сказать, какие ещё подводные камни могут содержаться в концепции.

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


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

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

14 minutes ago, attaboy said:

А можете поделиться рабочим вариантом. Концепция конечно же отличная,  но на её "обработку напильником" может уйти достаточно много времени.

Увы, по определенными причинам готовым поделится  не могу :rtfm:

17 minutes ago, attaboy said:

Одно из решений, которое я нашел на просторах интернета (но пока ещё не проверил на практике), использовать команду 

Ну так и у меня тоже самое 

proc add2probe {ila net_obj} {
    set len [llength $net_obj]
    if {$len>0} {
        set net_obj [lsort -dictionary $net_obj]

Но этот простой вариант  пасует если шина "разорвана"  после синтеза.  Тут поможет только  более сложный анализ с "восстановлением" последовательности шины.
А для этого  желательно иметь отдельные  команды для  шин типа  add2probe_bus с продвинутым парсингом опций задания пути, имени и нужного диапазона на шине (даже не непрерывного).  В общем  лишь бы фантазии хватало.   

Но всегда стоит отдельный  вопрос - а нужно ли такой избыточный сервис?  Так  как  искусственное  исправление таких ситуаций  IMHO снижает  информативность о текущем состоянии дизайна после синтеза.  Ну а корректность отображения шин можно попытается исправить и на самом wave через  virtual bus.  

 

Удачи! Rob.

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


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

Вот ещё один ньюанс. В принципе он очевиден:dirol:, но вдруг кому-нибудь будет интересно.

В документации на Вивадо говорится, что файлы с расширением *.xdc - это фактически tcl скрипты. Вот например выдержка из UG945:

Quote

XDCs are not just simple strings; they are Tcl commands that the Vivado Tcl interpreter
sequentially reads and parses.

"Все животные равны, но некоторые равнее". Почему-то интерпретатор tcl,обрабатывая файл *.xdc, не поддерживает некоторые команды. В частности, указанная в переписке выше команда lsort не поддерживается в файлах формата *.xdc. Поэтому для ограничений, задаваемых такими относительно сложными конструкциями, нужно использовать расширение tcl, а не xdc.

 

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


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

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

3 minutes ago, attaboy said:

Вот ещё один ньюанс. В принципе он очевиден:dirol:, но вдруг кому-нибудь будет интересно.

В документации на Вивадо говорится, что файлы с расширением *.xdc - это фактически tcl скрипты. Вот например выдержка из UG945:

"Все животные равны, но некоторые равнее". Почему-то интерпретатор tcl,обрабатывая файл *.xdc, не поддерживает некоторые команды. В частности, указанная в переписке выше команда lsort не поддерживается в файлах формата *.xdc. Поэтому для ограничений, задаваемых такими относительно сложными конструкциями, нужно использовать расширение tcl, а не xdc.

Некоторых "животных" можно приручить и на "цепь" посадить,  а некоторых  "сколько не корми ... они все норовят сами по себе гулять"   :biggrin:

.xdc  файлы на цепи у Vivado, она за ними следит (в project mode) автоматом меняя  их содержимое если вы меняете настройки через GUI.  Отсюда и ограничение  на возможные конструкции языка в  .xdc.   

 

Удачи! Rob.

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


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

2 minutes ago, RobFPGA said:

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

Некоторых "животных" можно приручить и на "цепь" посадить,  а некоторых  "сколько не корми ... они все норовят сами по себе гулять"   :biggrin:

.xdc  файлы на цепи у Vivado, она за ними следит (в project mode) автоматом меняя  их содержимое если вы меняете настройки через GUI.  Отсюда и ограничение  на возможные конструкции языка в  .xdc.   

 

Удачи! Rob.

Ну ограничения прямо скажем специфические. Мне непонятно, почему в GUI так ущемляются права lsort. Если я добавлю регистр в отладчик через GUI, Setup Debug, то Vivado включит его командой типа:

set_property port_width 4 [get_debug_ports u_ila_0/probe1]
connect_debug_port u_ila_0/probe1 [get_nets [list {file/sig_1[0]} {file/sig_1[1]} {file/sig_1[2]} {file/sig_1[3]}]]

Если размер регистра битов эдак 256, то получается очень длинная строка. Понятно, что в автоматическом режиме предполагается, что пользователь не заморачивается на чтение всяких там системно созданных файлов. Но к сожалению/счастью иногда их приходится читать, и в этом случае команда lsort могла бы сделать этот файл намного более читабельным.

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


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

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

29 minutes ago, attaboy said:

Ну ограничения прямо скажем специфические. Мне непонятно, почему в GUI так ущемляются права lsort. Если я добавлю регистр в отладчик через GUI, Setup Debug, то Vivado включит его командой типа:
...
Если размер регистра битов эдак 256, то получается очень длинная строка. Понятно, что в автоматическом режиме предполагается, что пользователь не заморачивается на чтение всяких там системно созданных файлов. Но к сожалению/счастью иногда их приходится читать, и в этом случае команда lsort могла бы сделать этот файл намного более читабельным.

Ну так именно по этой причине и не добавляет - внутри Vivado представление плоское как блин. Нет никаких абстракций типа циклов, паттерн-матчиннг, сортировок, ... и других заморочек "... этих мягкотелых неспособных запомнить десяток-другой тысяч сырых строк". :yes3: 
А  задача  конвертации  такого представления в удобочитаемую форму сложна и IMHO не есть первоочередной для Vivado.  Да и не особо нужна как мне кажется.
При возможности полноценного использования .tcl  для констрейнов .xdc как таковой и не нужен (ну разве что для начального этапа). 
В моих  проектах давно только один .xdc файл (да и тот обычно пустой) - это тот target куда  GUI пишет новые констрейны если что то крутить в нем. 

 

Удачи! Rob.

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


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

17 minutes ago, RobFPGA said:

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

Ну так именно по этой причине и не добавляет - внутри Vivado представление плоское как блин. Нет никаких абстракций типа циклов, паттерн-матчиннг, сортировок, ... и других заморочек "... этих мягкотелых неспособных запомнить десяток-другой тысяч сырых строк". :yes3: 
А  задача  конвертации  такого представления в удобочитаемую форму сложна и IMHO не есть первоочередной для Vivado.  Да и не особо нужна как мне кажется.
При возможности полноценного использования .tcl  для констрейнов .xdc как таковой и не нужен (ну разве что для начального этапа). 
В моих  проектах давно только один .xdc файл (да и тот обычно пустой) - это тот target куда  GUI пишет новые констрейны если что то крутить в нем. 

 

Удачи! Rob.

Да уж, совсем плоское представление. Взять какие-нибудь конструкции типа:

get_cells -hier -filter {NAME =~...}

которые одной строкой могут перебрать пол примитивов дизайна. И это все разбирается в *.xdc.

В целом я обратил внимание на факт использования команды lsort. Я бы не стал искать логику, почему это так, а не иначе. По-моему это факт из категории "Нужно знать", gotcha. А почему так - непонятно, так решили разработчики.

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


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

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

4 minutes ago, attaboy said:

Да уж, совсем плоское представление. Взять какие-нибудь конструкции типа:


get_cells -hier -filter {NAME =~...}

которые одной строкой могут перебрать пол примитивов дизайна. И это все разбирается в *.xdc.

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

 

Ну  так это  и есть  пример как сложная абстракция внешнего представления конвертируется  внутри Vivado в плоский список строк. Вы просто перебираете все строки и сравниваете их со входным паттерном. А  вот обратно - из списка строк сделать автоматом компактное абстрактное представление может быть очень сложно.   

7 minutes ago, attaboy said:

По-моему это факт из категории "Нужно знать", gotcha. А почему так - непонятно, так решили разработчики.

Можно пользоваться и таким подходом но IMHO все же лучше понимать почему то или иное так сделано.    

Удачи! Rob.

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


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

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

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

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

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

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

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

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

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

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