Riscv 调试系统的合规测试

Riscv debug release框图

在这里插入图片描述
在这里插入图片描述

仿真环境下的Riscv debug框图

在这里插入图片描述

平头哥调试环境

在这里插入图片描述
在这里插入图片描述

XuanTie DebugServer是一个调试代理软件,它通过CKLINK,以JTAG的方式连接目标板,并支持“GDB Remote Protocol” 。开发者可以通过GDB对运行在玄铁800系列和玄铁900系列处理器上的软件程序进行在线调试。

OpenOCD & GDB

OpenOCD 是一款支持多种芯片体系结构的开源调试和编程工具,它可以连接到不同的调试适配器,例如 J-Link、ST-LINK、CMSIS-DAP 等。通过 OpenOCD,我们可以在嵌入式系统上执行调试命令,例如读取寄存器的值、往 Flash中下载程序、启动或停止运行等。
GDB(GNU Debugger)是一个强大的命令行调试器,它支持多种体系结构和编程语言,并且可以与多种编程工具和 IDE 集成。GDB 可以识别多种调试器协议,并进行远程调试,它允许我们在嵌入式系统上调试代码,并且可以与 OpenOCD 集成使用。
OpenOCD 和 GDB 通常一起使用,通过 OpenOCD 连接到调试适配器,然后使用 GDB 发送调试命令到 OpenOCD,这样我们就可以在嵌入式系统上执行调试命令来调试代码了。在调试中,我们可以设置断点、单步执行、查看变量、观察程序状态等,这些调试功能可以帮助我们快速定位代码中的问题并进行调试和优化。
在这里插入图片描述

OpenOCD & GDB 的启动步骤

  1. 配置硬件连接:连接调试目标设备和调试工具(例如 JTAG 调试器),确保硬件连接正确。
  2. 准备配置文件: 创建 OpenOCD 的配置文件,该文件描述了调试目标设备的连接方式、芯片型号、调试器类型等信息。配置文件通常是一个 .cfg 文件,如下C920.cfg。
debug_level 3
adapter speed 20000
gdb_port 3333
telnet_port 4444
if {$::env(USE_JTAG_DPI)} {puts "debug point USE_JTAG_DPI"adapter driver remote_bitbangremote_bitbang host localhostremote_bitbang port 9999
}
if {$::env(USE_JTAG_VPI)} {puts "debug point USE_JTAG_VPI"adapter driver jtag_vpi# Set the VPI JTAG server portif { [info exists VPI_PORT] } {set _VPI_PORT $VPI_PORT} else {set _VPI_PORT 5555}# Set the VPI JTAG server addressif { [info exists VPI_ADDRESS] } {set _VPI_ADDRESS $VPI_ADDRESS} else {set _VPI_ADDRESS "127.0.0.1"}jtag_vpi set_port $_VPI_PORTjtag_vpi set_address $_VPI_ADDRESS
}set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10000b6fset _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAMEinit
puts "init done"halt
puts "Ready for Remote Connections"
  1. 启动 OpenOCD:在终端中运行 OpenOCD,并指定配置文件。例如:
openocd -f C920.cfg
  1. 连接 GDB:在另一个终端中启动 GDB,并连接到 OpenOCD 的远程调试服务器。例如:
target remote localhost:3333
  1. 加载程序:在 GDB 中加载要调试的程序,设置断点等。
  2. 开始调试:通过 GDB 发送调试命令,如单步执行、断点设置等,与目标设备进行交互。
  3. 退出:完成调试后,可以退出 GDB 和 OpenOCD。
    运行log:

