<RVV设计的艺术> RISC-V V扩展index load指令分析与实现

目录

一、指令原理

二、VLSU在系统中的位置

三、优化方向

四、index load实现电路

五、总结


一、指令原理

index load、index store指令用于在较大范围内完成数据gather/scatter的操作,实现难度很大。

图1、RVV0.9版本的index load指令格式

<RVV设计的艺术> RISC-V V扩展index load指令分析与实现_第1张图片

图2、index load与index store指令功能示意图

index load、index store指令在VLSU(vector load store unit)中实现。

二、VLSU在系统中的位置

VLSU外接cache,内接VRF(vector register file),完成外部memory到内部register的数据搬入搬出功能。

此处之所以要特别指出VLSU的前后级关系,是因为两侧不同的访问方式,会影响到VLSU指令的实现机制。例如某种指令实现方式在多port cache结构时效率很高,但是在单port cache结构时效率则很低。

<RVV设计的艺术> RISC-V V扩展index load指令分析与实现_第2张图片

图3、VLSU在系统中的位置示意图

如上的红色箭头表示VLSU与cache的接口,此处假设该cache为单port,访问颗粒度为64 byte(一条cacheline),无论hit或miss都可pipeline接受访问请求,访问非阻塞。

三、优化方向

对于上述的cache访问模型,主要的优化思路就是将位于同一64byte内部的访问请求合成一次cache访问。

 如下图所示,对于总共需要完成的8次访问,经过请求合并后,只需要访问三次(访问基地址为0、64、128)。

<RVV设计的艺术> RISC-V V扩展index load指令分析与实现_第3张图片
图4、访问请求合并示意图

四、index load实现电路

上面的优化电路实际上分为2个部分:1、地址的合并;2、读数据返回后的映射重排;

经过细致的分析发现电路规模将随着地址合并范围的增大指数增加,工程上实现为64byte范围内的地址无重复访问。此时经过RISC-V V扩展指令可知,最多存在32个不重复的访问地址。

<RVV设计的艺术> RISC-V V扩展index load指令分析与实现_第4张图片

 图5、index load实现电路pipeline

pipeline0实现从VRF读取index,并转换为64byte对齐的地址及其offset,此pipeline核心逻辑为32选1(RISC-V ISA的32个寄存器);

pipeline1实现32个地址重复消除,此处只需要标记出那些地址是重复的即可;

pipeline2实现从32个地址中选出一个地址发往AXI;

随后进入AXI的memory访问,直到数据返回进入pipeline3;

pipeline3实现AXI读取数据的warp,此处利用pipeline1存储的offset信息,核心逻辑为64套64选1电路(每byte都可以映射到任意位置,共64byte全交叉映射);

注意:上述的图中第一级与最后一级没有算在pipeline内,但是他们也是寄存器

五、总结

本文对RISC-V V扩展中的index load进行了分析,并给出了一种index load的实现电路供参考。由于index store与index load类似,没有赘述。

你可能感兴趣的:(RVV设计的艺术,risc-v,verilog,cpu,芯片)