●インストール
・インストールできたか確認する
次のように表示されれば,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