UT实战第四期:第三代香山(昆明湖)架构FTQ模块UT验证实战(进行中)
在验证中学习香山FTQ的微架构设计
Created Mar 18, 2025 - Last updated: Mar 18, 2025
本期验证实战任务将帮助学习香山昆明湖架构中FTQ模块的设计,FTQ是取指目标队列,在处理器前端设计中承担着重要作用,负责前端分支预测单元BPU和取指令单元IFU之间的交互,以及前端与后端之间交互。
在本次任务中,你将了解FTQ的设计,同时也会了解IFU, BPU中所涉及到的相关内容,以及学习如何使用由我们提供的验证框架进行处理器验证的工作,是一项知行结合的综合性任务。
参与
本次验证任务请基于UnityChipForXiangShan提供的验证框架完成验证工作并向该仓库提交PR。
成果提交
请fork上述UnityChipForXiangShan仓库之后完成验证代码和文档的编写,成果齐备后,向主仓库发起PR。
bug报告
请直接在UnityChipForXiangShan的仓库下使用bug report模板提issue,或者快捷点击这里。
提交bug时,请先在label中选择bug need to confirm标签。然后从label提供的四种bug分级(minor、normal、serious、critical)中选择您认为最符合的一种标签。最后,请选择您发现bug的模块,本次验证的是前端的ftq模块,可以统一打上ut_frontend.ftq标签。
成果需求
每个子任务需要提交以下成果:
验证代码:请遵照规范编写代码,方便我们进行测试和统一维护。你的代码可能涉及以下内容,它们都在规范中规定了格式:
编译脚本:目前已经提供了相应的编译脚本,但你也可以定义自己的编译脚本
测试环境:你可以提供classic和toffee两种版本的验证环境
测试用例:你需要在README.md中对如何运行你的测试用例做一定说明
验证报告:包括对环境、测试点和测试用例的介绍,复现代码所需的环境和指令,以及对测试覆盖率等衡量指标的报告。 验证报告的书写可以参考这篇教程:验证报告教程
本期任务在UnityChipForXiangShan验证框架中已经提供了初步的环境,主要为FTQ子队列和顶层的编译脚本,以及一个对FTQ子队列进行随机测试的范例,具体请参考FTQ文档中验证环境章节介绍。
任务
奖励信息
根据任务的难度和各位的完成情况,各位将能获得数额不等的奖金。此外,如果为FTQ模块找出bug并反馈确认后,有机会得到更多奖金。
任务详情
任务1. FTQ子队列
FTQ队列,是由好多个子队列共同构成的,一些子队列维护一类信息,另一些子队列维护另一类信息,相同ftqIdx索引的子队列信息共同构成一个完整的FTQ项。
在这个任务中,你需要验证FTQ几个重要子队列,主要验证其读写功能正常。
任务 | 功能点 | 描述 |
---|---|---|
FTQ子队列读写功能 | 取指目标子队列读写 | ftq_pc_mem存储来自分支预测结果的取指目标 |
重定向存储子队列读写 | ftq_redirect_mem存储来自分支预测结果的重定向信息 | |
预译码存储子队列读写 | ftq_pd_mem存储来自IFU的对指令块的预译码信息 | |
FTB项存储子队列读写 | ftb_entry_mem存储自分支预测结果中的FTB项 |
预期难度:3/10
任务2. FTQ接收BPU分支预测结果
FTQ将接收BPU的分支预测结果,存储在子队列中
任务 | 功能点 | 描述 |
---|---|---|
FTQ接收BPU分支预测结果 | BPU入队条件 | 满足允许BPU入队的条件,才能写入新的FTQ项 |
写入FTQ项 | 将分支预测结果存入FTQ各个子队列,以及状态队列中 | |
转发预测结果重定向 | 如果BPU的分支预测结果出错,需要将预测结果重定向信号转发给IFU | |
修正FTQ指针 | BPU预测结果入队,或者预测结果重定向时,会修改相应的BPU指针,以及IFU指针 |
预期难度:6/10
任务3. FTQ向IFU发送取指目标
FTQ向IFU发送取指目标,让其进行预译码
任务 | 功能点 | 描述 |
---|---|---|
FTQ向IFU发送FTQ项 | 向ICache发送取指目标 | FTQ会向ICache发送取指目标 |
向Prefetch发送取指目标 | FTQ会向Prefetch发送取指目标进行预取 | |
向IFU发送取指目标 | FTQ会向IFU发送取指目标 | |
修改命中状态队列 | 发生fallTruError时,FTQ会将状态队列设置为false hit | |
指令冲刷 | 发生预测结果重定向时,可能会冲刷掉向IFU的发送请求 | |
修改发送状态队列 | 成功向IFU执行发送请求,FTQ会将状态队列设置为sent |
预期难度:6/10
任务4. IFU向FTQ写回预译码信息
IFU将预译码信息写回FTQ预译码存储队列
任务 | 功能点 | 描述 |
---|---|---|
IFU向FTQ写回预译码信息 | 写回ftq_pd_mem | IFU预译码结果将被写入FTQ的预译码子队列 |
更新提交状态队列 | 根据写回信息中指令的有效情况更新提交状态队列 | |
综合错误 | 预译码结果得到的错误信息以及与预测结果比对得到的错误信息 |
预期难度:5/10
任务5. FTQ接收后端重定向
后端是指令的实际执行模块,根据时机执行的结果,向FTQ发送重定向信息以纠正错误
任务 | 功能点 | 描述 |
---|---|---|
FTQ接收后端重定向 | 将取指目标发给后端 | 后端需要存储来自FTQ的存储信息 |
发送FTQ最新项信息 | 发送FTQ最新项信息 |
预期难度:5/10
任务6.FTQ接收IFU重定向
除了后端,IFU也会发送重定向相关消息,和后端不同,IFU的重定向信息来自于预译码写回信息
任务 | 功能点 | 描述 |
---|---|---|
FTQ接收IFU重定向 | 生成IFU重定向信息 | IFU会根据预测译码结果生成重定向信号,并进行转发 |
生成IFU冲刷信号 | IFU的重定向会生成冲刷信号 |
预期难度:4/10
任务7. FTQ向后端发送取指目标
pc取指目标会发给后端pc mem进行存储,使其能在本地取PC
任务 | 功能点 | 描述 |
---|---|---|
FTQ向后端发送取指目标 | 将取指目标发给后端 | 后端需要存储来自FTQ的取指目标信息 |
发送FTQ最新项信息 | 发送FTQ最新项信息 |
预期难度:2/10
任务8. 执行单元修改FTQ状态队列
后端的写回信息,包括重定向信息和更新信息,实际上都是执行之后,由实际执行单元根据结果发回的
任务 | 功能点 | 描述 |
---|---|---|
执行单元修改FTQ状态队列 | 修改状态队列 | 根据后端的实际执行结果修改FTQ状态队列 |
后端重定向优先级更高 | IFU的重定向写回信息也会修改相应的状态队列,但后端重定向优先级更高 |
预期难度:2/10
任务9. 冲刷FTQ指针和状态队列
由后端或者IFU引起的重定向,需要恢复各种类型用来索引FTQ项的FtqPtr。而当重定向是由后端发起的时候,还要修改提交状态队列,说明指令已经被执行。
任务 | 功能点 | 描述 |
---|---|---|
冲刷FTQ指针和状态队列 | 冲刷FTQ指针 | 后端或者IFU发来的重定向信息会引起FTQ指针的冲刷 |
ROB提交 | 通过ROB的commit信息修改FTQ提交状态队列 |
预期难度:3/10
任务10. FTQ向BPU发送更新和重定向信息
FTQ将已提交指令的更新信息发往BPU进行训练,同时转发重定向信号。
任务 | 功能点 | 描述 |
---|---|---|
FTQ向BPU发送更新和重定向信息 | 转发重定向信息 | 转发来自IFU或者后端的重定向信号 |
提交指令块 | 判断指令块是否能够提交 | |
发送BPU更新信息 | FTQ需要向BPU发送更新信息,对其进行训练 | |
更新FTB表项 | FTQ需要对旧的FTB表项更新,转发到更新接口 |
预期难度:8/10
报名方式
请填写报名问卷参与本期任务,也欢迎加入活动官方qq群:600480230。 如有疑问可在qq群中联系群主,或联系万众一芯官方邮箱:anxu@bosc.ac.cn。