目录
1. 简介
1.1 ChipScoPy
1.2 XSDB
1.3 Python CLI
2. 安装 ChipScoPy
2.1 Python 环境
2.2 设置虚拟环境
2.3 安装 ChipScoPy
2.4 安装依赖
2.5 安装示例
2.6 打开 JupyterLab
2.7 启动 hw/cs 服务
2.8 更新 ChipScoPy
2.9 参考资料
3. ChipScoPy 示例
3.1 Programming
3.2 Memory 读写
3.2.1 通用内容
3.2.2 清空设备
3.2.3 简单读写示例
3.2.4 指定字大小
3.2.5 在循环中读写
4. XSDB 示例
4.1 Basic
4.1.1 参考资料
4.1.2 进入 XSDB
4.1.3 帮助信息
4.1.4 基本操作
4.2 控制 AXI GPIO
4.2.1 Bock Desgin
4.2.2 Address Editor
4.2.3 操作寄存器
4.2.4 报错提示
5. Python CLI
5.1 参考资料
5.2 基本命令
5.2.1 启动方式
5.2.2 导入 xsdb 包
5.2.3 建立对话和连接
5.2.4 选择 target
5.2.5 下载 PDI
5.2.6 设置存储器映射
5.2.7 Momory 读写
5.3 控制 AXI GPIO
5.3.1 Block Design
5.3.2 主要代码
6. 总结
1. 简介
1.1 ChipScoPy
Target Communication Framework
ChipScoPy 是一个开源 Python 项目,用于与 Xilinx Versal 硬件调试解决方案进行通信和控制。客户端 Python 脚本可以访问丰富的硬件交互 API。ChipScoPy 包的主要功能包括:
- Device detection, programming, and status
- Memory subsystems support
- Fabric Debug Core support
- Integrated Logic Analyzer (ILA)
- Virtual Input Output (VIO)
- Hardened Core support
- DDR Memory Controller (DDRMC)
- Integrated Bit Error Ratio Tester (IBERT)
- System Monitor (SysMon)
- Network on Chip Performance Monitor (NoC PerfMon)
- PCI Express (PCIe)
1.2 XSDB
XSDB(Xilinx System Debugger,系统调试器)使用 HW Server 作为底层调试引擎,提供了一种通过 JTAG 接口与 Xilinx 硬件系统进行交互的命令行调试工具。可以将用户界面操作转换为一系列目标通信框架 (TCF) 命令。
关于 XSCT:
XSCT (Xilinx Software Command-Line Tool) 是一个更高级的命令行工具,它包含了 XSDB 的所有功能,并且还提供了一些额外的功能,例如工程管理、构建和下载等。
如果在 bash 中启动 xsct,会出现如下提示:
Warning: XSCT is deprecated and will be removed in future releases.
We recommend using the new Python command-line tool for project management and debugging:
- Run "vitis -i" for interactive mode.
- Run "vitis -s <script>" for script mode.
XSCT 已经被标记为 “deprecated”(不推荐使用),并且在未来的版本中会被移除。
1.3 Python CLI
Python CLI 实际上指的是在新的 Vitis 命令行工具中使用 Python 脚本来执行以前通过 XSCT 和 XSDB 完成的调试任务。由于 XSCT 正在被弃用,Xilinx 转向了基于 Python 的方法。
核心概念:
- Vitis 命令行工具: 这是取代 XSCT 的新工具,使用 vitis 命令启动。
- Python API: Vitis 命令行工具基于 Python API 构建,也就是需要使用 Python 语法来编写脚本,而不是之前的 Tcl。
- xsdb 模块: 在 Vitis Python API 中,有一个 xsdb 模块,它提供了与 XSDB 功能相对应的 Python 函数。这个模块让你能够通过 Python 脚本执行各种调试操作。
2. 安装 ChipScoPy
2.1 Python 环境
官方建议使用的版本 Python 3.8、3.9、3.10、3.11、3.12。
有多种方法可以配置使用 ChipScoPy API。
本文分享使用 conda 来管理虚拟环境,并使用ChipScPy。
conda 安装方法见此博文:Vivado 编译(单核性能对比+高性能迷你主机+Ubuntu20.04/22.04安装与区别+20.04使用远程命令)_ubuntu vivado-CSDN博客文章浏览阅读834次,点赞11次,收藏28次。选购一款专用于 Vitis 和 Vivado 开发的主机,Vivado 的编译速度很大程度上取决于 CPU 的单核性能,尤其是在布线和综合阶段,最终选择一款迷你主机,不考虑使用独显,核性数一般即可。按照 Single Thread Performance 对比即可,挑选一款最佳性价比产品。对比 Ubuntu 22.04 和 Ubuntu 20.04 运行 Vivado 的兼容性。_ubuntu vivadohttps://blog.csdn.net/DongDong314/article/details/144565249https://blog.csdn.net/DongDong314/article/details/144565249
启用 conda:
>> cd /opt/anaconda3/bin/
>> ./conda init bash
(base)>> conda --version # 确认已启用conda,并查看conda版本
(base)>> python --version # 查看python版本
区分,在 conda 与 shell 中查看 python 版本并不一致:
>> python3 --version
2.2 设置虚拟环境
1)创建 scopy 虚拟环境:
conda deactivate # 激活 base 环境(如果需要)
conda create -n scopy python=3.12.7 # 创建虚拟环境 scopy
conda activate scopy # 激活虚拟环境 scopy
创建虚拟环境 scopy 时,需要指定 python 版本(当前conda的base环境python=3.12.7),不指定的话,conda 会直接使用最新版本(下载新的python=3.13.1)。
2)查看所有已创建的虚拟环境
conda env list
conda info --envs
conda create -n new_env --clone old_env # 克隆旧环境
2)删除 scopy 虚拟环境,并清除与其关联的所有包:
conda remove --name scopy --all
2.3 安装 ChipScoPy
1)激活 scopy 虚拟环境
(base)>> conda activate scopy
---
(scopy)>>
2)安装 ChipScoPy 包
由于 conda 仓库中并没有 ChipScoPy 包,需要使用 python pip 来安装
(scopy)>> python -m pip install --upgrade pip # 更新 pip
(scopy)>> python -m pip install 'chipscopy==2024.2.*' # 安装指定版本的chipscopy
---
Successfully installed Click-8.1.8 antlr4-python3-runtime-4.13.1 certifi-2024.12.14 charset-normalizer-3.4.1 chipscopy-2024.2.1733027508 idna-3.10 importlib_metadata-6.11.0 loguru-0.7.3 markdown-it-py-3.0.0 mdurl-0.1.2 more-itertools-10.5.0 pygments-2.19.1 requests-2.32.3 rich-13.9.4 typing_extensions-4.12.2 urllib3-2.3.0 zipp-3.21.0
2.4 安装依赖
运行以下命令来安装附加支持包:
(scopy)>> python -m pip install chipscopy[core-addons]
(scopy)>> python -m pip install chipscopy[jupyter]
有如下报错:
× Preparing metadata (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [6 lines of output]
Cargo, the Rust package manager, is not installed or is not on PATH.
This package requires Rust and Cargo to compile extensions. Install it through
the system's package manager or via https://rustup.rs/
Checking for Rust toolchain....
[end of output]
解决办法,安装 rust:
(scopy)>> curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
直接按 Enter 键接受默认选项即可。
(scopy)>> source ~/.cargo/env
验证 Rust 和 Cargo 是否安装成功:
(scopy)>> rustc --version
(scopy)>> cargo --version
然后再次执行安装:
(scopy)>> python -m pip install chipscopy[jupyter]
2.5 安装示例
有一个脚本可将示例安装到用户选择的特定目录中。
(scopy)>> chipscopy-get-examples
---
chipscopy-get-examples
No examples available locally, they will be downloaded from Github.
Do you want to proceed? [Y/n] y
Downloading examples from https://github.com/Xilinx/chipscopy/releases/download/2024.2.1733027508/chipscopy_examples_2024.2.1733027508.zip...
示例将被安装到如下目录:
Installed examples to ~/chipscopy-examples.
2.6 打开 JupyterLab
cd ~/chipscopy-examples
jupyter lab --no-browser --port 8888 --ip 192.168.1.23
jupyter lab --no-browser --port 8888 --ip 192.168.137.3
---
To access the server, open this file in a browser:
file:///home/user/.local/share/jupyter/runtime/jpserver-216584-open.html
Or copy and paste one of these URLs:
http://192.168.137.3:8888/lab?token=6841b82a2700442ca7c9d439fa6e9b73ba8b5b30b33256c9
http://127.0.0.1:8888/lab?token=6841b82a2700442ca7c9d439fa6e9b73ba8b5b30b33256c9
可能出现 nodejs 报错:
Could not determine jupyterlab build status without nodejs
在 conda 环境中,安装 nodejs 即可:
(scopy)>> conda install -c conda-forge nodejs
2.7 启动 hw/cs 服务
(scopy)>> hw_server # 启动硬件服务器
(scopy)>> cs_server # 启动chipscopy服务器
2.8 更新 ChipScoPy
开发团队会推出修复和功能,获取最新软件版本:
(scopy)>> python -m pip install --upgrade chipscopy # 更新软件本身
(scopy)>> chipscopy-get-examples # 更新示例
2.9 参考资料
1)视频培训资料
ChipScoPy 培训系列:安装https://china.xilinx.com/video/hardware/chipscopy-installation-overview.htmlhttps://china.xilinx.com/video/hardware/chipscopy-installation-overview.html
包含以下视频:
- ChipScoPy 培训系列:概述
- ChipScoPy 培训系列:硬件设置
- ChipScoPy 培训系列:内存访问示例
- ChipScoPy 培训系列:IBERT 范例
- ChipScoPy 培训系列:PL 架构调试示例
2)ChipScoPy Github IO
ChipScoPy Github IOhttps://xilinx.github.io/chipscopy/2024.2/overview.htmlhttps://xilinx.github.io/chipscopy/2024.2/overview.html
包含以下内容:
- Introduction
- ChipScoPy Overview
- System Requirements
- ChipScoPy Installation
- Developer Installation
- ChipScoPy Debug Core API Classes
- IBERT
- ILA
Memory - NocPerfmon
- PCIe
- SysMon
- VIO
- Misc Classes & Utility Functions
- Containers
- Device
- Report
- Session
3. ChipScoPy 示例
3.1 Programming
1)确保 hw_server 已启动
./opt/Xilinx/Vivado/2024.2/bin/hw_server
2)导入必要的包
import os
from chipscopy import get_design_files
from chipscopy import create_session, report_versions, delete_session
3)获取 HW_URL
HW_URL = os.getenv("HW_SERVER_URL", "TCP:localhost:3121")
PROGRAMMING_FILE = get_design_files("<prj_path>/tt2.runs/impl_1/").programming_file
---
HW_URL: TCP:localhost:3121
PROGRAMMING_FILE: <prj_path>/tt2.runs/impl_1//design_1_wrapper.pdi
- 尝试从操作系统的环境变量中获取名为 HW_SERVER_URL 的变量的值。
- 如果找到了这个环境变量,就将它的值赋给变量 HW_URL。
- 如果没有找到这个环境变量,就将默认值 "TCP:localhost:3121" 赋给变量 HW_URL。
4)创建一个会话并连接到 hw_server
session = create_session(hw_server_url=HW_URL)
report_versions(session)
---
ChipScoPy Version Information
┌────────────────────────────┬──────────────────────────────────────────┐
│ Entity │ Version │
├────────────────────────────┼──────────────────────────────────────────┤
│ ChipScoPy │ ┌───────────┬──────────────────────┐ │
│ │ │ Attribute │ Value │ │
│ │ ├───────────┼──────────────────────┤ │
│ │ │ Build │ 2024.2.1733027508 │ │
│ │ │ Timestamp │ Dec 01 2024-12:31:48 │ │
│ │ └───────────┴──────────────────────┘ │
│ │ │
│ hw_server @ localhost:3121 │ ┌───────────┬──────────────────────────┐ │
│ │ │ Attribute │ Value │ │
│ │ ├───────────┼──────────────────────────┤ │
│ │ │ Status │ Connected │ │
│ │ │ Build │ 1730218498 │ │
│ │ │ Version │ 2024.2 │ │
│ │ │ Timestamp │ Tue Oct 29 10:14:58 2024 │ │
│ │ └───────────┴──────────────────────────┘ │
└────────────────────────────┴──────────────────────────────────────────┘
5)执行烧写
device = session.devices.filter_by(family="versal").get()
device.program(PROGRAMMING_FILE)
---
--> INFO: Programming device with:
<prj_path>/tt2.runs/impl_1/design_1_wrapper.pdi
Device program progress ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% Done
## When done with testing, close the connection
delete_session(session)
3.2 Memory 读写
3.2.1 通用内容
import os
from chipscopy import get_design_files
from chipscopy import create_session, report_versions, delete_session
HW_URL = "TCP:localhost:3121"
session = create_session(hw_server_url=HW_URL)
report_versions(session)
versal_device = session.devices.filter_by(family="versal").get()
print(versal_device)
3.2.2 清空设备
Reset the device to a non-programmed state.
versal_device.reset()
print("Reset complete.")
print("\nMemory Targets: ", versal_device.memory_target_names)
---
Memory Targets: ['DPC', 'Versal xcve2302', 'PSM', 'PPU', 'MicroBlaze PPU', 'APU', 'Cortex-A72 #1', 'Cortex-A72 #0', 'RPU', 'Cortex-R5 #1', 'Cortex-R5 #0']
其中,DPC 表示 Debug Packet Controller,调试数据包控制器。
参见:《Versal Adaptive SoC Technical Reference Manual (AM011)》
3.2.3 简单读写示例
- 写函数 Device.memory_write(addr, values_to_write)
- 读函数 Val = Device.memory_read(address=addr, num=length)
addr = 0xF2010000
values_to_write = [0x10111213, 0x14151617]
print("\nWriting [{}]".format(", ".join(hex(x) for x in values_to_write)), "to address:", hex(addr))
# Write to the DPC default target
versal_device.memory_write(addr, values_to_write)
print(f"Reading {len(values_to_write)} values from address: hex(addr)")
read_values = versal_device.memory_read(address=addr, num=len(values_to_write))
print("Readback result: [{}]".format(", ".join(hex(x) for x in read_values)))
assert read_values == values_to_write # 读写校验
查看源代码,默认会使用第一个 node 进行操作(即 DPC)。
def memory_read(self, address: int, num: int = 1, *, size="w", target=None) -> List[int]:
...
node = self._device_spec.search_memory_node_deep(target, default_target=self.default_target)
...
retval = node.memory_read(address=address, num=num, size=size)
return retval
也可以在 JupyterLab 中验证:
print(versal_device.default_target)
---
DPC
3.2.4 指定字大小
addr = 0xF2010000
values_to_write = [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17]
print("\nWriting [{}]".format(", ".join(hex(x) for x in values_to_write)), "to address:", hex(addr))
versal_device.memory_write(addr, values_to_write, size="b") # 按 byte 写入
print("Reading from address: ", hex(addr))
read_values = versal_device.memory_read(address=addr, size="b", num=len(values_to_write))
print("Readback result: [{}]".format(", ".join(hex(x) for x in read_values)))
assert read_values == values_to_write # 读写校验
values_to_write = [0x1000, 0x1234, 0x4321, 0x1313, 0x1414, 0x1515, 0x1616, 0x1717]
print("\nWriting [{}]".format(", ".join(hex(x) for x in values_to_write)), "to address:", hex(addr))
versal_device.memory_write(addr, values_to_write, size="h") # 按 2*byte 写入
print("Reading from address: ", hex(addr))
read_values = versal_device.memory_read(address=addr, size="h", num=len(values_to_write))
print("Readback result: [{}]".format(", ".join(hex(x) for x in read_values)))
assert read_values == values_to_write # 读写校验
3.2.5 在循环中读写
通过 3.2.4 方法操作内存,速度较慢,因为它每次都需在目标树中查找内存上下文。如果需要执行大量内存操作,应先获取内存上下文,然后批量执行所有操作。
addr = 0xF2010000
dpc = versal_device.memory.get(name="DPC")
apu = versal_device.memory.get(name="APU")
for i in range(10):
values_to_write = [0x12345678 + i, 0xFEDCBA98 - i]
print(
"\nDPC: Writing [{}]".format(", ".join(hex(x) for x in values_to_write)),
"to address:",
hex(addr),
)
dpc.memory_write(addr, values_to_write) # write
print("APU: Reading from address: ", hex(addr))
read_values = apu.memory_read(address=addr, num=len(values_to_write)) # read
print("Readback result: [{}]".format(", ".join(hex(x) for x in read_values)))
assert read_values == values_to_write
4. XSDB 示例
4.1 Basic
4.1.1 参考资料
《Versal Adaptive SoC System Integration and Validation Methodology Guide (UG1388)》
UG1388 - DPC
4.1.2 进入 XSDB
>> source /opt/Xilinx/Vivado/2024.2/settings64.sh
>> hw_server
>> xsdb
xsdb% # 启动成功
4.1.3 帮助信息
xsdb% help
Available Help Categories
breakpoints - Target Breakpoints/Watchpoints.
connections - Target Connection Management.
device - Device Configuration System.
download - Target Download FPGA/BINARY.
ipi - IPI commands to Versal PMC.
jtag - JTAG Access.
memory - Target Memory.
miscellaneous - Miscellaneous.
registers - Target Registers.
reset - Target Reset.
running - Program Execution.
sdk -
stapl - STAPL Operations.
streams - Jtag UART.
svf - SVF Operations.
tfile - Target File System.
4.1.4 基本操作
1)建立连接
xsdb% connect -host localhost -port 3121
or
xsdb% connect
---
tcfchan#0
表示成功建立连接。
2)显示所有目标
xsdb% targets
or
xsdb% ta
---
1 Versal xcve2302
2 RPU (Reset)
3 Cortex-R5 #0 (RPU Reset)
4 Cortex-R5 #1 (RPU Reset)
5 APU (L2 Cache Reset)
6 Cortex-A72 #0 (APU Reset)
7 Cortex-A72 #1 (APU Reset)
8 PPU
9 MicroBlaze PPU (Sleeping)
10 PSM
11 MicroBlaze PSM (Sleeping)
12 PMC
13 PL
14 DPC
3)选择特定目标
比如选择 DPC 进行通讯:
xsdb% target 14
or
xsdb% ta 14
选择成功后,通过 targets 看到 14 中间有个 * 号。
xsdb% ta
1 Versal xcve2302
...
13 PL
14* DPC
4)Memory 读写
xsdb% mwr 0x0 0x2 # Memory 写入
xsdb% mrd 0x0 # Memory 读取
0: 00000002
5)清空命令区内容
xsdb% clear
4.2 控制 AXI GPIO
4.2.1 Bock Desgin
其中 led 管脚绑定为:
set_property PACKAGE_PIN E20 [get_ports {led_tri_io[0]}]
set_property IOSTANDARD LVCMOS15 [get_ports {led_tri_io[0]}]
4.2.2 Address Editor
4.2.3 操作寄存器
xsdb% ta 1
xsdb% loadhw design_1.xsa
xsdb% ta 14
xsdb% mwr 0x20100000004 0 # 设置 AXI GPIO 为输出
xsdb% mwr 0x20100000000 1 # 设置 AXI GPIO 的状态(高)
xsdb% mwr 0x20100000000 0 # 设置 AXI GPIO 的状态(低)
可以观察到 LED 灯的亮灭。
更多例子,可以参考:
Vivado - JTAG to AXI Master (GPIO、HLS_IP、UART、IIC)-CSDN博客文章浏览阅读1.2k次,点赞11次,收藏30次。JTAG to AXI Master 功能简介;在 Vivado 中添加该 IP;基本 TCL 操作命令;三个示例(通过JTAG to AXI 控制 AXI GPIO;通过JTAG to AXI 控制 AXI IIC;通过JTAG to AXI 控制 HLS IP Core)_jtag to axi masterhttps://blog.csdn.net/DongDong314/article/details/142467837https://blog.csdn.net/DongDong314/article/details/142467837
4.2.4 报错提示
xsdb% mrd 0x20100000000
---
Memory read error at 0x20100000000. Blocked address 0x20100000000. Access can hang PS interconnect
解决方法一(强制 memory 操作):
xsdb% mwr -force 0x20100000004 0 # 设置 AXI GPIO 为输出
xsdb% mwr -force 0x20100000000 1 # 设置 AXI GPIO 的状态(高)
xsdb% mwr -force 0x20100000000 0 # 设置 AXI GPIO 的状态(低)
解决方法二(加载 PDI 和对应 XSA):
xsdb% ta 1
xsdb% loadhw design_1.xsa
xsdb% ta 14
xsdb% mwr 0x20100000004 0 # 设置 AXI GPIO 为输出
xsdb% mwr 0x20100000000 1 # 设置 AXI GPIO 的状态(高)
xsdb% mwr 0x20100000000 0 # 设置 AXI GPIO 的状态(低)
参见:
Memory Accesses in XSDB Fails
原因归纳:
HW Server 阻止对未知内存区域的事务。
xsdb% help loadhw
---
加载一个 Vivado 硬件设计,并为当前目标设置存储器映射。如果当前目标是一组处理器的父级,则为它的所有子处理器设置存储器映射。如果当前目标是一个处理器,则为其父级的所有子处理器设置存储器映射。此命令返回硬件设计对象。
5. Python CLI
5.1 参考资料
1)《Vitis Reference Guide (UG1702)》
Additional Information -> Python XSDB Commands
https://docs.amd.com/r/en-US/ug1702-vitis-accelerated-reference/Python-XSDB-Commandshttps://docs.amd.com/r/en-US/ug1702-vitis-accelerated-reference/Python-XSDB-Commandshttps://docs.amd.com/r/en-US/ug1702-vitis-accelerated-reference/Python-XSDB-Commands
2)Vitis Embedded Scripting Flows
Vitis-Tutorials/Embedded_Software/Feature_Tutorials /04-vitis_scripting_flows/https://github.com/Xilinx/Vitis-Tutorials/tree/2024.2/Embedded_Software/Feature_Tutorials/04-vitis_scripting_flowshttps://github.com/Xilinx/Vitis-Tutorials/tree/2024.2/Embedded_Software/Feature_Tutorials/04-vitis_scripting_flowsTable of Contents:
- Component creation using the Vitis commands
- Metadata extraction using HSI API
- Deploy and Debug in XSDB from commandline
5.2 基本命令
5.2.1 启动方式
1)命令行交互
vitis -i
2)jupyter
vitis -j --no-browser --port 8888 --ip 192.168.137.3
5.2.2 导入 xsdb 包
import xsdb
xsdb.help("functions") # 显示所有可用函数
5.2.3 建立对话和连接
session=xsdb.start_debug_session() # 创建对话
session.connect() # 连接 hw server
---
tcfchan#0
查看已建立的连接:
session.connect("--list")
5.2.4 选择 target
1)查看所有 targets
session.targets()
2)选择一个 target
session.targets(1)
or
session.targets("--set", filter="name =~ *Versal*")
session.targets() # 再次查看 targets
可以看到 “1* Versal xcve2302”,中间有个星号,表示已经选中了 Versal。
5.2.5 下载 PDI
# Download PDI to Versal Device
PDI="<path>/design_1_wrapper.pdi"
session.targets("--set", filter="name =~ *Versal*")
session.rst()
session.device_program(PDI)
如果不执行复位,直接执行同样的下载,过程会很慢,而且最后也会失败。
5.2.6 设置存储器映射
session.targets("--set", filter="name =~ *Versal*")
XSA="<path>/design_1_wrapper.xsa"
session.loadhw(hw=XSA)
查看映射:
Targets DesignFile
======= ==========================
1 <path>/deign_1_wrapper.xsa
映射的目的,就是把当前 Block Address Editor 内容告知 session,防止被 Block。
5.2.7 Momory 读写
session.targets("--set", filter="name =~ *DPC*")
session.mrd(0x201_0000_0000) # memory 读取
session.mrd(0x201_0000_0000, '-f') # 强制 memory 读取
session.mwr(address=0x201_0000_0004, words=0)
如果没有设置存储器映射,Memory 操作会失败,除非强制操作。
5.3 控制 AXI GPIO
5.3.1 Block Design
Address Editor:
5.3.2 主要代码
import xsdb
PDI="<path>/design_1_wrapper.pdi"
XSA="<path>/design_1_wrapper.xsa"
session = xsdb.start_debug_session()
session.connect()
session.targets("--set", filter="name =~ *Versal*")
session.rst()
session.device_program(PDI)
session.targets("--set", filter="name =~ *Versal*")
session.loadhw(hw=XSA)
session.targets("--set", filter="name =~ *DPC*")
session.mwr(address=0x201_0000_0004, words=0)
session.mwr(address=0x201_0000_0000, words=1)
session.mwr(address=0x201_0000_0000, words=0)
6. 总结
本文介绍几款 xilinx 调试工具使用方法:
- ChipScoPy 的安装和使用
- XSDB
- Python CLI