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

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

Есть у xilinx такой документ:

http://www.xilinx.com/support/documentatio...g-debugging.pdf - Vivado Design Suite Tutorial Programming and Debugging

 

там в Lab 1: Using the Netlist Insertion Method for Debugging a Design описан подход по встраиванию ILA (chipscope), конструкция вида:

Use a Tcl prompt to set the MARK_DEBUG attribute on a synthesized netlist:

set_property mark_debug true [get_nets –hier [list {sine[*]}]]

 

вставляется, но тулы не видят наличие ILA в залитом битстриме ПЛИС, я так понимаю, что прежде надо вставить IP-core ILA в проект, но не очень ясен этот механизм вставки в режиме работы non-project CLI.

 

Как понимаю, прежде надо сгенерить ILA в GUI VIvado,а нетлист подсунуть уже в Vivado non-project CLI-mode design flow?

Но как тогда вивадо поймёт что присутствующий нетлист - это ILA и смаппит команды типа set_property mark_debug true в сответствующие сигналы наблюдения?

 

PS: есть еще документ http://www.xilinx.com/support/documentatio...6-vivado-ip.pdf Designing with IP c главой Tcl Commands for Common IP Operations

сижу разбираюсь, но без описания на конкретном примере IP-ядра трудно((

 

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


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

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

 

черновик рецепта супа из топора :)

# возьмем топор
create_debug_core u_ila_0 ila
# с требуемыми вкусовыми характеристиками
set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
set_property ALL_PROBE_SAME_MU_CNT 4 [get_debug_cores u_ila_0]
set_property C_ADV_TRIGGER true [get_debug_cores u_ila_0]
set_property C_DATA_DEPTH 8192 [get_debug_cores u_ila_0]
set_property C_EN_STRG_QUAL true [get_debug_cores u_ila_0]
set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
# кинем его в "кастрюлю" 
set_property port_width 1 [get_debug_ports u_ila_0/clk]
connect_debug_port u_ila_0/clk [get_nets pcie_aclk]

# ну а затем добавим ингредиенты...
set probe_obj [create_debug_port u_ila_0 probe]
set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports $probe_obj]
set_property PORT_WIDTH width_of_probe  [get_debug_ports $probe_obj]

# ... и специи
connect_debug_port $probe_obj [get_nets -hier -filter {NAME =~ partial_name_of nets}]
connect_debug_port $probe_obj [get_nets -hier -filter {MARK_DEBUG==true}]
...
# медленно варить на этапе opt_design

Успехов! Rob

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


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

И до кучи про ILA в вивадо, надо же было так через Ж... неудобно сделать, что асинхронный JTAG, не видится системой, если нет клока на ILA (нога не та, клок отвалился/отключился и т.д.). Такое ощущение, что инструмент отлаживали люди, явно далекие от регулярной работы с ПЛИС :( Не понимаю в чем была сложность, скопировать сигнал тап

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


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

RobFPGA, спасибо!

осваиваю понемногу.

 

На этом этапе валится:

## set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports $probe_obj]
## set_property PORT_WIDTH width_of_probe   [get_debug_ports $probe_obj]
ERROR: [Vivado 12-200] 'width_of_probe' is not a valid integer.

    while executing
"source ${DIRBIN}/ila-debug-core.tcl"

 

 

задаю точки к которым подключаться в RTL прагмой:

 (* mark_debug = "true" *)

 

правильно ли я понимаю, что мне надо вручную подсчитать и суммировать разрядности всех wire, у которыз я прописал эту прагму и вставить итоговое число в скрипт вместо width_of_probe ?

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


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

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

 

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

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.

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


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

меня вполне устроит сбор всех wire в RTL промаркированных как MARK_DEBUG, для этого я так понимаю достаточно:

 

 

но что-то не нравится вивадо в этой строчке:

## set probe_obj [create_debug_port u_ila_0 probe]
## set width_of_probe 223
## set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports $probe_obj]
## set_property PORT_WIDTH $width_of_probe   [get_debug_ports $probe_obj]
WARNING: [Vivado 12-1023] No nets matched for command 'get_nets -hierarchical -filter MARK_DEBUG==true'.
## connect_debug_port $probe_obj [get_nets -hierarchical -filter {MARK_DEBUG==true}]
ERROR: [Common 17-162] Invalid option value specified for '-nets'.

 

версия вивадо: Vivado v2015.3 (64-bit Linux)

до этого были проблемы с get_nets: -hier не понимал, пришлось писать -hierarchical

 

В качестве гипотезы - может MARK_DEBUG в одинаковом регистре должен быть в RTL и tcl?

 

ЗЫЖ вставляю ILA сразу после synth_design ...

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


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

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

 

Регистр вроде не имеет значения для названий опций.

У меня (win/64 2015.4) находит все помеченное и в нижнем и в верхнем регистре MARK_DEBUG

Можно открыть .dcp файл после синтеза и проверить команды в консоли tcl.

 

Успехов! Rob .

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


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

разобрался!

RTL правил не в той ветке, в которой пускал синтез)

 

 

 

