Cadence virtual debug interface (vdebug) integration
Change-Id: I1bc105b3addc3f34161c2356c482ff3011e3f2cc Signed-off-by: Jacek Wuwer <jacekmw8@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/6097 Tested-by: jenkins Reviewed-by: Oleksij Rempel <linux@rempel-privat.de> Reviewed-by: zapb <dev@zapb.de> Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
parent
2a2636f138
commit
f998a2aaf1
15
configure.ac
15
configure.ac
|
@ -274,6 +274,10 @@ AC_ARG_ENABLE([jtag_vpi],
|
||||||
AS_HELP_STRING([--enable-jtag_vpi], [Enable building support for JTAG VPI]),
|
AS_HELP_STRING([--enable-jtag_vpi], [Enable building support for JTAG VPI]),
|
||||||
[build_jtag_vpi=$enableval], [build_jtag_vpi=no])
|
[build_jtag_vpi=$enableval], [build_jtag_vpi=no])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([vdebug],
|
||||||
|
AS_HELP_STRING([--enable-vdebug], [Enable building support for Cadence Virtual Debug Interface]),
|
||||||
|
[build_vdebug=$enableval], [build_vdebug=no])
|
||||||
|
|
||||||
AC_ARG_ENABLE([jtag_dpi],
|
AC_ARG_ENABLE([jtag_dpi],
|
||||||
AS_HELP_STRING([--enable-jtag_dpi], [Enable building support for JTAG DPI]),
|
AS_HELP_STRING([--enable-jtag_dpi], [Enable building support for JTAG DPI]),
|
||||||
[build_jtag_dpi=$enableval], [build_jtag_dpi=no])
|
[build_jtag_dpi=$enableval], [build_jtag_dpi=no])
|
||||||
|
@ -513,6 +517,12 @@ AS_IF([test "x$build_jtag_vpi" = "xyes"], [
|
||||||
AC_DEFINE([BUILD_JTAG_VPI], [0], [0 if you don't want JTAG VPI.])
|
AC_DEFINE([BUILD_JTAG_VPI], [0], [0 if you don't want JTAG VPI.])
|
||||||
])
|
])
|
||||||
|
|
||||||
|
AS_IF([test "x$build_vdebug" = "xyes"], [
|
||||||
|
AC_DEFINE([BUILD_VDEBUG], [1], [1 if you want Cadence vdebug interface.])
|
||||||
|
], [
|
||||||
|
AC_DEFINE([BUILD_VDEBUG], [0], [0 if you don't want Cadence vdebug interface.])
|
||||||
|
])
|
||||||
|
|
||||||
AS_IF([test "x$build_jtag_dpi" = "xyes"], [
|
AS_IF([test "x$build_jtag_dpi" = "xyes"], [
|
||||||
AC_DEFINE([BUILD_JTAG_DPI], [1], [1 if you want JTAG DPI.])
|
AC_DEFINE([BUILD_JTAG_DPI], [1], [1 if you want JTAG DPI.])
|
||||||
], [
|
], [
|
||||||
|
@ -688,8 +698,9 @@ AM_CONDITIONAL([AT91RM9200], [test "x$build_at91rm9200" = "xyes"])
|
||||||
AM_CONDITIONAL([BCM2835GPIO], [test "x$build_bcm2835gpio" = "xyes"])
|
AM_CONDITIONAL([BCM2835GPIO], [test "x$build_bcm2835gpio" = "xyes"])
|
||||||
AM_CONDITIONAL([IMX_GPIO], [test "x$build_imx_gpio" = "xyes"])
|
AM_CONDITIONAL([IMX_GPIO], [test "x$build_imx_gpio" = "xyes"])
|
||||||
AM_CONDITIONAL([BITBANG], [test "x$build_bitbang" = "xyes"])
|
AM_CONDITIONAL([BITBANG], [test "x$build_bitbang" = "xyes"])
|
||||||
AM_CONDITIONAL([JTAG_VPI], [test "x$build_jtag_vpi" = "xyes" -o "x$build_jtag_vpi" = "xyes"])
|
AM_CONDITIONAL([JTAG_VPI], [test "x$build_jtag_vpi" = "xyes"])
|
||||||
AM_CONDITIONAL([JTAG_DPI], [test "x$build_jtag_dpi" = "xyes" -o "x$build_jtag_dpi" = "xyes"])
|
AM_CONDITIONAL([VDEBUG], [test "x$build_vdebug" = "xyes"])
|
||||||
|
AM_CONDITIONAL([JTAG_DPI], [test "x$build_jtag_dpi" = "xyes"])
|
||||||
AM_CONDITIONAL([USB_BLASTER_DRIVER], [test "x$enable_usb_blaster" != "xno" -o "x$enable_usb_blaster_2" != "xno"])
|
AM_CONDITIONAL([USB_BLASTER_DRIVER], [test "x$enable_usb_blaster" != "xno" -o "x$enable_usb_blaster_2" != "xno"])
|
||||||
AM_CONDITIONAL([AMTJTAGACCEL], [test "x$build_amtjtagaccel" = "xyes"])
|
AM_CONDITIONAL([AMTJTAGACCEL], [test "x$build_amtjtagaccel" = "xyes"])
|
||||||
AM_CONDITIONAL([GW16012], [test "x$build_gw16012" = "xyes"])
|
AM_CONDITIONAL([GW16012], [test "x$build_gw16012" = "xyes"])
|
||||||
|
|
|
@ -588,6 +588,12 @@ produced, PDF schematics are easily found and it is easy to make.
|
||||||
@* A JTAG driver acting as a client for the JTAG VPI server interface.
|
@* A JTAG driver acting as a client for the JTAG VPI server interface.
|
||||||
@* Link: @url{http://github.com/fjullien/jtag_vpi}
|
@* Link: @url{http://github.com/fjullien/jtag_vpi}
|
||||||
|
|
||||||
|
@item @b{vdebug}
|
||||||
|
@* A driver for Cadence virtual Debug Interface to emulated or simulated targets.
|
||||||
|
It implements a client connecting to the vdebug server, which in turn communicates
|
||||||
|
with the emulated or simulated RTL model through a transactor. The current version
|
||||||
|
supports only JTAG as a transport, but other virtual transports, like DAP are planned.
|
||||||
|
|
||||||
@item @b{jtag_dpi}
|
@item @b{jtag_dpi}
|
||||||
@* A JTAG driver acting as a client for the SystemVerilog Direct Programming
|
@* A JTAG driver acting as a client for the SystemVerilog Direct Programming
|
||||||
Interface (DPI) for JTAG devices. DPI allows OpenOCD to connect to the JTAG
|
Interface (DPI) for JTAG devices. DPI allows OpenOCD to connect to the JTAG
|
||||||
|
@ -3345,6 +3351,41 @@ This value is only used with the standard variant.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
@deffn {Interface Driver} {vdebug}
|
||||||
|
Cadence Virtual Debug Interface driver.
|
||||||
|
|
||||||
|
@deffn {Config Command} {vdebug server} host:port
|
||||||
|
Specifies the host and TCP port number where the vdebug server runs.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Config Command} {vdebug batching} value
|
||||||
|
Specifies the batching method for the vdebug request. Possible values are
|
||||||
|
0 for no batching
|
||||||
|
1 or wr to batch write transactions together (default)
|
||||||
|
2 or rw to batch both read and write transactions
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Config Command} {vdebug polling} min max
|
||||||
|
Takes two values, representing the polling interval in ms. Lower values mean faster
|
||||||
|
debugger responsiveness, but lower emulation performance. The minimum should be
|
||||||
|
around 10, maximum should not exceed 1000, which is the default gdb and keepalive
|
||||||
|
timeout value.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Config Command} {vdebug bfm_path} path clk_period
|
||||||
|
Specifies the hierarchical path and input clk period of the vdebug BFM in the design.
|
||||||
|
The hierarchical path uses Verilog notation top.inst.inst
|
||||||
|
The clock period must include the unit, for instance 40ns.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Config Command} {vdebug mem_path} path base size
|
||||||
|
Specifies the hierarchical path to the design memory instance for backdoor access.
|
||||||
|
Up to 4 memories can be specified. The hierarchical path uses Verilog notation.
|
||||||
|
The base specifies start address in the design address space, size its size in bytes.
|
||||||
|
Both values can use hexadecimal notation with prefix 0x.
|
||||||
|
@end deffn
|
||||||
|
@end deffn
|
||||||
|
|
||||||
@deffn {Interface Driver} {jtag_dpi}
|
@deffn {Interface Driver} {jtag_dpi}
|
||||||
SystemVerilog Direct Programming Interface (DPI) compatible driver for
|
SystemVerilog Direct Programming Interface (DPI) compatible driver for
|
||||||
JTAG devices in emulation. The driver acts as a client for the SystemVerilog
|
JTAG devices in emulation. The driver acts as a client for the SystemVerilog
|
||||||
|
|
|
@ -75,6 +75,9 @@ endif
|
||||||
if JTAG_VPI
|
if JTAG_VPI
|
||||||
DRIVERFILES += %D%/jtag_vpi.c
|
DRIVERFILES += %D%/jtag_vpi.c
|
||||||
endif
|
endif
|
||||||
|
if VDEBUG
|
||||||
|
DRIVERFILES += %D%/vdebug.c
|
||||||
|
endif
|
||||||
if JTAG_DPI
|
if JTAG_DPI
|
||||||
DRIVERFILES += %D%/jtag_dpi.c
|
DRIVERFILES += %D%/jtag_dpi.c
|
||||||
endif
|
endif
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -57,6 +57,9 @@ extern struct adapter_driver usb_blaster_adapter_driver;
|
||||||
#if BUILD_JTAG_VPI == 1
|
#if BUILD_JTAG_VPI == 1
|
||||||
extern struct adapter_driver jtag_vpi_adapter_driver;
|
extern struct adapter_driver jtag_vpi_adapter_driver;
|
||||||
#endif
|
#endif
|
||||||
|
#if BUILD_VDEBUG == 1
|
||||||
|
extern struct adapter_driver vdebug_adapter_driver;
|
||||||
|
#endif
|
||||||
#if BUILD_JTAG_DPI == 1
|
#if BUILD_JTAG_DPI == 1
|
||||||
extern struct adapter_driver jtag_dpi_adapter_driver;
|
extern struct adapter_driver jtag_dpi_adapter_driver;
|
||||||
#endif
|
#endif
|
||||||
|
@ -168,6 +171,9 @@ struct adapter_driver *adapter_drivers[] = {
|
||||||
#if BUILD_JTAG_VPI == 1
|
#if BUILD_JTAG_VPI == 1
|
||||||
&jtag_vpi_adapter_driver,
|
&jtag_vpi_adapter_driver,
|
||||||
#endif
|
#endif
|
||||||
|
#if BUILD_VDEBUG == 1
|
||||||
|
&vdebug_adapter_driver,
|
||||||
|
#endif
|
||||||
#if BUILD_JTAG_DPI == 1
|
#if BUILD_JTAG_DPI == 1
|
||||||
&jtag_dpi_adapter_driver,
|
&jtag_dpi_adapter_driver,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Cadence virtual debug interface
|
||||||
|
# Arm Cortex A53x2 through JTAG
|
||||||
|
|
||||||
|
source [find interface/vdebug.cfg]
|
||||||
|
|
||||||
|
set _CORES 2
|
||||||
|
set _CHIPNAME a53
|
||||||
|
set _MEMSTART 0x00000000
|
||||||
|
set _MEMSIZE 0x1000000
|
||||||
|
set _CPUTAPID 0x5ba00477
|
||||||
|
|
||||||
|
# vdebug select transport
|
||||||
|
#transport select jtag
|
||||||
|
|
||||||
|
# JTAG reset config, frequency and reset delay
|
||||||
|
reset_config trst_and_srst
|
||||||
|
adapter speed 50000
|
||||||
|
adapter srst delay 5
|
||||||
|
|
||||||
|
# BFM hierarchical path and input clk period
|
||||||
|
vdebug bfm_path tbench.u_vd_jtag_bfm 10ns
|
||||||
|
|
||||||
|
# DMA Memories to access backdoor (up to 4)
|
||||||
|
vdebug mem_path tbench.u_memory.mem_array $_MEMSTART $_MEMSIZE
|
||||||
|
|
||||||
|
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
|
||||||
|
|
||||||
|
jtag arp_init-reset
|
||||||
|
|
||||||
|
source [find target/vd_aarch64.cfg]
|
|
@ -0,0 +1,30 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Cadence virtual debug interface
|
||||||
|
# Arm Cortex m4 through JTAG
|
||||||
|
|
||||||
|
source [find interface/vdebug.cfg]
|
||||||
|
|
||||||
|
set _CHIPNAME m4
|
||||||
|
set _MEMSTART 0x00000000
|
||||||
|
set _MEMSIZE 0x10000
|
||||||
|
set _CPUTAPID 0x4ba00477
|
||||||
|
|
||||||
|
# vdebug select transport
|
||||||
|
#transport select jtag
|
||||||
|
|
||||||
|
# JTAG reset config, frequency and reset delay
|
||||||
|
reset_config trst_and_srst
|
||||||
|
adapter speed 25000
|
||||||
|
adapter srst delay 5
|
||||||
|
|
||||||
|
# BFM hierarchical path and input clk period
|
||||||
|
vdebug bfm_path tbench.u_vd_jtag_bfm 20ns
|
||||||
|
|
||||||
|
# DMA Memories to access backdoor (up to 4)
|
||||||
|
vdebug mem_path tbench.u_mcu.u_sys.u_rom.rom $_MEMSTART $_MEMSIZE
|
||||||
|
|
||||||
|
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
|
||||||
|
|
||||||
|
jtag arp_init-reset
|
||||||
|
|
||||||
|
source [find target/vd_cortex_m.cfg]
|
|
@ -0,0 +1,32 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Cadence virtual debug interface
|
||||||
|
# RISCV Ibex core with Pulpissimo through JTAG
|
||||||
|
|
||||||
|
source [find interface/vdebug.cfg]
|
||||||
|
|
||||||
|
set _CHIPNAME ibex
|
||||||
|
set _HARTID 0x20
|
||||||
|
set _CPUTAPID 0x249511c3
|
||||||
|
|
||||||
|
# vdebug select transport
|
||||||
|
#transport select jtag
|
||||||
|
|
||||||
|
# JTAG reset config, frequency and reset delay
|
||||||
|
reset_config trst_and_srst
|
||||||
|
adapter speed 12500
|
||||||
|
adapter srst delay 10
|
||||||
|
|
||||||
|
# BFM hierarchical path and input clk period
|
||||||
|
vdebug bfm_path tbench.u_vd_jtag_bfm 40ns
|
||||||
|
|
||||||
|
# DMA Memories to access backdoor (up to 4)
|
||||||
|
vdebug mem_path tbench.soc_domain_i.pulp_soc_i.gen_mem_l2_pri\[0\].sram_i.mem_array 0x1c000000 0x8000
|
||||||
|
vdebug mem_path tbench.soc_domain_i.pulp_soc_i.gen_mem_l2_pri\[1\].sram_i.mem_array 0x1c008000 0x8000
|
||||||
|
vdebug mem_path tbench.soc_domain_i.pulp_soc_i.gen_mem_l2\[0\].sram_i.mem_array 0x1c010000 0x80000
|
||||||
|
|
||||||
|
# need to explicitly define riscv tap, autoprobing does not work for icapture != 0x01
|
||||||
|
jtag newtap $_CHIPNAME cpu -irlen 5 -ircapture 0x05 -irmask 0x1f -expected-id $_CPUTAPID
|
||||||
|
|
||||||
|
jtag arp_init-reset
|
||||||
|
|
||||||
|
source [find target/vd_riscv.cfg]
|
|
@ -0,0 +1,32 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Cadence virtual debug interface
|
||||||
|
# RISCV swerv core with Swerv through JTAG
|
||||||
|
|
||||||
|
source [find interface/vdebug.cfg]
|
||||||
|
|
||||||
|
set _CHIPNAME rv32
|
||||||
|
set _HARTID 0x00
|
||||||
|
set _CPUTAPID 0x1000008b
|
||||||
|
set _MEMSTART 0x00000000
|
||||||
|
set _MEMSIZE 0x10000
|
||||||
|
|
||||||
|
# vdebug select transport
|
||||||
|
#transport select jtag
|
||||||
|
|
||||||
|
# JTAG reset config, frequency and reset delay
|
||||||
|
reset_config trst_and_srst
|
||||||
|
adapter speed 50000
|
||||||
|
adapter srst delay 5
|
||||||
|
|
||||||
|
# BFM hierarchical path and input clk period
|
||||||
|
vdebug bfm_path tbench.u_vd_jtag_bfm 10ns
|
||||||
|
|
||||||
|
# DMA Memories to access backdoor (up to 4)
|
||||||
|
vdebug mem_path tbench.i_ahb_ic.mem $_MEMSTART $_MEMSIZE
|
||||||
|
|
||||||
|
# need to explicitly define riscv tap, autoprobing does not work for icapture != 0x01
|
||||||
|
jtag newtap $_CHIPNAME cpu -irlen 5 -ircapture 0x01 -irmask 0x1f -expected-id $_CPUTAPID
|
||||||
|
|
||||||
|
jtag arp_init-reset
|
||||||
|
|
||||||
|
source [find target/vd_riscv.cfg]
|
|
@ -0,0 +1,33 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Cadence virtual debug interface
|
||||||
|
|
||||||
|
if { [info exists VDEBUGHOST] } {
|
||||||
|
set _VDEBUGHOST $VDEBUGHOST
|
||||||
|
} else {
|
||||||
|
set _VDEBUGHOST localhost
|
||||||
|
}
|
||||||
|
if { [info exists VDEBUGPORT] } {
|
||||||
|
set _VDEBUGPORT $VDEBUGPORT
|
||||||
|
} else {
|
||||||
|
set _VDEBUGPORT 8192
|
||||||
|
}
|
||||||
|
|
||||||
|
adapter driver vdebug
|
||||||
|
# vdebug server:port
|
||||||
|
vdebug server $_VDEBUGHOST:$_VDEBUGPORT
|
||||||
|
|
||||||
|
# example config debug level and log
|
||||||
|
#debug_level 3
|
||||||
|
#log_output vd_ocd.log
|
||||||
|
|
||||||
|
# example config listen on all interfaces, disable tcl/telnet server
|
||||||
|
bindto 0.0.0.0
|
||||||
|
#gdb_port 3333
|
||||||
|
#telnet_port disabled
|
||||||
|
tcl_port disabled
|
||||||
|
|
||||||
|
# transaction batching: 0 - no batching, 1 - (default) wr, 2 - rw
|
||||||
|
vdebug batching 1
|
||||||
|
|
||||||
|
# Polling values
|
||||||
|
vdebug polling 100 1000
|
|
@ -0,0 +1,37 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Cadence virtual debug interface
|
||||||
|
# Arm v8 64b Cortex A
|
||||||
|
|
||||||
|
if {![info exists _CORES]} {
|
||||||
|
set _CORES 1
|
||||||
|
}
|
||||||
|
if {![info exists _CHIPNAME]} {
|
||||||
|
set _CHIPNAME aarch64
|
||||||
|
}
|
||||||
|
set _TARGETNAME $_CHIPNAME.cpu
|
||||||
|
set _CTINAME $_CHIPNAME.cti
|
||||||
|
|
||||||
|
set DBGBASE {0x80810000 0x80910000}
|
||||||
|
set CTIBASE {0x80820000 0x80920000}
|
||||||
|
|
||||||
|
dap create $_CHIPNAME.dap -chain-position $_TARGETNAME
|
||||||
|
$_CHIPNAME.dap apsel 1
|
||||||
|
|
||||||
|
for { set _core 0 } { $_core < $_CORES } { incr _core } \
|
||||||
|
{
|
||||||
|
cti create $_CTINAME.$_core -dap $_CHIPNAME.dap -ap-num 1 -baseaddr [lindex $CTIBASE $_core]
|
||||||
|
set _command "target create $_TARGETNAME.$_core aarch64 -dap $_CHIPNAME.dap \
|
||||||
|
-dbgbase [lindex $DBGBASE $_core] -cti $_CTINAME.$_core -coreid $_core"
|
||||||
|
if { $_core != 0 } {
|
||||||
|
# non-boot core examination may fail
|
||||||
|
set _command "$_command -defer-examine"
|
||||||
|
set _smp_command "$_smp_command $_TARGETNAME.$_core"
|
||||||
|
} else {
|
||||||
|
set _smp_command "target smp $_TARGETNAME.$_core"
|
||||||
|
}
|
||||||
|
eval $_command
|
||||||
|
}
|
||||||
|
eval $_smp_command
|
||||||
|
|
||||||
|
# default target is core 0
|
||||||
|
targets $_TARGETNAME.0
|
|
@ -0,0 +1,12 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Cadence virtual debug interface
|
||||||
|
# ARM Cortex M
|
||||||
|
|
||||||
|
if {![info exists _CHIPNAME]} {
|
||||||
|
set _CHIPNAME cortex_m
|
||||||
|
}
|
||||||
|
set _TARGETNAME $_CHIPNAME.cpu
|
||||||
|
|
||||||
|
dap create $_CHIPNAME.dap -chain-position $_TARGETNAME
|
||||||
|
|
||||||
|
target create $_TARGETNAME cortex_m -dap $_CHIPNAME.dap
|
|
@ -0,0 +1,18 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Cadence virtual debug interface
|
||||||
|
# RISCV core
|
||||||
|
|
||||||
|
if {![info exists _HARTID]} {
|
||||||
|
set _HARTID 0x00
|
||||||
|
}
|
||||||
|
if {![info exists _CHIPNAME]} {
|
||||||
|
set _CHIPNAME riscv
|
||||||
|
}
|
||||||
|
set _TARGETNAME $_CHIPNAME.cpu
|
||||||
|
|
||||||
|
target create $_TARGETNAME riscv -chain-position $_TARGETNAME -coreid $_HARTID
|
||||||
|
|
||||||
|
riscv set_reset_timeout_sec 120
|
||||||
|
riscv set_command_timeout_sec 120
|
||||||
|
# prefer to use sba for system bus access
|
||||||
|
riscv set_prefer_sba on
|
Loading…
Reference in New Issue