Debug: 20 2 command.c:154 script_debug(): command - gdb_port 3333
Debug: 21 2 command.c:154 script_debug(): command - telnet_port 4444
Debug: 22 2 command.c:154 script_debug(): command - adapter driver jtag_vpi
Info : 23 2 transport.c:107 allow_transports(): only one transport option; autoselecting ‘jtag’
Debug: 24 2 command.c:154 script_debug(): command - jtag_vpi set_port 5555
Info : 25 2 jtag_vpi.c:602 jtag_vpi_set_port(): jtag_vpi: server port set to 5555
Debug: 26 2 command.c:154 script_debug(): command - jtag_vpi set_address 127.0.0.1
Info : 27 2 jtag_vpi.c:617 jtag_vpi_set_address(): jtag_vpi: server address set to 127.0.0.1
Debug: 28 2 command.c:154 script_debug(): command - jtag newtap riscv cpu -irlen 5 -expected-id 0x10000b6f
Debug: 29 2 tcl.c:419 handle_jtag_newtap_args(): Creating New Tap, Chip: riscv, Tap: cpu, Dotted: riscv.cpu, 4 params
Info : 53 2 jtag_vpi.c:565 jtag_vpi_init(): jtag_vpi: Connection to 127.0.0.1 : 5555 successful
Info : 66 134793 core.c:1133 jtag_examine_chain_display(): JTAG tap: riscv.cpu tap/device found: 0x10000b6f (mfg: 0x5b7 (T-HEAD Semiconductor Co Ltd), part: 0x0000, ver: 0x1)
Info : 487 3662279 gdb_server.c:3888 gdb_target_start(): starting gdb server for riscv.cpu on 3333
Info : 488 3662279 server.c:298 add_service(): Listening on port 3333 for gdb connections
Info : 522 3888663 server.c:298 add_service(): Listening on port 6666 for tcl connections
Info : 523 3888663 server.c:298 add_service(): Listening on port 4444 for telnet connections
Info : 535 3931037 server.c:90 add_connection(): accepting ‘gdb’ connection on tcp/3333

关于riscv-tests/debug 测试框架

测试框架链接: riscv-tests
debug需要许多系统组件协同工作。这里的测试执行端到端测试,与 GDB 和 OpenOCD 通信。
如果仿真或硬件通过了所有这些测试,那么你就可以确信实际调试接口运行正常。
我们采用仿真的方式,进行所有这些测试
在这里插入图片描述
riscv-tests/debug是一套python脚本,testlib.py中提供了Gdb Openocd VcsSim类,
Gdb类调用subprocess启动GDB,且提供了Riscv 合规测试和debug测试常用命令的函数,例如gdb.c()中实现了continue命令
Openocd类调用subprocess启动OpenOCD,等待OpenOCD完成riscv_examine且监测如下信息Listening on port .* for gdb connections

Info : 475 3675417 riscv-013.c:2137 examine(): [riscv.cpu] Examined RISC-V core; found 4 harts
Info : 476 3675417 riscv-013.c:2138 examine(): [riscv.cpu] XLEN=64, misa=0x800000000094112f
User : 477 3675417 target.c:724 target_examine_one(): [riscv.cpu] Target successfully examined.
Info : 488 3675417 server.c:298 add_service(): Listening on port 3333 for gdb connections

VcsSim类调用subprocess启动PICOsim仿真,循环监测^Listening on port (\d+)$信息(jtag_vpi server中打印的)说明带有jtag server的testbench启动成功,退出循环,然后就启动OpenOCD了
OpenOCD的vpi client通过socket和testbench中jtag_vpi server连接,jtag_vpi server中有如下代码:

int jtag_server_create(int port, int loopback_only)
{......PRINT_MSG("jtag_vpi server created.\n");PRINT_MSG("Listening on port %d\n", port);PRINT_MSG("Waiting for client connection...\n");return JTAG_SERVER_SUCCESS;
}

开始riscv-tests/debug之前需要进行如下设置:

  1. 设置OpenOCD使用配置文件,如下面的配置文件Riscv 合规测试和debug测试
  2. 设置target硬件的配置
