在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2086|回复: 16

[求助] 关于risc-v类型CPU的debug

[复制链接]
发表于 2023-12-4 17:17:34 | 显示全部楼层 |阅读模式
100资产
求教大佬们:
进入调试模式是什么意思?比如hart退出复位且设置haltreq了就立即进入调试模式。
如果我想通过abstract command或者program buffer或者SBA设置register或者访问mem等,需要进入调试模式吗?
还是说运行断点时候才进入调试模式?

我验证risc-v CPU debug时,先reset,后设置dactive为1,再设置hartsel选择hart,然后通过dmi运行abstract command等。

这样步骤对吗?

最佳答案

查看完整内容

1. 你可以简单地认为,除了M、HS、U、VS、VU这些模式外,还有一个额外的D-mode,权限上,可以认为是M-mode的超集。有别于其他mode,D-mode下,core的控制权被DM接管,换言之,DM让core干啥,core就干啥,而不是像普通模式那样,core自动执行pc指示的程序。 2. core确实可以reset撤除后立即进入d-mode,这种进d-mode的方式叫reset halt req,你可以看看dcsr寄存器的cause字段,上面列出了所有进入d-mode的方式。 3. 从硬件实现的角 ...
发表于 2023-12-4 17:17:35 | 显示全部楼层
本帖最后由 ascetic 于 2023-12-17 22:16 编辑

1. 你可以简单地认为,除了M、HS、U、VS、VU这些模式外,还有一个额外的D-mode,权限上,可以认为是M-mode的超集。有别于其他mode,D-mode下,core的控制权被DM接管,换言之,DM让core干啥,core就干啥,而不是像普通模式那样,core自动执行pc指示的程序。
2. core确实可以reset撤除后立即进入d-mode,这种进d-mode的方式叫reset halt req,你可以看看dcsr寄存器的cause字段,上面列出了所有进入d-mode的方式。
3. 从硬件实现的角度看,有两个相互独立的部件,core和dm,正常情况下只有core工作,当dm工作(各种方法配置里面的寄存器),core就按照dm的指令工作。具体而言,可以理解为两件事:一是dm告诉core干什么(硬件的角度看,就是在配dm里的寄存器,配完后,这些信息一般会通过专有/复用总线发给core,core会操作几个外部不可见的、debug专用的寄存器,记录将要干什么),二是dm向core下达“开始干”的命令(也是配寄存器,不过core看来就是个请求,至于怎么从dm传到core,直接wire或走msi都行)。当core收到“开始干”的命令,会读取这个debug专用寄存器,core里的特定部件会将dm命令转译成core的pipe能认的形式(就是普通isa指令),然后就可以执行了,如果需要返回dm结果,还会将结果放到刚才说的core内的debug专用寄存器,然后dm会读取其中的内容。
 楼主| 发表于 2023-12-13 11:44:12 | 显示全部楼层
补充下,选择完hart后,set haltreq,然后等anyhalted或allhalted,然后再……
发表于 2023-12-17 22:28:18 | 显示全部楼层
列举下怎么进d-mode:
1. ebreak:core在非d-mode下执行ebreak指令,然后进入d-mode(dm被动获得core控制权)
2. trigger:core在非d-mode下执行指令,当满足某些条件(比如程序运行到特定pc或访问了特定存储地址),然后进入d-mode(dm被动获得core控制权)
3. haltreq:core在非d-mode下执行指令,dm主动发起请求,core被动进入d-mode
4. step:过程是这样的,core处于d-mode,然后dm向core发起单步请求,core退出d-mode回到dcsr.prv指示的模式,然后执行pc指示(从dpc获得)的指令,执行完成后,重新进入d-mode
5.resethaltreq:core的复位撤除后,直接进入d-mode
6. group:可以暂时把它当作halt req
发表于 2023-12-17 22:41:30 | 显示全部楼层
在d-mode下能干啥:
1. abstract cmd:简单而言,就是配dm寄存器 -> 生成的消息或命令 -> core通过某种方式收到dm发来的信息 -> 如果是读写操作,就先转译成指令,然后指令在core中执行,如果只是单纯的命令,就直接按命令执行(比如step或resume)。需要注意的是,除了step、resume(退出d-mode)这样的特例,core全程都在d-mode下。
2. program buffer:可以这样看,abstract cmd太麻烦了,因此程序员直接将要干的事以指令的形式存到program buffer中,这样,core直接执行program buffer内的程序即可(注意,除了执行dret这样的指令导致退出d-mode,core全程都在d-mode下)
发表于 2023-12-17 22:44:07 | 显示全部楼层
讲完以上内容,你所问的那些细节,根据手册往里套就行了
 楼主| 发表于 2023-12-18 11:40:23 | 显示全部楼层


ascetic 发表于 2023-12-17 22:44
讲完以上内容,你所问的那些细节,根据手册往里套就行了


感谢大佬回复,豁然开朗了
 楼主| 发表于 2023-12-20 10:19:35 | 显示全部楼层


ascetic 发表于 2023-12-17 22:44
讲完以上内容,你所问的那些细节,根据手册往里套就行了


大佬,你晓得怎么在RTL functional验证阶段使用openOCD和gdb去验CPU debug功能吗?

github看了下riscv_test的repo没看懂……
目前是有cpu的简易验证环境
发表于 2024-7-24 16:21:35 | 显示全部楼层


anpengfei 发表于 2023-12-20 10:19
大佬,你晓得怎么在RTL functional验证阶段使用openOCD和gdb去验CPU debug功能吗?

github看了下riscv_t ...


openOCD和gdb那是基本不太可能了,这个方法可行但太过复杂,你还不如自己做个tb搭出来时序去驱动debug模块
 楼主| 发表于 2024-7-25 11:12:30 | 显示全部楼层


gongchengshi330 发表于 2024-7-24 16:21
openOCD和gdb那是基本不太可能了,这个方法可行但太过复杂,你还不如自己做个tb搭出来时序去驱动debug模 ...


还好,老大弄好了,看着不难,都是github上现成的东西,唯一难的还是装openOCD……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-24 11:03 , Processed in 0.020876 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表