FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

TenstorrentのオープンソースRISC-Vベクトルプロセッサ実装Ocelotを試す

Tenstorrentが、オープンソースRISC-VベクトルプロセッサOcelotを公開した。

github.com

オープンソースでまともに動きそうなRISC-Vベクトルプロセッサは初めて見たので、早速試行していこう。Chipyard環境で公開されているのもありがたい。

github.com

Chipyard上でのビルドはやりなれているので、早速ビルド環境を構築していく。

git clone https://github.com/tenstorrent/chipyard.git
cd chipyard
./scripts/init-submodules-no-riscv-tools-nolog.sh
unset LD_LIBRARY_PATH
./scripts/build-toolchains.sh riscv-tools --ignore-qemu
source ./env.sh
source ./env-riscv-tools.sh
cd sims/verilator
make CONFIG=MediumBoomVecConfig debug

で、いくつかエラーが出たので環境を修正してく。まずはVerilatorの環境エラー。

diff --git a/sims/verilator/Makefile b/sims/verilator/Makefile
index a1186acc..b7197c50 100644
--- a/sims/verilator/Makefile
+++ b/sims/verilator/Makefile
@@ -122,7 +122,8 @@ VERILATOR_OPT_FLAGS ?= \
        --x-assign fast \
        --x-initial fast \
        --output-split 10000 \
-       --output-split-cfuncs 100
+       --output-split-cfuncs 100 \
+       +incdir+${build_dir}

 # default flags added for external IP (cva6/NVDLA)
 VERILOG_IP_VERILATOR_FLAGS := \
  • /home/ubuntu/work/chipyard/chipyard/sims/verilator/generated-src/chipyard.TestHarness.MediumBoomVecConfig/tt_vec_mul_dp.sv 下のalways分がコンパイルエラーとなるので、コメントアウト
// See LICENSE.TT for license details.
module tt_vec_mul_dp #(parameter
   VLEN=256
)
(
                     input [VLEN/8-1:0][63:0]  i_sized_src2_0a,
                     input [VLEN/8-1:0][63:0]  i_sized_src1_0a,
                     input                     i_issgn_0a,
                     input                     i_issgnsrc2_0a,
                     input                     i_mulen_0a,
                     input i_clk ,

                     output logic [VLEN/8-1:0][128:0] o_sum_1a
                     );

   always_ff @(posedge i_clk) begin
      if (i_mulen_0a) begin
         for(int i=VLEN/16;i<VLEN/8; i++) o_sum_1a[i][ 16:0] <= {{ 9{i_issgn_0a && i_sized_src1_0a[i][ 7]}}, i_sized_src1_0a[i][ 7:0]} * {{ 9{i_issgnsrc2_0a && i_sized_src2_0a[i][ 7]}}, i_sized_src2_0a[i][ 7:0]};
         for(int i=VLEN/32;i<VLEN/16;i++) o_sum_1a[i][ 32:0] <= {{17{i_issgn_0a && i_sized_src1_0a[i][15]}}, i_sized_src1_0a[i][15:0]} * {{17{i_issgnsrc2_0a && i_sized_src2_0a[i][15]}}, i_sized_src2_0a[i][15:0]};
         for(int i=VLEN/64;i<VLEN/32;i++) o_sum_1a[i][ 64:0] <= {{33{i_issgn_0a && i_sized_src1_0a[i][31]}}, i_sized_src1_0a[i][31:0]} * {{33{i_issgnsrc2_0a && i_sized_src2_0a[i][31]}}, i_sized_src2_0a[i][31:0]};
         for(int i=0;      i<VLEN/64;i++) o_sum_1a[i][128:0] <= {{65{i_issgn_0a && i_sized_src1_0a[i][63]}}, i_sized_src1_0a[i][63:0]} * {{65{i_issgnsrc2_0a && i_sized_src2_0a[i][63]}}, i_sized_src2_0a[i][63:0]};
      end
   end

   // always_comb begin
   //    for(int i=VLEN/16;i<VLEN/8; i++) o_sum_1a[i][128:17] = '0;
   //    for(int i=VLEN/32;i<VLEN/16;i++) o_sum_1a[i][128:33] = '0;
   //    for(int i=VLEN/64;i<VLEN/32;i++) o_sum_1a[i][128:65] = '0;
   // end

endmodule

これで上記のmakeを再実行すると、Verilatorのバイナリが生成できた。一応動作確認のためのプログラムを実行してく。

./simulator-chipyard-MediumBoomVecConfig-debug +verbose ../../tests/rvv/rvv_int_arithmetic_1_3828467586_2
using random seed 1660873097
This emulator compiled with JTAG Remote Bitbang client. To enable, use +jtag_rbb_enable=1.
Listening on port 45647
[UART] UART0 is here (stdin/stdout).
*** PASSED *** Completed after 24517 cycles

うーん、何も表示することなく終わってしまった。トレースファイルを出力するためにはもう少しいろいろいじらないとダメかな。