●インストール

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

次のように表示されれば,RgGenが正しくインストールされている

$ export RGGEN_PLUGINS=rggen-verilog:rggen-veryl:rggen-vhdl
$ rggen --verbose-version
RgGen 0.33
  - rggen-core 0.33.1
  - rggen-default-register-map 0.33.1
  - rggen-sv-rtl 0.33.1
省略
  - rggen-veryl 0.1.0
  - rggen-vhdl 0.10.1

・RgGenのコンテナ・イメージが提供されている

コンテナを使ってRgGenを実行するためにスクリプトが用意されている.次のコマンドで実行できる

$ wget https://raw.githubusercontent.com/rggen/rggen-docker/master/exe/rggen-docker
$ chmod +x rggen-docker
$ ./rggen-docker --verbose-version
RgGen 0.33
  - rggen-core 0.33.1
  - rggen-default-register-map 0.33.1
  - rggen-sv-rtl 0.33.1
省略
  - rggen-veryl 0.1.0
  - rggen-vhdl 0.10.1

●解説

●レジスタ(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
  }
}

●生成物の使用

 RgGenが生成するRTLコードを次に示します.

generate if (1) begin : g_rbr
  rggen_bit_field_if #(32) bit_field_if();
  logic indirect_index;
  `rggen_tie_off_unused_signals(32, 32'h000000ff, bit_field_if)
  assign indirect_index = {register_if[5].value[7+:1]};
  rggen_indirect_register #(
    .READABLE             (1),
    .WRITABLE             (0),
    .ADDRESS_WIDTH        (5),
    .OFFSET_ADDRESS       (5'h00),
    .BUS_WIDTH            (32),
    .DATA_WIDTH           (32),
    .VALUE_WIDTH          (32),
    .INDIRECT_INDEX_WIDTH (1),
    .INDIRECT_INDEX_VALUE ({1'h0})
  ) u_register (
    .i_clk            (i_clk),
    .i_rst_n          (i_rst_n),
    .register_if      (register_if[0]),
    .i_indirect_index (indirect_index),
    .bit_field_if     (bit_field_if)
  );
  if (1) begin : g_rbr
    rggen_bit_field_if #(8) bit_field_sub_if();
    `rggen_connect_bit_field_if(bit_field_if, bit_field_sub_if, 0, 8)
    rggen_bit_field #(
      .WIDTH              (8),
      .STORAGE            (0),
      .EXTERNAL_READ_DATA (1),
      .TRIGGER            (1)
    ) u_bit_field (
      .i_clk              (i_clk),
      .i_rst_n            (i_rst_n),
      .bit_field_if       (bit_field_sub_if),
      .o_write_trigger    (),
      .o_read_trigger     (o_rbr_read_trigger),
      .i_sw_write_enable  ('0),
      .i_hw_write_enable  ('0),
      .i_hw_write_data    ('0),
      .i_hw_set           ('0),
      .i_hw_clear         ('0),
      .i_value            (i_rbr),
      .i_mask             ('1),
      .o_value            (),
      .o_value_unmasked   ()
    );
  end
end endgenerate
シミュレーション用にコンパイルする例

 生成した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.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 --plugin ./lib/rggen/riscv.rb --load-only -c ./csr/riscv_csr_xlen32.yaml ./csr/riscv_csr_m_leve.rb
[RegisterMapError] offset address is not aligned with bus width(32): 0x305 -- ./csr/riscv_csr_m_leve.rb:8:in `block (3 levels) in 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

コメントを残す