import targets
import testlib
import os
import subprocessclass C920Hart(targets.Hart):xlen = 64ram = 0x80000000ram_size = 256 * 1024 * 1024bad_address = 0x0800080000instruction_hardware_breakpoint_count = 3link_script_path = "C920.lds"misa = 0x800000000094112freset_vectors = [0x800000000]class C920Sim(targets.Target):timeout_sec = 100000 #msserver_timeout_sec = 50000remotelogfile_enable = Trueopenocd_config_path = "C920.cfg"harts = [C920Hart()]support_memory_sampling = False # Needs SBAicount_limit = 1 #//count is hard-wired to 1clint_addr = 0xFF08000000 + 0x04000000def __init__(self, path, parsed):super().__init__(path, parsed)  self.parsed = parsedif not self.parsed.test_prefix:original_dir = os.getcwd()os.chdir(os.path.expandvars("$PRJ_HOME/tb/riscv_dbg/remote_bitbang"))output_file = "build.log"with open(output_file, "w") as f:subprocess.run(['make', 'clean'], stdout=f, stderr=f)with open(output_file, "a") as f:subprocess.run(['make', 'CFLAGS_DBG="-DRISCV_DBG=1"'], stdout=f, stderr=f)os.chdir(original_dir)def create(self):if self.parsed.test_prefix:#sim_cmd = f'python3 $PICOSIM_DIR/yasaTop.py -notest_flist -t CpuRiscvDgbTest -tsmc -seed 1 -riscv_dbg -test_prefix {self.parsed.test_prefix} -v -so'sim_cmd = f'python3 $PICOSIM_DIR/yasaTop.py -notest_flist -t CpuRiscvDgbTest -tsmc -seed 2 -jtag_vpi -test_prefix {self.parsed.test_prefix} -v -w -so -sim_timeout 500000'else:sim_cmd = 'python3 $PICOSIM_DIR/yasaTop.py -notest_flist -t CpuRiscvDgbTest -tsmc -seed 1 -riscv_dbg -test_prefix riscv_dbg_openocd -v'# timeout includes compile time, so set it a large time then default value# firstly need goto tb/riscv_dbg/remote_bitbang, then execute ~make clean, ~make CFLAGS_DBG="-DRISCV_DBG=1"return testlib.VcsSim(sim_cmd=os.path.expandvars(sim_cmd), debug=False, timeout=1800)
  1. 跑一个case

\bsub -m picocsxx -Is ./gdbserver.py targets/T-head/C920Sim.py CheckMisa --test_prefix picocsxxx --sys_out

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

24.可乐机拓展练习--综合训练

(1)设计要求:仍以可乐机为背景,一瓶可乐的价格是2.5 元,用按键控制投币(加入按键消抖功能),可以投 0.5 元硬币和 1元硬币,投入 0.5 元后亮一个灯,投入 1元后亮…

从微软 Word 中提取数据

从 Microsoft Word 文档中提取数据可以通过编程来实现,有几种常见的方法,其中之一是使用 Python 和 python-docx 库。python-docx 是一个处理 .docx 文件(Microsoft Word 文档)的 Python 库,可以读取和操作 Word 文档的…

语雀平替,一款私有化功能丰富的开源知识库系统

背景介绍 现代企业面临的文档管理挑战日益严峻,包括信息冗余,存在多份数据,难以做到统一 ,文档数量激增,查找麻烦,知识的信息安全问题频发以及团队协作需求不断上升。同时,随着知识管理在企业运…

文章SameStr(二):图2代码

title: “Publication Figure 2” 百度云盘链接: https://pan.baidu.com/s/15g7caZp354zIWktpnWzWhQ 提取码: 4sh7 Libraries Standard Import library(tidyverse) library(cowplot) library(scales) library(ggpubr)Special library(lme4) library(sjPlot) library(sjst…

基于Java中的SSM框架实现学生网上请假系统项目【项目源码+论文说明】计算机毕业设计

摘要 本学生网上请假系统是针对目前学生网上请假系统的实际需求,从实际工作出发,对过去的学生网上请假系统存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用目前最流…

数据结构与算法:顺序表和链表

目录 一、线性表 二、顺序表 三、链表 一、线性表 线性表( linear list )是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线…

MyBatis框架学习笔记(一):MyBatis入门

1 MyBatis 介绍 1.1 官方文档 MyBatis 中文手册: (1)https://mybatis.org/mybatis-3/zh/index.html (2)https://mybatis.net.cn/ Maven 仓库: https://mvnrepository.com/ 仓库作用:需要…

(三)前端javascript中的数据结构之集合

集合的特点 1.无序 2.唯一性 3.不可重复 集合相对于前面几种数据结构,比较简单好理解,看看代码实现就能知道他的用法了 集合的创建 function MySet() {this.item {}; } MySet.prototype.has function (value) {return value in this.item; };//增 M…

