https://mp.weixin.qq.com/s/zPNyrBOhsytkRrZTDTEvpw

介绍riscv-debug的使用实例:配置Triggers功能。

1. Trigger

Trigger是指硬件触发器:A debugger can use hardware triggers to halt a hart when a certain event occurs.

2. Trigger Module

Triggers can:

a. cause a breakpoint exception, entry into Debug Mode,

b. or a trace action without having to execute a special instruction.

This makes them invaluable when debugging code from ROM.

They can trigger:

a. on execution of instructions at a given memory address,

b. or on the address/data in loads/stores.

These are all features that can be useful without having the Debug Module present, so the Trigger Module is broken out as a separate piece that can be implemented separately.

Triggers不会在调试模式触发:

用以下方法检测某个序号的触发器是否支持:

3. 实例1

A. (补)tselect=0:选择第0个触发器;

B. 写tdata1寄存器,其中:

a. type=2:The trigger is an address/data match trigger;

tdata1和mcontrol的地址相同,实际上是同一个寄存器:

mcontrol格式如下:

b. action=1:Enter Debug Mode. (Only supported when the trigger's dmode is 1.)

c. dmode=1:根据b的要求,dmode应该为1,其意义为:

d. match=0:Matches when the value equals tdata2;就是说与tdata2中的值进行匹配;

e. m=s=u=1:触发器在M/S/U模式下触发:

f. execute=1:When set, the trigger fires on the virtual address or opcode of an instruction that is executed. 对执行的指令地址或者指令码进行匹配;结合上面的配置,即指令地址或指令码等于tdata2中的值时,触发器触发;

g. tdata1=0x105c是指低16位的值:

那么高位的值呢?

隐含的要求:

a) type=2;

b) dmode=1;

文档写的比较粗糙,其他位应该为0。

本实例的before体现在mcontrol的timing位:

这一位值为0,意义为:The action for this trigger will be taken just before the instruction that triggered it is executed, but after all preceding instructions are committed.

C. tdata2=0x80001234:待匹配的指令地址为0x80001234;

4. 实例2

与实例1相比,区别如下:

A. 相较于实例1匹配指令地址,这里匹配的是读内存地址:load=1;

B. 相较于实例1中指令执行前触发,这里在读内存之后触发:timing=1:

5. 实例3

这里实例中使用了两个触发器:Trigger 0和Trigger 1.

1) Trigger 0

实现Enter Debug Mode right before a write to an address greater than 0x80007c80:

a. timing=0:在指令执行前触发;

b. match=2:大于0x80007c80:Matches when the value is greater than (unsigned) or equal to tdata2.

c. store=1:匹配a write to an address;

d. tdata2=0x80007c80:保存待匹配的内存地址;

2) Trigger 1

实现Enter Debug Mode right before a write to an address less than 0x80007c80:

a. timing=0;

b. match=3:Matches when the value is less than (unsigned) tdata2;

c. store=1;

d. tdata2=0x80007cf0:注意这里不是0x80007cef,因为要求是包括0x80007cef这个地址,而匹配时是排除tdata2这个地址,所以只能把要求的地址加1之后存入tdata2;

6. 实例4

a. timing=0:在指令执行前触发;

b. store=1:匹配一个写内存操作;

c. match=1:

这里匹配tdata2寄存器的高M位,M的计算方法是XLEN-1减去最低的0位的序号:

a. XLEN=32, XLEN-1=31;

b. 0x81237fff中最低的0位是第15位:

c. 所以M=31-15=16;也就是说匹配tdata2的高16位;

d. 也就是把要写的内存地址的高16位与tdata2的高16位进行匹配,那么可以触发的内存地址的范围即是:0x81230000-0x8123ffff;

7. 实例5

这里匹配针对两个内存地址范围的读操作,需要使用两个Trigger。其中:

a. timing=1:表示读操作完成之后触发;

b. load=1:表示匹配的是读内存操作;

c. chain=1:表示两个trigger组合使用:While this trigger does not match, it prevents the trigger with the next index from matching.

1) Trigger 1

要匹配的内存地址范围是:0xXXXX3090-0xXXXX309f;

A. match=4:Matches when the lower half of the value equals the lower half of tdata2 after the lower half of the value is ANDed with the upper half of tdata2.

a. 首先把待匹配值的低一半V与tdata2的高一半相与:V & 0xfff0;

b. 然后把结果与tdata2的低一半相比较,即(V & 0xfff0) =? 0x3090;

c. 如果相等则触发;效果是匹配的内存地址的低一半是0x3090-0x309f;

B. chain=1:这里只匹配了低一半的地址,还有高一半的地址需要匹配,需要与Trigger 2组合使用;

2) Trigger 2

要匹配的内存地址范围是:0x8675XXXX-0x9675XXXX;

A. match=5:Matches when the upper half of the value equals the lower half of tdata2 after the upper half of the value is ANDed with the upper half of tdata2.

a. 首先把待匹配值的高一半V与tdata2的高一半相与:V & 0xefff;

b. 然后把结果与tdata2的低一半相比较,即(V & 0xefff) =? 0x8675;