теперь валится на opt_design :

opt_design failed
ERROR: [Chipscope 16-213] The debug port 'u_ila_0/probe0' has 1 unconnected channels (bits). This will cause errors during implementation.

 

как же так? ...сигналы в RTL маркированные MARK_DEBUG ведь находит...

 

 

вот лог:

## create_debug_core u_ila_0 ila
## set_property ALL_PROBE_SAME_MU true  [get_debug_cores u_ila_0]
## set_property ALL_PROBE_SAME_MU_CNT 4 [get_debug_cores u_ila_0]
## set_property C_ADV_TRIGGER true      [get_debug_cores u_ila_0]
## set_property C_DATA_DEPTH 8192       [get_debug_cores u_ila_0]
## set_property C_EN_STRG_QUAL true     [get_debug_cores u_ila_0]
## set_property C_INPUT_PIPE_STAGES 0   [get_debug_cores u_ila_0]
## set_property C_TRIGIN_EN false       [get_debug_cores u_ila_0]
## set_property C_TRIGOUT_EN false      [get_debug_cores u_ila_0]
## set_property port_width            1     [get_debug_ports u_ila_0/clk]
## connect_debug_port u_ila_0/clk [get_pins PLLE2_U0/CLKOUT0]
## set probe_obj [create_debug_port u_ila_0 probe]
## set width_of_probe 223
## set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports $probe_obj]
## set_property PORT_WIDTH $width_of_probe   [get_debug_ports $probe_obj]
## connect_debug_port $probe_obj [get_nets -hierarchical -filter {MARK_DEBUG==true}]
## implement_debug_core
INFO: [IP_Flow 19-234] Refreshing IP repositories
INFO: [IP_Flow 19-1704] No user IP repositories specified
INFO: [IP_Flow 19-2313] Loaded Vivado IP repository '/soft/Vivado/2015.3/data/ip'.
INFO: [IP_Flow 19-3806] Processing IP xilinx.com:ip:xsdbm:1.1 for cell dbg_hub_CV.

INFO: [Chipscope 16-78] labtools_xsdbm_v1 netlist file is '.Xil/Vivado-3346-syn64-2/dbg_hub_CV.0/out/dcp/dbg_hub_CV_0.edf'.
INFO: [IP_Flow 19-3806] Processing IP xilinx.com:ip:ila:6.0 for cell u_ila_0_CV.
INFO: [Chipscope 16-78] labtools_ila_v6 netlist file is '.Xil/Vivado-3346-syn64-2/u_ila_0_CV.0/out/dcp/u_ila_0_CV_1.edf'.

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


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

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

 

А вот так :rolleyes: Если вам нужен только один probe команда

 set probe_obj [create_debug_port u_ila_0 probe]

