●インストール
・インストールできたか確認する
次のように表示されれば,RgGenが正しくインストールされている
$ export RGGEN_PLUGINS=rggen-verilog:rggen-veryl:rggen-vhdl
$ rggen --verbose-version
RgGen 0.34
- rggen-core 0.34.0
- rggen-default-register-map 0.34.0
- rggen-sv-rtl 0.34.0
- rggen-sv-ral 0.34.0
- rggen-c-header 0.6.0
- rggen-markdown 0.27.0
- rggen-spreadsheet-loader 0.26.0
- rggen-verilog 0.12.0
- rggen-veryl 0.2.0
- rggen-vhdl 0.11.0
・RgGenのコンテナ・イメージが提供されている
コンテナを使ってRgGenを実行するためにスクリプトが用意されている.次のコマンドで実行できる
$ wget https://raw.githubusercontent.com/rggen/rggen-docker/master/exe/rggen-docker
$ chmod +x rggen-docker
$ ./rggen-docker --verbose-version
RgGen 0.34
- rggen-core 0.34.0
- rggen-default-register-map 0.34.0
- rggen-sv-rtl 0.34.0
- rggen-sv-ral 0.34.0
- rggen-c-header 0.6.0
- rggen-markdown 0.27.0
- rggen-spreadsheet-loader 0.26.0
- rggen-verilog 0.12.0
- rggen-veryl 0.2.0
- rggen-vhdl 0.11.0
●解説
●レジスタ(register) ▶indirect型のレジスタについて
indirect型のレジスタはアドレスに追加して指定されたビット・フィールドを,アクセスの際の識別子として使います.識別子のビット・フィールドに値が指定されている場合,そのビット・フィールドが指定した値のときにそのレジスタにアクセスできます.また,識別子のビット・フィールドに値が指定されていない場合,そのビット・フィールドは配列状レジスタの配列インデックスとして機能します.
右のリストの①にindirect型レジスタの例を示します.FOO.BAR_0とBAZ.QUX_1ビット・フィールドは,配列状レジスタのインデックスとして使われます.FOO.BAR_0が1で,BAZ.QUX_1が2の場合,配列状レジスタの要素[1][2]にアクセスできます.
右のリストの②の例では,FOO.BAR_0は配列状レジスタのインデックスとして機能し,BAZ.QUX_1が1のときにこのレジスタにアクセスできます.また,indirect型のレジスタで識別子としてBAZ.QUX_1の値が0の場合,これらのレジスタは区別可能です.従って,これらのレジスタに同じオフセット・アドレスを指定できます.
size: [2, 3] ①
indirect index
FOO.BAR_0 bit field
BAZ.QUX_1 bit field
size: [2] ②
indirect index
FOO.BAR_0 bit field
BAZ.QUX_1 bit field 値 1
●ビットフィールド(bit_field)
誌面で解説したビットフィールドの設定例を次に示します.
register {
# ビット位置[7:0]にrw型のビット・フィールドを配置
bit_field {
name 'foo'; bit_assignment lsb: 0,width: 8
type :rw; initial_value 0
}
# ビット位置[35:32]/[43:40]/[51:48]/[59:56]にrw型のビット・フィールドを配置
# 64ビット以内であればbus_widthを超える配置も可能
bit_field {
name 'bar'; bit_assignment lsb: 32, width: 4, sequence_size: 4, step: 8
type :rw, initial_value 1
}
}
シミュレーション用にコンパイルする例
生成したRTLコードと共通モジュールを一緒にコンパイルするには右のリストのようにします.
$ vlogan -full64 -sverilog -f ${RGGEN_SV_RTL_ROOT}/compile.f uart_csr.sv
Verylの設定
HDLとしてVerylを使う場合,プロジェクト設定ファイル(Veryl.toml)の[dependencies]に,リポジトリを追加します.
[dependencies]
"https://github.com/rggen/rggen-veryl-rtl" = "0.2.0"
●プラグインが読み込めるか確認する
$ rggen --plugin ./lib/rggen/riscv.rb --verbose-version
RgGen 0.34
- rggen-core 0.34.0
- rggen-default-register-map 0.34.0
- rggen-sv-rtl 0.34.0
- rggen-sv-ral 0.34.0
- rggen-c-header 0.6.0
- rggen-markdown 0.27.0
- rggen-spreadsheet-loader 0.26.0
- rggen-riscv 0.1.0
●
・各HDL向けにプラグインが用意されている
使用するHDLに合わせて,GitHubからリポジトリをクローンし,環境変数を設定する.
$ git clone https://github.com/rggen/rggen-sv-rtl.git ①SystemVerilog
$ export RGGEN_SV_RTL_ROOT=`pwd`/rggen-sv-rtl
$ git clone https://github.com/rggen/rggen-verilog-rtl.git ②Verilog
$ export RGGEN_VERILOG_RTL_ROOT=`pwd`/rggen-verilog-rtl
$ git clone https://github.com/rggen/rggen-vhdl-rtl.git ③VHDL
$ export RGGEN_VHDL_RTL_ROOT=`pwd`/rggen-vhdl-rtl
④シミュレーション用にコンパイルする例
$ vlogan -full64 -sverilog -f ${RGGEN_SV_RTL_ROOT}/compile.f uart_csr.sv
・RgGenとRISC-Vはアドレスの単位が違う
rggenコマンドを実行するものの,アドレスがワード・アドレスのままなのでエラーが出る
$ rggen --load-only --plugin ./lib/rggen/riscv.rb -c ./csr/riscv_csr_xlen32.yaml ./csr/riscv_csr_m_leve.rb
[SourceError] offset address is not aligned with bus width(32): 0x305 -- ./csr/riscv_csr_m_leve.rb:8:in 'block (3 levels) in RgGen::Core::InputBase::InputData#load_file'
●共通モジュールのGitHubリポジトリ
SystemVerilog共通モジュール
https://github.com/rggen/rggen-sv-rtl
Verilog共通モジュール
https://github.com/rggen/rggen-verilog-rtl
Veryl共通モジュール
https://github.com/rggen/rggen-veryl-rtl
VHDL共通モジュール
https://github.com/rggen/rggen-vhdl-rtl
対応したい場合は,各HDL用のコード生成プラグインの実装が参考になると思います.
- Verilog
- https://github.com/rggen/rggen-verilog/blob/master/lib/rggen/verilog/rtl/register_block/protocol/apb.rb
- Veryl
- https://github.com/rggen/rggen-veryl/blob/master/lib/rggen/veryl/register_block/protocol/apb.rb
- VHDL
- https://github.com/rggen/rggen-vhdl/blob/master/lib/rggen/vhdl/register_block/protocol/apb.rb