c. 如果相等则触发;效果是匹配的内存地址的高一半是0x8675-0x9675;

Rocket - debug - Example: Triggers的更多相关文章

  1. Rocket - debug - TLDebugModuleInner - Hart Bus Access

    https://mp.weixin.qq.com/s/deNMEyJ1idJDVoZwwo0A1A 简单介绍TLDebugModuleInner中核心总线访问(Hart Bus Access). 参考 ...

  2. Rocket - debug - Periphery

    https://mp.weixin.qq.com/s/uGxn-Xec0LkwdaSsCtQBvw 简单介绍Periphery的实现. 1. ExportDebugDMI/ExportDebugJTA ...

  3. Rocket - debug - DebugTransport

    https://mp.weixin.qq.com/s/EcsuTjb4hFF9Ncig9Gfhew 简单介绍DebugTransport的实现. 1. JtagDTMConfig 1) JtagDTM ...

  4. Rocket - debug - TLDebugModule

    https://mp.weixin.qq.com/s/EhUb1z5oiIw6dJ-90ifDJA 简单介绍TLDebugModule中的实现. 1. device device是一个设备描述符,包含 ...

  5. Rocket - debug - TLDebugModuleInner - ROM Generation

    https://mp.weixin.qq.com/s/j_CgHU4PnY82NMwJzOqHYg 简单介绍Variable ROM Generation. 1. jalAbstract jalAbs ...

  6. Rocket - debug - Example: DMI

    https://mp.weixin.qq.com/s/7suuJ7m2BKCpsHk1K2FzJQ 介绍riscv-debug的使用实例:如何使用DMI. 1. dm Debug Module实现了调 ...

  7. Rocket - debug - Example: Read Memory

    https://mp.weixin.qq.com/s/ChXNTbx94WDC72GvmE9bGA 介绍riscv-debug的使用实例:使用三种方法读取内存. 1. Using System Bus ...

  8. Rocket - debug - Example: Accessing Registers Using Program Buffer

    https://mp.weixin.qq.com/s/8yYLVg-RXX3XX0T431lxeA 介绍riscv debug接口的使用实例:使用Program Buffer读取寄存器. 1. Wri ...

  9. Rocket - debug - Example: Accessing Registers Using Abstract Command

    https://mp.weixin.qq.com/s/RdJzE06mMkh2x__vVj_fEA 介绍riscv debug接口的使用实例:使用抽象命令读取寄存器. 1. Read s0 using ...

随机推荐

  1. mac下使用xampp中php显示1044/1045/1046(卸载xampp)

    问题描述 在mac下使用xampp,访问http://192.168.64.3/phpmyadmin/可以正常显示php页面,当创建数据库时提示1044也就是普通用户没有权限 问题猜测 猜测在使用xa ...

  2. 201771010113 李婷华 《面向对象程序设计(Java)》第六周总结

    一.理论知识部分 第四章 类与对象 1.方法的定义:方法声明和方法体. 2.重载:一个类中可以有多个方法具有相同的名字,不同的类型,不同的参数. 3.构造器:也叫构造方法,是类中的一种特殊的方法,其作 ...

  3. Redis 学习笔记(一) 字符串 SDS

    SDS 简单动态字符串. SDS的结构: struct sdshdr{ int len;//记录BUF数组中已使用字节的数量 ,等于SDS所八寸字符串的长度 int free;//记录BUF数组中未使 ...

  4. Spring 循环引用(三)源码深入分析版

    @ 目录 前言 正文 分析 doGetBean 为什么Prototype不可以 createBean doCreateBean getEarlyBeanReference getSingleton b ...

  5. 【漫画】JAVA并发编程 如何解决原子性问题

    原创声明:本文转载自公众号[胖滚猪学编程],转载务必注明出处! 在并发编程BUG源头文章中,我们初识了并发编程的三个bug源头:可见性.原子性.有序性.在如何解决可见性和原子性文章中我们大致了解了可见 ...

  6. SSL协议握手工作流程详解(双向HTTPS流程)

    参考学习文档:http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html SSL协议的工作流程: 服务器认证阶段: 1)客户端向服务器发 ...

  7. 笨办法学习python-ex51自我理解笔记

    本章节主要讲的是web的工作原理,先大概熟悉记录一下,为以后写Django web框架打下基础. web工作原理: 1.用户从浏览器输入网址----->browser通过电脑中的网络设备(网卡) ...

  8. RabbitMQ及延时队列

    一.简介 我用过RabbirMQ的发布订阅模式,以及一对一的延迟队列. 1.RabbitMQ的有消息确认机制,消费一条则队列中少一条,也有对应的消费到消息及认为是消费成功这样的模式,一般使用前者. 发 ...

  9. 关于SpringMVC乱码问题

    关于SpringMVC运行Tomcat控制台出现乱码的情况(在网上找到一种方法亲测有效) 找到tomcat文件夹中的conf包下的logging.properties中找到 java.util.log ...

  10. 使用gitHub和git进行团队合作开发

    1.创建仓库(项目)-----组织者(Leader)和团队成员 1)Leader在gitHub上创建一个新组织(New organization),然后邀请成员加入 2)Leader在该组织下创建一个 ...