Rocket之加速器

RoCC简介

Rocket Custom Coprocessor

riscv-tools

  • 由于custom指令并不是标准指令集的一部分,所以最新的risc-tools(汇编器)不支持直接写custom0指令。
  • riscv-tools还是为custom指令预留了opcode。
  • 可以参考这里。直接将custom指令转换成二进制。核心代码如下:
#define XCUSTOM(x, rd, rs1, rs2, funct)         \
  XCUSTOM_OPCODE(x)                   |         \
  (rd                   << (7))       |         \
  (0x3                  << (7+5))     |         \
  ((rd != 0) & 1        << (7+5+2))   |         \
  (rs1                  << (7+5+3))   |         \
  (rs2                  << (7+5+3+5)) |         \
  (EXTRACT(funct, 7, 0) << (7+5+3+5+5))

#define ROCC_INSTRUCTION_RAW_R_R_R(x, rd, rs1, rs2, funct)      \
  .word XCUSTOM(x, ## rd, ## rs1, ## rs2, funct)
// .word 可以理解为在当前地址位置放置一条指令,汇编器不对其进行处理

pk

在Rocket处理器有一个寄存器mstatus,有一个XS,只有为非0时,才会执行自定义指令。
可以通过修改pk解决这个问题,参考这里
核心修改代码如下:

// fpga-zynq/rocket-chip/riscv-tools/riscv-pk/machine/minit.c : mstatus_init()
if (supports_extension('X'))
	set_csr(mstatus, (MSTATUS_XS & (MSTATUS_XS >> 1)));

具体操作如下:

cd fpga-zynq/rocket-chip/riscv-tools/riscv-pk
git apply rocket-rocc-examples/patches/riscv-pk.patch
mkdir build
cd build
../configure --prefix=$RISCV/riscv64-unknown-elf --host=riscv64-unknown-elf
make
make install
scp pk root@192.168.1.5:/home/root

加速器

fpga-zynq

修改位置:fpga-zynq/common/src/main/scala/Configs.scala

class RoccExampleConfig extends Config(
  new WithBootROM ++ new freechips.rocketchip.system.RoccExampleConfig)
class RoccZynqConfig extends Config(new WithZynqAdapter ++ new RoccExampleConfig)
class RoccZynqFPGAConfig extends Config(new WithoutTLMonitors ++ new RoccZynqConfig)

执行命令

cd zedboard
make rocket CONFIG=RoccZynqFPGAConfig
make project CONFIG=RoccZynqFPGAConfig
// 之后用vivado生成bit流

测试

测试样例

https://github.com/seldridge/rocket-rocc-examples/blob/master/pk/accumulator.c

测试结果

在这里插入图片描述

参考文献

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值