本期验证实战任务将帮助学习香山昆明湖架构中FTQ模块的设计,FTQ是取指目标队列,在处理器前端设计中承担着重要作用,负责前端分支预测单元BPU和取指令单元IFU之间的交互,以及前端与后端之间交互。

在本次任务中,你将了解FTQ的设计,同时也会了解IFU, BPU中所涉及到的相关内容,以及学习如何使用由我们提供的验证框架进行处理器验证的工作,是一项知行结合的综合性任务。

FTQ验证文档:更详细地为你介绍关于FTQ的内容

参与

本次验证任务请基于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标签。

成果需求

每个子任务需要提交以下成果:

  1. 验证代码:请遵照规范编写代码,方便我们进行测试和统一维护。你的代码可能涉及以下内容,它们都在规范中规定了格式:

    • 编译脚本:目前已经提供了相应的编译脚本,但你也可以定义自己的编译脚本

    • 测试环境:你可以提供classic和toffee两种版本的验证环境

    • 测试用例:你需要在README.md中对如何运行你的测试用例做一定说明

  2. 验证报告:包括对环境、测试点和测试用例的介绍,复现代码所需的环境和指令,以及对测试覆盖率等衡量指标的报告。 验证报告的书写可以参考这篇教程:验证报告教程

本期任务在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_memIFU预译码结果将被写入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。