FrontendTrigger

FrontendTrigger子模块

该子模块的主要作用是在前端设置硬件断点和检查。

该模块的输入pc有一个隐含条件,那就是这个pc是通过ftq传递的startAddr计算出来的。

FrontendTrigger功能介绍

断点设置和断点检查

在IFU的FrontendTrigger模块里共4个Trigger,编号为0,1,6,8,每个Trigger的配置信息(断点类型、匹配地址等)保存在tdata寄存器中。

当软件向CSR寄存器tselect、tdata1/2写入特定的值时,CSR会向IFU发送tUpdate请求,更新FrontendTrigger内的tdata寄存器中的配置信息。 目前前端的Trigger仅可以配置成PC断点(mcontrol(tdata1)寄存器的select位为0;当select=1时,该Trigger将永远不会命中,且不会产生异常)。

在取指时,IFU的F3流水级会向FrontendTrigger模块发起查询并在同一周期得到结果。后者会对取指块内每一条指令在每一个Trigger上做检查, 当指令的PC和tdata2寄存器内容的关系满足mcontrol的match位所指示的关系(香山支持match位为0、2、3,对应等于、大于、小于)时, 该指令会被标记为Trigger命中,随着执行在后端产生断点异常,进入M-Mode或调试模式。

链式断点

根据RISCV的debug spec,香山实现的是mcontrol6。

前端的0、6、8号Trigger支持Chain功能。 当它们对应的Chain位被置时,只有当该Trigger和编号在它后面一位的Trigger同时命中,且timing配置相同时(在最新的手册中,这一要求已被删除),处理器才会产生异常。其中可以和6,8号trigger实现chain功能的7,9号trigger在后端访存部件中。

FrontendTrigger 接口说明

设计上并没有提供一个或一组对外的接口来查询某个断点的状态,因此,要在测试中检查断点状态,要么需要检查内部信号的情况(仓库中提供的构建脚本已经暴露了所有内部信号),要么通过具体执行过程中,断点的触发情况来判定。

输入接口

主要分为控制接口和执行信息(目前执行信息只有pc)

控制接口 io_frontendTrigger

本接口存储了frontendTrigger的控制信息,包含以下信号/信号组:

debugMode

当前是否处于debug模式下

tEnableVec

对FrontendTrigger的每个断点,指示其是否有效。

tUpdate

更新断点的控制信息,包含以下信号/信号组:

valid:此次更新是否有效/是否更新。

bits_addr:此次更新的是哪个断点(0~3)

bits_tdata_action:断点触发条件达成后的行为

bits_tdata_chain:断点是否链式传导

bits_tdata_matchType:断点匹配类型(等于、大于、小于三种)

bits_tdata_select:目前为止,select为0时为pc断点

bits_tdata_tdata2:用于和PC比较的基准值

triggerCanRaiseBpExp

trigger是否可以引起异常

pc

pc有一个隐含条件,就是16条指令的pc必定是连续的

输出接口

triggered:16条指令的断点触发情况。

FrontEndTrigger 测试点和功能点

功能点1 设置断点和断点检查

FrontEndTrigger目前仅支持设置PC断点,这通过设置断点的tdata1寄存器的select位为0实现。 同时,tdata2寄存器的mcontrol位负责设置指令PC和tdata2寄存器的地址需要满足的关系, 关系满足时,该指令会被标记为trigger命中。

所以,基于以上功能描述,我们需要测试:

select位为1时,断点是否永远不会触发。

select位为0时,当PC和tdata2的数据的关系满足tdata2的match位时,是否会设置断点。

select位为0时,当PC和tdata2的数据的关系不满足tdata2的match位时,断点是否一定不会触发。

综上所述,我们在这一功能点设计的测试点如下:

序号 名称 描述
1.1 select1判定 给定tdata1的select位为1,随机构造其它输入,检查断点是否没有触发
1.2.1 select0关系匹配判定 给定tdata1的select位为0,构造PC与tdata2数据的关系同tdata2的match位匹配的输入,检查断点是否触发
1.2.2 select0关系不匹配判定 给定tdata1的select位为0,构造PC与tdata2数据的关系同tdata2的match位不匹配的输入,检查断点是否触发

功能点2 链式断点

当某一个trigger的chain位被置后,当其后的trigger的chain位未设置,且两个trigger均命中并且两个trigger的timing相同时,后一个trigger才会触发。

对0号trigger,不需要考虑链式的情况

由此,我们可以设置几种测试点:

序号 名称 描述
2.1 chain位测试 对每个trigger,在满足PC断点触发条件的情况下,设置chain位,检查断点是否一定不触发。
2.2.1 未命中测试 对两个trigger,仅设置前一个trigger的chain位且两trigger的timing位相同,设置后一个trigger命中而前一个未命中,检查后一个trigger是否一定不触发。
2.2.2 命中测试 对两个trigger,仅设置前一个trigger的chain位且两trigger的timing位相同且均命中,检查后一个trigger是否触发。

测试点汇总

序号 功能 名称 描述
1.1 断点设置和检查 select1判定 给定tdata1的select位为1,随机构造其它输入,检查断点是否没有触发
1.2.1 断点设置和检查 select0关系匹配判定 给定tdata1的select位为0,构造PC与tdata2数据的关系同tdata2的match位匹配的输入,检查断点是否触发
1.2.2 断点设置和检查 select0关系不匹配判定 给定tdata1的select位为0,构造PC与tdata2数据的关系同tdata2的match位不匹配的输入,检查断点是否触发
2.1 链式断点 chain位测试 对每个trigger,在满足PC断点触发条件的情况下,设置chain位,检查断点是否一定不触发
2.2.1 链式断点 未命中测试 对两个trigger,仅设置前一个trigger的chain位,设置后一个trigger命中而前一个未命中,检查后一个trigger是否一定不触发
2.2.2 链式断点 命中测试 对两个trigger,仅设置前一个trigger的chain位,检查后一个trigger是否触发
最后修改 February 22, 2025: ifu top rtl build scripts modify (#76) (5520758)