前回の記事では、riscv-opcodesを使ってRISC-Vデコーダを自動生成する方法について試行した。
しかし、毎回以下のような長いコマンドを手動で実行するのは面倒なので、 build-riscv.sh に統合してしまおう。
cat riscv/riscv-opcodes-latest/extensions/rv_i \
riscv/riscv-opcodes-latest/extensions/rv64_i \
riscv/riscv-opcodes-latest/extensions/rv_m \
riscv/riscv-opcodes-latest/extensions/rv64_m \
riscv/riscv-opcodes-latest/extensions/rv_a \
riscv/riscv-opcodes-latest/extensions/rv64_a \
riscv/riscv-opcodes-latest/extensions/rv_f \
riscv/riscv-opcodes-latest/extensions/rv64_f \
riscv/riscv-opcodes-latest/extensions/rv_d \
riscv/riscv-opcodes-latest/extensions/rv64_d \
riscv/riscv-opcodes-latest/extensions/rv_c \
riscv/riscv-opcodes-latest/extensions/rv64_c \
riscv/riscv-opcodes-latest/extensions/rv64_zba \
riscv/riscv-opcodes-latest/extensions/rv64_zbb \
riscv/riscv-opcodes-latest/extensions/rv64_zbs \
riscv/riscv-opcodes-latest/extensions/rv_v | \
python3 riscv/scripts/generate_riscv_decoder.py \
riscv/riscv-opcodes-latest/arg_lut.csv \
/dev/stdin > \
decoder_lib/riscv_decoder_generated.h
build-riscv.sh への統合
SniperSimのRISC-Vビルドスクリプトriscv/build-riscv.shは、以下のような構成になっている:
セクション1: 前提条件セットアップ 1a) Sniper Pin設定 1b) riscv-tools 1c) rv8 simulator 1d) Speckle セクション2: コンパイル 2a) Sniper 2b) riscv-tools 2c) rv8 2d) Speckle セクション3-4: SIFTトレース生成と実行
build-riscv.shのセクション2の先頭に、デコーダ生成処理を追加した:
### 2) Compiling Binaries
# 2a) Generate RISC-V Decoder Header
echo "Generating RISC-V Decoder Header..."
cd $SNIPER_ROOT
if [ -f riscv/scripts/generate_riscv_decoder.py ] && [ -f riscv/riscv-opcodes-latest/arg_lut.csv ]; then
echo " Generating decoder_lib/riscv_decoder_generated.h..."
cat riscv/riscv-opcodes-latest/extensions/rv_i \
riscv/riscv-opcodes-latest/extensions/rv64_i \
riscv/riscv-opcodes-latest/extensions/rv_m \
riscv/riscv-opcodes-latest/extensions/rv64_m \
riscv/riscv-opcodes-latest/extensions/rv_a \
riscv/riscv-opcodes-latest/extensions/rv64_a \
riscv/riscv-opcodes-latest/extensions/rv_f \
riscv/riscv-opcodes-latest/extensions/rv64_f \
riscv/riscv-opcodes-latest/extensions/rv_d \
riscv/riscv-opcodes-latest/extensions/rv64_d \
riscv/riscv-opcodes-latest/extensions/rv_c \
riscv/riscv-opcodes-latest/extensions/rv64_c \
riscv/riscv-opcodes-latest/extensions/rv64_zba \
riscv/riscv-opcodes-latest/extensions/rv64_zbb \
riscv/riscv-opcodes-latest/extensions/rv64_zbs \
riscv/riscv-opcodes-latest/extensions/rv_v | \
python3 riscv/scripts/generate_riscv_decoder.py \
riscv/riscv-opcodes-latest/arg_lut.csv \
/dev/stdin > \
decoder_lib/riscv_decoder_generated.h
if [ $? -eq 0 ]; then
INST_COUNT=$(grep -c "rv_op_" decoder_lib/riscv_decoder_generated.h | head -1)
echo " ✓ Generated decoder with ~${INST_COUNT} instructions"
else
echo " ✗ Decoder generation failed!"
exit 1
fi
else
echo " Warning: Decoder generation skipped (missing files)"
fi
echo "####################################################################################"
# 2b) Sniper
echo "Compiling Sniper..."
cd $SNIPER_ROOT
make # TODO: Parallel builds currently broken
デコーダ生成部分だけを単独でテストした結果:
=== 生成結果 === 7584 decoder_lib/riscv_decoder_generated.h 575個の命令が定義されました
7,584行のヘッダーファイルに、575個のRISC-V命令(I/M/A/F/D/C/Zba/Zbb/Zbs/V拡張)が正しく定義されている。