1. 程式人生 > >Rocket之加速器

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 [email protected]:/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

測試結果

在這裡插入圖片描述

參考文獻