не нужна так как probe_0 создается автоматом при создании ila

А тут еще раз создается probe и потом Вы все подключаете на этот probe_1 а probe_0 остается неподключенный.

Поэтому надо просто получить ссылку на этот probe

 set probe_obj [get_debug_port u_ila_0/probe_0]

 

Успехов! Rob

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


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

RobFPGA, спасибо..

тоже дошёл до этого опытным путём (когда тоже самое начало писать для порта probe1)

 

Нашёл-таки документ правильный: ug908-vivado-programming-debugging.pdf

там как раз есть мой случай - Debug Core Insertion in Non-Project Mode

изучаю... =)

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


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

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

 

Вишенка на торт: добавив свой атрибут например DEBUG_GROUP

...
(* MARK_DEBUG="true", DEBUG_GROUP="grp_1" *) wire net_1;
(* MARK_DEBUG="true", DEBUG_GROUP="grp_2" *) wire net_2;
...

Соответственно затем при выборе цепей для подключения к ILA можем выбирать какой набор сигналов мы конкретно хотим видеть сейчас и на какой порт их цеплять.

...
connect_debug_port $probe_obj [get_nets -hier -filter {MARK_DEBUG==true && DEBUG_GROUP=="grp_1"}]
...

 

Удачи! Rob.

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


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

Вишенка на торт: добавив свой атрибут например DEBUG_GROUP

 

о, ну это вообще предел мечтаний...

уже думал через 'define &`ifdef прикручивать группы сигналов)))

 

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


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

В 28.04.2016 в 18:54, RobFPGA сказал:

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

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

А как вы эту красоту подключаете к проекту? В констрейнах? Или ещё как? В констрейнах оно на 2018.2 выдаёт маловразумительное:

 

[Common 17-1548] Command failed: ERROR: unknown error occurred
 ["...xdc/ila_dpc.tcl":6]

 

что ссылается на строку:

 

create_debug_core u_ila_0 ila
 

И куча подобных ошибок на все остальные строки (set_property и прочие). Такое впечатление, что в принципе не понимает, что он неё хотят.

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


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

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

2 hours ago, dxp said:

А как вы эту красоту подключаете к проекту? В констрейнах? Или ещё как? В констрейнах оно на 2018.2 выдаёт маловразумительное:

Странно - у меня так работает начиная с 2016 какой то версии. Тут надо смотреть как вы подключили это файл,  может не указали тип TCL для этого файла?

Вообще подключать это (да и любые свои TCL) можно по разному:  глобально -  через hook в Vivado_ini.tcl загружать  любые сервисные TCL  модули с требуемыми proc. Локально  - добавив  в constains проекта (первым по списку, implementation only) файл dbg_utils.tcl  содержащий в себе все сервисные процедуры mk_probe, add_probe, .... После этого  последними в списке  constains  могут  быть несколько "debug_some_probe.tcl" только с командами создания ILA и подключения требуемых контрольных точек (тоже implementation only).  Которые легко переключать через disble_file

Удачи! Rob.

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


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

1 час назад, RobFPGA сказал:

implementation only

О, а я к синтезу добавлял. Причём, из консоли всё прекрасно работает (открыт синтезированный дизайн), а при запуске на синтез вот такие ошибки валяться.

 

Попробовал назначить на имплементацию, сработало. :) Т.е. идеологически правильно всё-таки на этапе P&R подключать сигналы на логизатор? Это несколько странно, имхо - ведь даже настройка дебага через GUI делается на синтезированном дизайне. Или имеется в виду, что по сути  это делается после синтеза перед или во время P&R? В пользу этого говорит тот факт, что из консоли после синтеза тоже всё успешно применяется. Кажется немного странным то, что ведь это можно делать и на этапе синтеза в самом конце. Это, имхо, было бы самым логичным решением.

 

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

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


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

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

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

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

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

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

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

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

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

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