Vengineerの妄想

人生を妄想しています。

RISC-V Vector Extension な ara を覗いてみた

# はじめに

RISC-V Vector Extension な Vector Unit である Ara の中身を覗てみました。

  • Ara is a vector unit working as a coprocessor for the CVA6 core. It supports the RISC-V Vector Extension, version 0.10.

github.com

ブロック図

hardware/src/ara_soc.sv の中身を図示しました。

Ara は、RISC-V CPU core (arina や CVA6) とのインターフェース(acc_XXX)を持っています。

module ara import ara_pkg::*; #(
    // RVV Parameters
    parameter  int           unsigned NrLanes      = 0,                          // Number of parallel vector lanes.
    // Support for floating-point data types
    parameter  fpu_support_e          FPUSupport   = FPUSupportHalfSingleDouble,
    // AXI Interface
    parameter  int           unsigned AxiDataWidth = 0,
    parameter  int           unsigned AxiAddrWidth = 0,
    parameter  type                   axi_ar_t     = logic,
    parameter  type                   axi_r_t      = logic,
    parameter  type                   axi_aw_t     = logic,
    parameter  type                   axi_w_t      = logic,
    parameter  type                   axi_b_t      = logic,
    parameter  type                   axi_req_t    = logic,
    parameter  type                   axi_resp_t   = logic,
    // Dependant parameters. DO NOT CHANGE!
    // Ara has NrLanes + 3 processing elements: each one of the lanes, the vector load unit, the
    // vector store unit, the slide unit, and the mask unit.
    localparam int           unsigned NrPEs        = NrLanes + 4
  ) (
    // Clock and Reset
    input  logic              clk_i,
    input  logic              rst_ni,
    // Scan chain
    input  logic              scan_enable_i,
    input  logic              scan_data_i,
    output logic              scan_data_o,
    // Interface with Ariane
    input  accelerator_req_t  acc_req_i,
    input  logic              acc_req_valid_i,
    output logic              acc_req_ready_o,
    output accelerator_resp_t acc_resp_o,
    output logic              acc_resp_valid_o,
    input  logic              acc_resp_ready_i,
    // AXI interface
    output axi_req_t          axi_req_o,
    input  axi_resp_t         axi_resp_i
  );

SoCモデルなので、RISC-V Core と Ara は、axi_mux 経由で axi_xbar に接続しています。

axi_xbar には、

が接続しています。

テストベンチ

hardware/tb/ara_testharness.svの中で、

  • ara_soc
  • mock_uart

が接続されています。

入出力は、

  • input clk_i
  • input rst_ni
  • output [63:0] exit_o

です。

トップテストベンチは、Verilator と QuestSim は、別。

Verilator用 ara_tb.cpp

hardware/tb/verilator/ara_tb.cppの中で、Verilator用のトップテストベンチを構築しています。

Ara の内部構造

Ara hardware/src/ara.svの内部構成は下記のようになっています。

左上のレイアウト図は、

論文 : A “New Ara” for Vector Computing: An Open Source Highly Efficient RISC-V V 1.0 Vector Processor Design の中の図を引用しています。この論文では、Vector Extensionの仕様が V0.5な Ara を Vector Extensionの仕様を V1.0 にした New Ara の評価のようです。

RISC-V CPU Core からの命令を ara_dispatcher で受け、対応するユニット (lane: Vector Unit, vlsu: Vector Load/Store Unit、sldu: Slide Unit、masku: Mask Unit) に処理を依頼します。タイミング制御は、ara_sequencer が行っています。

おわりに

RISC-VなGPGPUのVortexについて調べていたので、なんとなく、こんな感じで動くんですね。という感じでした。

関連ブログ: vengineer.hatenablog.com