branch - 我可以在两级流水线 RISC 架构中实现分支目标缓冲区吗?
问题描述
我正在尝试在 PIC16 等低级微控制器中实现 BTB。我不知道这是否可行。所以想要你的建议。
谢谢。
解决方案
基本的 BTB 相当简单,相当于
BTBEntry be = BTB[curAddr & BTBBitMask];
nextFetch = be.addr;
它作为电子设备实现,获取较低的 curAddr 位并将它们输入 BTB 存储器并获取下一个地址。
当分支被解析时,结果将被写回 BTB。
查找可以与内存获取并行完成,并且必须更快,因为必须完成额外的步骤。
struct BTBEntry {
int addr;
int curAddr; // upper address bits.
}
为了避免由于存储的地址与 curAddr 不对应而在程序中随机跳转,我们还需要检查我们正在查找的地址是否用于正确的分支。
if ((curAddr & ~BTBBitMask) == be.curAddr)
nextFetch = be.addr; // found in the BTB
else
nextFetch = curAddr + instrutionSize; // not found, take next instruction
因此,如果 BTB 足够小并且使用的总时间少于指令取指,则可以这样做。但效果可能没有您想要的那么大。
推荐阅读
- java - 将数据推送到 BigQuery 中的现有表
- c# - Openxml SDK CreateFromTemplate 示例
- webots - 精准转动机器人
- python - 如何在 AngularJS 网站上使用 Python 中的 Selenium 迭代和保存动态表中的信息
- ruby-on-rails - 如何获取当前的设计用户?
- openstreetmap - openstreetmaps 从 apache 迁移到 litespeed 网络服务器
- bash - 在 sed 中使用日期变量
- android - 三星 Galaxy Api 23 第 6 版上 Android 的 WRITE_EXTERNAL_STORAGE 权限问题
- docker-compose - Logstash 未从文件输入中读取
- javascript - 递归处理 JSON 数组以查找数组中所有对象的公共值