●インストール

・インストールできたか確認する

次のように表示されれば,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

コメントを残す