Tenstorrentが、オープンソースのRISC-VベクトルプロセッサOcelotを公開した。
オープンソースでまともに動きそうなRISC-Vベクトルプロセッサは初めて見たので、早速試行していこう。Chipyard環境で公開されているのもありがたい。
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
うーん、何も表示することなく終わってしまった。トレースファイルを出力するためにはもう少しいろいろいじらないとダメかな。