编程范式之函数式编程

目录 前言1. 函数式编程的定义2. 函数式编程的特点2.1 纯函数2.2 不可变性2.3 高阶函数2.4 惰性求值 3. 函数式编程的应用场景3.1 并行计算3.2 数据分析3.3 Web开发 4. 函数式编程的优缺点4.1 优点4.2 缺点 5. 代表性的编程语言5.1 Haskell5.2 Scala5.3 Clojure 6. 示例代码结语…

HTML5新增的input元素属性:placeholder、required、autofocus、min、max等

HTML5 大幅度地增加与改良了 input 元素的属性,可以简单地使用这些属性来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 下面将详细介绍这些新增的 input 元素的属性。 属性说明属性说明placeholder在输入框显示描述性或提示性文本list为文本框添加选…

React+TS前台项目实战(二十七)-- 首页响应式构建之banner、搜索、统计模块布局

文章目录 前言一、 效果展示二、相关模块1. Statistic统计模块功能分析代码详细注释使用方式 2. Search搜索模块功能分析代码详细注释使用方式 3. banner模块功能分析代码详细注释使用方式 总结 前言 前面我们已经封装了这个项目基本要用到的全局组件了,现在就开始…

ScreenAI ——能理解从信息图表到用户界面的图像和文本算法解析

概述 论文地址:https://arxiv.org/pdf/2402.04615.pdf 信息图表(图表、示意图、插图、地图、表格、文档布局等)能够将复杂的数据和想法转化为简单的视觉效果,因此一直以来都被视为传播的重要元素。这种能力来自于通过布局和视觉线…

普通人必看!AI绘画商业变现全攻略(附教程)

大部分的设计师除了主业以外,都会利用空余时间去接单做副业。 单子包括但不限于产品/品牌LOGO、电商产品图设计、海报、室内设计图等等,单价在几十到上千不等 引起了我的思考,我们普通人有没有机会,也能像他们一样去接单赚钱吗&a…

pytorch- RNN循环神经网络

目录 1. why RNN2. RNN3. pytorch RNN layer3.1 基本单元3.2 nn.RNN3.2.1 函数说明3.2.2 单层pytorch实现3.2.3 多层pytorch实现 3.3 nn.RNNCell3.3.1 函数说明3.3.2 单层pytorch实现3.3.3 多层pytorch实现 4.完整代码 1. why RNN 以淘宝的评论为例,判断评论是正面…

matplotlib颜色对照表

matplotlib的色彩设置: #------------------------------------------------------------------------------------------------------------------------------- #-------------------------------------------------------------------------------------------------------…

【JavaWeb】登录校验-会话技术(二)JWT令牌

JWT令牌 介绍 JWT全称:JSON Web Token (官网:https://jwt.io/) 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。 简洁&#xff1a…

vue和react你怎么选择?

在选择Vue和React之间,其实没有一个绝对的“最佳选择”,因为这取决于你的项目需求、团队熟悉度、开发环境、以及你对这两个框架的个人偏好。下面是一些可以帮助你做出决策的因素: 1. 学习曲线 Vue:Vue的学习曲线相对平缓&#xf…

借助软件资产管理系统,优化Solidworks软件许可证管理

在当今数字化的企业环境中,软件许可证的有效管理对于业务的顺畅运行至关重要。然而,IT 运维部门常常面临着诸如用户部门 SW 许可证不够用、使用紧张等问题,而由于缺乏可靠的数据支持,难以准确判断许可证的短缺程度,这给…

MFC引用C#生成的dll,将dll放置到非exe程序目录,如何操作?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

信创:鲲鹏(arm64)+麒麟(kylin v10)离线部署k8s和kubesphere(含离线部署新方式)

本文将详细介绍,如何基于鲲鹏CPU(arm64)和操作系统 Kylin V10 SP2/SP3,利用 KubeKey 制作 KubeSphere 和 Kubernetes 离线安装包,并实战部署 KubeSphere 3.3.1 和 Kubernetes 1.22.12 集群。 服务器配置 主机名IPCPUOS用途master-1192.168.10…