Jump to content
    

использование 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-ядра трудно((

 

Share this post


Link to post
Share on other sites

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

 

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

# возьмем топор
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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites

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

 

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

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.

Share this post


Link to post
Share on other sites

меня вполне устроит сбор всех 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 ...

Share this post


Link to post
Share on other sites

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

 

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

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

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

 

Успехов! Rob .

Share this post


Link to post
Share on other sites

разобрался!

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'.

Share this post


Link to post
Share on other sites

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

 

А вот так :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

Share this post


Link to post
Share on other sites

RobFPGA, спасибо..

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

 

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

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

изучаю... =)

Share this post


Link to post
Share on other sites

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

 

Вишенка на торт: добавив свой атрибут например 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.

Share this post


Link to post
Share on other sites

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

 

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

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

 

Share this post


Link to post
Share on other sites

В 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 и прочие). Такое впечатление, что в принципе не понимает, что он неё хотят.

Share this post


Link to post
Share on other sites

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

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.

Share this post


Link to post
Share on other sites

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

implementation only

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

 

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

 

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

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.

×
×
  • Create New...