Menu Close

RISC-V CSR寄存器(2)CSR寄存器(下)

上一篇文章RISC-V CSR寄存器(1)CSR简介和CSR指令简单介绍了CSR寄存器及6条CSR指令,本文将介绍一些机器模式下常见的CSR寄存器。

主讲老师:YVONNE、Tim Zhuang、William

本文隐藏内容 登陆 后才可以浏览

Posted in RISC-V教学视频
0 0 投票数
Article Rating
订阅评论
提醒
guest
8 评论
最新
最久 最赞
内联反馈
查看所有评论
wangff
wangff
21 天 前

本堂课学习内容非常多,授课中老师们对每一个寄存器的使用方法,以及寄存器内部重要bit位的具体含义,均做了较为深入的探讨。

在听课中遇到几点问题,请老师解答一下:
1、mtvec寄存器,威廉老师在授课中提到可以实现同时支持MODE[00]和MODE[01]两种模式,该寄存器最后两位好像是提前配置好的,寄存器最后两个bit位要么为[00],要么为[01],二者只能选择一种,那么如何实现同时支持两种模式呢?
2、当mtvec寄存器的最后两位MODE[00]时,授课中的实例write_csr(mtvec,&trap_entry)语句,是将trap_entry函数的地址填入mtvec寄存器,我猜想trap_entry函数对应地址是30bit,因为mtvec寄存器的BASE只有30位,最终是将trap_entry函数对应地址赋值给BASE对应的30bit位,请问老师这样理解对吗?
3、当mtvec寄存器的最后两位MODE[01]时,授课中的实例write_csr(mtvec,&trap_entry)语句,威廉老师说此时存入mtvec寄存器的是table的首地址(table是包含中断和异常的所有入口程序形成的一张表),那么例子中pc=BASE+4*7,这个公式里面只有7是exception code,那么如何区分计算结果得到的pc地址是指向中断对应的处理程序,还是异常对应的处理程序呢,在课件的表格中“异常和中断”都有数字7,中断中的7代表machine timer interrupt,异常中的7代表Stror/AMO access fault。这里是否是通过BASE来区分呢,比如,“异常”单独有一个table表,每次是把异常table的首地址赋值给mtvec寄存器的BASE ;“中断”单独有个table表,每次把中断table的首地址赋值给mtvec寄存器的BASE?
4、当mtvec寄存器的最后两位MODE[01]时,存入mtvec寄存器的是table的首地址,威廉老师说在table内部可以连续排7个指令,而且最多写7个指令,但是mcause表中异常和中断的各类情况个数都是超过7个的,这里为何说是最多7个连续指令呢?
5、mhartid寄存器,授课中提到为0代表单核,1代表双核,2代表三核,请问这里说的单核、双核等是指的cup个数吗?
6、mscratch寄存器,授课中威廉老师提到JATG模块必须有7个32bit的存储空间,请问这7个存储空间是使用的7个通用寄存器吗?

Yvonne
管理员
19 天 前
回复给  wangff

1、mtvec寄存器,威廉老师在授课中提到可以实现同时支持MODE[00]和MODE[01]两种模式,该寄存器最后两位好像是提前配置好的,寄存器最后两个bit位要么为[00],要么为[01],二者只能选择一种,那么如何实现同时支持两种模式呢?
A:如果想要同时支持两种模式,硬件和软件设计都需要对两种模式进行支持。在软件对mtvec寄存器进行写操作的时候,一次只能选择一种模式。目前,我们的FII RISC-V CPU(FPGA 代码)只支持Mode 0,后续版本会通过修改FPGA代码和软件代码来实现对Mode 1模式的支持。

Yvonne
管理员
19 天 前
回复给  wangff

2、当mtvec寄存器的最后两位MODE[00]时,授课中的实例write_csr(mtvec,&trap_entry)语句,是将trap_entry函数的地址填入mtvec寄存器,我猜想trap_entry函数对应地址是30bit,因为mtvec寄存器的BASE只有30位,最终是将trap_entry函数对应地址赋值给BASE对应的30bit位,请问老师这样理解对吗?
A:trap_entry函数对应地址应该是32 bit, mtvec中默认跳转的地址都是4字节对齐,所以省略了2’b00,真正跳转的地址应该是{BASE,2’b00}。 BASE 对应的地址确实是30 bit的,在软件代码中会将trap_entry的地址[31:0] 中的[31:2] 送给BASE。

Yvonne
管理员
19 天 前
回复给  wangff

3、当mtvec寄存器的最后两位MODE[01]时,授课中的实例write_csr(mtvec,&trap_entry)语句,威廉老师说此时存入mtvec寄存器的是table的首地址(table是包含中断和异常的所有入口程序形成的一张表),那么例子中pc=BASE+4*7,这个公式里面只有7是exception code,那么如何区分计算结果得到的pc地址是指向中断对应的处理程序,还是异常对应的处理程序呢,在课件的表格中“异常和中断”都有数字7,中断中的7代表machine timer interrupt,异常中的7代表Stror/AMO access fault。这里是否是通过BASE来区分呢,比如,“异常”单独有一个table表,每次是把异常table的首地址赋值给mtvec寄存器的BASE ;“中断”单独有个table表,每次把中断table的首地址赋值给mtvec寄存器的BASE?
A:riscv-privileged pdf英文版
文档27页关于mtvec寄存器的定义里面说,如果选用MODE 1,所有的异常还是跳到{BASE,2’b00},中断跳转地址才会有向量偏移,比如机器模式下的定时器中断,pc=BASE+4*7。这里的PC地址不再是直接跳到中断函数地址,而是一个中断函数地址向量表。在中断函数地址向量表中再进行跳转到真实的中断处理函数地址。

Yvonne
管理员
19 天 前
回复给  wangff

4、当mtvec寄存器的最后两位MODE[01]时,存入mtvec寄存器的是table的首地址,威廉老师说在table内部可以连续排7个指令,而且最多写7个指令,但是mcause表中异常和中断的各类情况个数都是超过7个的,这里为何说是最多7个连续指令呢?
A:视频中我们举了一个使用mtvec MODE 1的例子,这里7表示的是中断类型下的机器模式定时器中断,不代表只能写7个指令。同学可以再听几次视频。我们的意思是可以将每个中断都定位到一条向量表的跳转指令上。

Yvonne
管理员
19 天 前
回复给  wangff

5、mhartid寄存器,授课中提到为0代表单核,1代表双核,2代表三核,请问这里说的单核、双核等是指的cpu个数吗?
A:实际上这里说的单核,双核,多核等都默认是每个核里只有一个线程。mhartid记录的是多少个线程(thread),而不是有多少个CPU。

Yvonne
管理员
19 天 前
回复给  wangff

6.mscratch寄存器,授课中威廉老师提到JATG模块必须有7个32bit的存储空间,请问这7个存储空间是使用的7个通用寄存器吗?
A:JTAG模块里的空间和CPU的通用寄存器是分开的,这7个存储空间不是使用的通用寄存器。详细的解释应该参考RISC-V Debug Spec 0.11英文版 Page 12 debug RAM的讲解

wangff
wangff
2 月 前

本堂课详细介绍了机器模式下常见CSR寄存器的使用方法。

机器模式下的CSR寄存器种类较多(常见14个),老师通过举例、分享经验的方式,为我们准备了一场知识盛宴。

相关链接