rggen-verilog 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/LICENSE +21 -0
- data/README.md +74 -0
- data/lib/rggen/verilog.rb +64 -0
- data/lib/rggen/verilog/bit_field/type.rb +85 -0
- data/lib/rggen/verilog/bit_field/type/rc_w0c_w1c_wc_woc.erb +21 -0
- data/lib/rggen/verilog/bit_field/type/rc_w0c_w1c_wc_woc.rb +40 -0
- data/lib/rggen/verilog/bit_field/type/reserved.erb +10 -0
- data/lib/rggen/verilog/bit_field/type/reserved.rb +7 -0
- data/lib/rggen/verilog/bit_field/type/ro.erb +11 -0
- data/lib/rggen/verilog/bit_field/type/ro.rb +21 -0
- data/lib/rggen/verilog/bit_field/type/rof.erb +11 -0
- data/lib/rggen/verilog/bit_field/type/rof.rb +7 -0
- data/lib/rggen/verilog/bit_field/type/rs_w0s_w1s_ws_wos.erb +19 -0
- data/lib/rggen/verilog/bit_field/type/rs_w0s_w1s_ws_wos.rb +31 -0
- data/lib/rggen/verilog/bit_field/type/rw_w1_wo_wo1.erb +16 -0
- data/lib/rggen/verilog/bit_field/type/rw_w1_wo_wo1.rb +23 -0
- data/lib/rggen/verilog/bit_field/type/rwc.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/rwc.rb +24 -0
- data/lib/rggen/verilog/bit_field/type/rwe.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/rwe.rb +24 -0
- data/lib/rggen/verilog/bit_field/type/rwl.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/rwl.rb +24 -0
- data/lib/rggen/verilog/bit_field/type/rws.erb +16 -0
- data/lib/rggen/verilog/bit_field/type/rws.rb +27 -0
- data/lib/rggen/verilog/bit_field/type/w0crs_w1crs_wcrs.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/w0crs_w1crs_wcrs.rb +20 -0
- data/lib/rggen/verilog/bit_field/type/w0src_w1src_wsrc.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/w0src_w1src_wsrc.rb +20 -0
- data/lib/rggen/verilog/bit_field/type/w0t_w1t.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/w0t_w1t.rb +19 -0
- data/lib/rggen/verilog/bit_field/type/w0trg_w1trg.erb +14 -0
- data/lib/rggen/verilog/bit_field/type/w0trg_w1trg.rb +19 -0
- data/lib/rggen/verilog/bit_field/type/wrc_wrs.erb +14 -0
- data/lib/rggen/verilog/bit_field/type/wrc_wrs.rb +13 -0
- data/lib/rggen/verilog/bit_field/verilog_top.rb +89 -0
- data/lib/rggen/verilog/component.rb +7 -0
- data/lib/rggen/verilog/factories.rb +11 -0
- data/lib/rggen/verilog/feature.rb +35 -0
- data/lib/rggen/verilog/register/type.rb +101 -0
- data/lib/rggen/verilog/register/type/default.erb +29 -0
- data/lib/rggen/verilog/register/type/external.erb +27 -0
- data/lib/rggen/verilog/register/type/external.rb +45 -0
- data/lib/rggen/verilog/register/type/indirect.erb +31 -0
- data/lib/rggen/verilog/register/type/indirect.rb +18 -0
- data/lib/rggen/verilog/register/verilog_top.rb +58 -0
- data/lib/rggen/verilog/register_block/protocol.rb +51 -0
- data/lib/rggen/verilog/register_block/protocol/apb.erb +33 -0
- data/lib/rggen/verilog/register_block/protocol/apb.rb +40 -0
- data/lib/rggen/verilog/register_block/protocol/axi4lite.erb +48 -0
- data/lib/rggen/verilog/register_block/protocol/axi4lite.rb +92 -0
- data/lib/rggen/verilog/register_block/verilog_macros.erb +4 -0
- data/lib/rggen/verilog/register_block/verilog_top.rb +104 -0
- data/lib/rggen/verilog/register_file/verilog_top.rb +30 -0
- data/lib/rggen/verilog/setup.rb +11 -0
- data/lib/rggen/verilog/utility.rb +13 -0
- data/lib/rggen/verilog/utility/local_scope.rb +15 -0
- data/lib/rggen/verilog/version.rb +7 -0
- metadata +133 -0
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            RgGen.define_list_item_feature(:bit_field, :type, [:wrc, :wrs]) do
         | 
| 4 | 
            +
              verilog do
         | 
| 5 | 
            +
                build do
         | 
| 6 | 
            +
                  output :value_out, {
         | 
| 7 | 
            +
                    name: "o_#{full_name}", width: width, array_size: array_size
         | 
| 8 | 
            +
                  }
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                main_code :bit_field, from_template: true
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| @@ -0,0 +1,89 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            RgGen.define_simple_feature(:bit_field, :verilog_top) do
         | 
| 4 | 
            +
              verilog do
         | 
| 5 | 
            +
                include RgGen::SystemVerilog::RTL::BitFieldIndex
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                export :initial_value
         | 
| 8 | 
            +
                export :value
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                build do
         | 
| 11 | 
            +
                  if parameterized_initial_value?
         | 
| 12 | 
            +
                    parameter :initial_value, {
         | 
| 13 | 
            +
                      name: initial_value_name, width: bit_field.width,
         | 
| 14 | 
            +
                      array_size: initial_value_array_size, default: initial_value_rhs
         | 
| 15 | 
            +
                    }
         | 
| 16 | 
            +
                  else
         | 
| 17 | 
            +
                    define_accessor_for_initial_value
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                main_code :register do
         | 
| 22 | 
            +
                  local_scope("g_#{bit_field.name}") do |scope|
         | 
| 23 | 
            +
                    scope.loop_size loop_size
         | 
| 24 | 
            +
                    scope.body(&method(:body_code))
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                def value(offsets = nil, width = nil)
         | 
| 29 | 
            +
                  value_lsb = bit_field.lsb(offsets&.last || local_index)
         | 
| 30 | 
            +
                  value_width = width || bit_field.width
         | 
| 31 | 
            +
                  register_value(offsets&.slice(0..-2), value_lsb, value_width)
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                private
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def register_value(offsets, lsb, width)
         | 
| 37 | 
            +
                  index = register.index(offsets || register.local_indices)
         | 
| 38 | 
            +
                  register_block.register_value[[index], lsb, width]
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def parameterized_initial_value?
         | 
| 42 | 
            +
                  bit_field.initial_value? && !bit_field.fixed_initial_value?
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                def define_accessor_for_initial_value
         | 
| 46 | 
            +
                  define_singleton_method(:initial_value) do
         | 
| 47 | 
            +
                    bit_field.initial_value? && initial_value_rhs || nil
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                def initial_value_name
         | 
| 52 | 
            +
                  "#{bit_field.full_name('_')}_initial_value".upcase
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def initial_value_array_size
         | 
| 56 | 
            +
                  bit_field.initial_value_array? && [bit_field.sequence_size] || nil
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                def initial_value_rhs
         | 
| 60 | 
            +
                  if !bit_field.initial_value_array?
         | 
| 61 | 
            +
                    sized_initial_value
         | 
| 62 | 
            +
                  elsif bit_field.fixed_initial_value?
         | 
| 63 | 
            +
                    concat(sized_initial_values)
         | 
| 64 | 
            +
                  else
         | 
| 65 | 
            +
                    repeat(bit_field.sequence_size, sized_initial_value)
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                def sized_initial_value
         | 
| 70 | 
            +
                  hex(bit_field.register_map.initial_value, bit_field.width)
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                def sized_initial_values
         | 
| 74 | 
            +
                  bit_field
         | 
| 75 | 
            +
                    .initial_values
         | 
| 76 | 
            +
                    .reverse
         | 
| 77 | 
            +
                    .map { |v| hex(v, bit_field.width) }
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                def loop_size
         | 
| 81 | 
            +
                  loop_variable = local_index
         | 
| 82 | 
            +
                  loop_variable && { loop_variable => bit_field.sequence_size }
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                def body_code(code)
         | 
| 86 | 
            +
                  bit_field.generate_code(code, :bit_field, :top_down)
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RgGen
         | 
| 4 | 
            +
              module Verilog
         | 
| 5 | 
            +
                class Feature < SystemVerilog::RTL::Feature
         | 
| 6 | 
            +
                  include Utility
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  private
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def create_variable(data_type, attributes, &block)
         | 
| 11 | 
            +
                    attributes = attributes.merge(array_format: :serialized)
         | 
| 12 | 
            +
                    super
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def create_argument(direction, attributes, &block)
         | 
| 16 | 
            +
                    attributes =
         | 
| 17 | 
            +
                      attributes
         | 
| 18 | 
            +
                        .reject { |key, _| key == :data_type }
         | 
| 19 | 
            +
                        .merge(array_format: :serialized)
         | 
| 20 | 
            +
                    super
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def create_parameter(parameter_type, attributes, &block)
         | 
| 24 | 
            +
                    attributes = attributes.merge(array_format: :serialized)
         | 
| 25 | 
            +
                    super
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  define_entity :wire, :create_variable, :variable, -> { component }
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  undef_method :interface
         | 
| 31 | 
            +
                  undef_method :interface_port
         | 
| 32 | 
            +
                  undef_method :localparam
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -0,0 +1,101 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            RgGen.define_list_feature(:register, :type) do
         | 
| 4 | 
            +
              verilog do
         | 
| 5 | 
            +
                base_feature do
         | 
| 6 | 
            +
                  include RgGen::SystemVerilog::RTL::RegisterType
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  private
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def clock
         | 
| 11 | 
            +
                    register_block.clock
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def reset
         | 
| 15 | 
            +
                    register_block.reset
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def register_valid
         | 
| 19 | 
            +
                    register_block.register_valid
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def register_access
         | 
| 23 | 
            +
                    register_block.register_access
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  def register_address
         | 
| 27 | 
            +
                    register_block.register_address
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def register_write_data
         | 
| 31 | 
            +
                    register_block.register_write_data
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def register_strobe
         | 
| 35 | 
            +
                    register_block.register_strobe
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  def register_active
         | 
| 39 | 
            +
                    register_block.register_active[[register.index]]
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  def register_ready
         | 
| 43 | 
            +
                    register_block.register_ready[[register.index]]
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  def register_status
         | 
| 47 | 
            +
                    register_block.register_status[[register.index]]
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  def register_read_data
         | 
| 51 | 
            +
                    register_block.register_read_data[[register.index]]
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  def register_value
         | 
| 55 | 
            +
                    register_block.register_value[[register.index], 0, width]
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  def bit_field_valid
         | 
| 59 | 
            +
                    register.bit_field_valid
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  def bit_field_read_mask
         | 
| 63 | 
            +
                    register.bit_field_read_mask
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  def bit_field_write_mask
         | 
| 67 | 
            +
                    register.bit_field_write_mask
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  def bit_field_write_data
         | 
| 71 | 
            +
                    register.bit_field_write_data
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  def bit_field_read_data
         | 
| 75 | 
            +
                    register.bit_field_read_data
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                  def bit_field_value
         | 
| 79 | 
            +
                    register.bit_field_value
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                default_feature do
         | 
| 84 | 
            +
                  main_code :register, from_template: File.join(__dir__, 'type', 'default.erb')
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                factory do
         | 
| 88 | 
            +
                  def target_feature_key(_configuration, register)
         | 
| 89 | 
            +
                    type = register.type
         | 
| 90 | 
            +
                    valid_type?(type) && type ||
         | 
| 91 | 
            +
                      (error "code generator for #{type} register type is not implemented")
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  private
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                  def valid_type?(type)
         | 
| 97 | 
            +
                    target_features.key?(type) || type == :default
         | 
| 98 | 
            +
                  end
         | 
| 99 | 
            +
                end
         | 
| 100 | 
            +
              end
         | 
| 101 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            rggen_default_register #(
         | 
| 2 | 
            +
              .READABLE       (<%= readable %>),
         | 
| 3 | 
            +
              .WRITABLE       (<%= writable %>),
         | 
| 4 | 
            +
              .ADDRESS_WIDTH  (<%= address_width %>),
         | 
| 5 | 
            +
              .OFFSET_ADDRESS (<%= offset_address %>),
         | 
| 6 | 
            +
              .BUS_WIDTH      (<%= bus_width %>),
         | 
| 7 | 
            +
              .DATA_WIDTH     (<%= width %>),
         | 
| 8 | 
            +
              .VALID_BITS     (<%= valid_bits %>),
         | 
| 9 | 
            +
              .REGISTER_INDEX (<%= register_index %>)
         | 
| 10 | 
            +
            ) u_register (
         | 
| 11 | 
            +
              .i_clk                  (<%= clock %>),
         | 
| 12 | 
            +
              .i_rst_n                (<%= reset %>),
         | 
| 13 | 
            +
              .i_register_valid       (<%= register_valid %>),
         | 
| 14 | 
            +
              .i_register_access      (<%= register_access %>),
         | 
| 15 | 
            +
              .i_register_address     (<%= register_address %>),
         | 
| 16 | 
            +
              .i_register_write_data  (<%= register_write_data %>),
         | 
| 17 | 
            +
              .i_register_strobe      (<%= register_strobe %>),
         | 
| 18 | 
            +
              .o_register_active      (<%= register_active %>),
         | 
| 19 | 
            +
              .o_register_ready       (<%= register_ready %>),
         | 
| 20 | 
            +
              .o_register_status      (<%= register_status %>),
         | 
| 21 | 
            +
              .o_register_read_data   (<%= register_read_data %>),
         | 
| 22 | 
            +
              .o_register_value       (<%= register_value %>),
         | 
| 23 | 
            +
              .o_bit_field_valid      (<%= bit_field_valid %>),
         | 
| 24 | 
            +
              .o_bit_field_read_mask  (<%= bit_field_read_mask %>),
         | 
| 25 | 
            +
              .o_bit_field_write_mask (<%= bit_field_write_mask %>),
         | 
| 26 | 
            +
              .o_bit_field_write_data (<%= bit_field_write_data %>),
         | 
| 27 | 
            +
              .i_bit_field_read_data  (<%= bit_field_read_data %>),
         | 
| 28 | 
            +
              .i_bit_field_value      (<%= bit_field_value %>)
         | 
| 29 | 
            +
            );
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            rggen_external_register #(
         | 
| 2 | 
            +
              .ADDRESS_WIDTH  (<%= address_width %>),
         | 
| 3 | 
            +
              .BUS_WIDTH      (<%= bus_width %>),
         | 
| 4 | 
            +
              .START_ADDRESS  (<%= start_address %>),
         | 
| 5 | 
            +
              .END_ADDRESS    (<%= end_address %>)
         | 
| 6 | 
            +
            ) u_register (
         | 
| 7 | 
            +
              .i_clk                  (<%= clock %>),
         | 
| 8 | 
            +
              .i_rst_n                (<%= reset %>),
         | 
| 9 | 
            +
              .i_register_valid       (<%= register_valid %>),
         | 
| 10 | 
            +
              .i_register_access      (<%= register_access %>),
         | 
| 11 | 
            +
              .i_register_address     (<%= register_address %>),
         | 
| 12 | 
            +
              .i_register_write_data  (<%= register_write_data %>),
         | 
| 13 | 
            +
              .i_register_strobe      (<%= register_strobe %>),
         | 
| 14 | 
            +
              .o_register_active      (<%= register_active %>),
         | 
| 15 | 
            +
              .o_register_ready       (<%= register_ready %>),
         | 
| 16 | 
            +
              .o_register_status      (<%= register_status %>),
         | 
| 17 | 
            +
              .o_register_read_data   (<%= register_read_data %>),
         | 
| 18 | 
            +
              .o_register_value       (<%= register_value %>),
         | 
| 19 | 
            +
              .o_external_valid       (<%= external_valid %>),
         | 
| 20 | 
            +
              .o_external_access      (<%= external_access %>),
         | 
| 21 | 
            +
              .o_external_address     (<%= external_address %>),
         | 
| 22 | 
            +
              .o_external_data        (<%= external_write_data %>),
         | 
| 23 | 
            +
              .o_external_strobe      (<%= external_strobe %>),
         | 
| 24 | 
            +
              .i_external_ready       (<%= external_ready %>),
         | 
| 25 | 
            +
              .i_external_status      (<%= external_status %>),
         | 
| 26 | 
            +
              .i_external_data        (<%= external_read_data %>)
         | 
| 27 | 
            +
            );
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            RgGen.define_list_item_feature(:register, :type, :external) do
         | 
| 4 | 
            +
              verilog do
         | 
| 5 | 
            +
                build do
         | 
| 6 | 
            +
                  output :external_valid, {
         | 
| 7 | 
            +
                    name: "o_#{register.name}_valid", width: 1
         | 
| 8 | 
            +
                  }
         | 
| 9 | 
            +
                  output :external_access, {
         | 
| 10 | 
            +
                    name: "o_#{register.name}_access", width: 2
         | 
| 11 | 
            +
                  }
         | 
| 12 | 
            +
                  output :external_address, {
         | 
| 13 | 
            +
                    name: "o_#{register.name}_address", width: address_width
         | 
| 14 | 
            +
                  }
         | 
| 15 | 
            +
                  output :external_write_data, {
         | 
| 16 | 
            +
                    name: "o_#{register.name}_data", width: bus_width
         | 
| 17 | 
            +
                  }
         | 
| 18 | 
            +
                  output :external_strobe, {
         | 
| 19 | 
            +
                    name: "o_#{register.name}_strobe", width: bus_width / 8
         | 
| 20 | 
            +
                  }
         | 
| 21 | 
            +
                  input :external_ready, {
         | 
| 22 | 
            +
                    name: "i_#{register.name}_ready", width: 1
         | 
| 23 | 
            +
                  }
         | 
| 24 | 
            +
                  input :external_status, {
         | 
| 25 | 
            +
                    name: "i_#{register.name}_status", width: 2
         | 
| 26 | 
            +
                  }
         | 
| 27 | 
            +
                  input :external_read_data, {
         | 
| 28 | 
            +
                    name: "i_#{register.name}_data", width: bus_width
         | 
| 29 | 
            +
                  }
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                main_code :register, from_template: true
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                private
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def start_address
         | 
| 37 | 
            +
                  hex(register.offset_address, address_width)
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                def end_address
         | 
| 41 | 
            +
                  address = register.offset_address + register.byte_size - 1
         | 
| 42 | 
            +
                  hex(address, address_width)
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            rggen_indirect_register #(
         | 
| 2 | 
            +
              .READABLE             (<%= readable %>),
         | 
| 3 | 
            +
              .WRITABLE             (<%= writable %>),
         | 
| 4 | 
            +
              .ADDRESS_WIDTH        (<%= address_width %>),
         | 
| 5 | 
            +
              .OFFSET_ADDRESS       (<%= offset_address %>),
         | 
| 6 | 
            +
              .BUS_WIDTH            (<%= bus_width %>),
         | 
| 7 | 
            +
              .DATA_WIDTH           (<%= width %>),
         | 
| 8 | 
            +
              .VALID_BITS           (<%= valid_bits %>),
         | 
| 9 | 
            +
              .INDIRECT_INDEX_WIDTH (<%= index_width %>),
         | 
| 10 | 
            +
              .INDIRECT_INDEX_VALUE (<%= concat(index_values) %>)
         | 
| 11 | 
            +
            ) u_register (
         | 
| 12 | 
            +
              .i_clk                  (<%= clock %>),
         | 
| 13 | 
            +
              .i_rst_n                (<%= reset %>),
         | 
| 14 | 
            +
              .i_register_valid       (<%= register_valid %>),
         | 
| 15 | 
            +
              .i_register_access      (<%= register_access %>),
         | 
| 16 | 
            +
              .i_register_address     (<%= register_address %>),
         | 
| 17 | 
            +
              .i_register_write_data  (<%= register_write_data %>),
         | 
| 18 | 
            +
              .i_register_strobe      (<%= register_strobe %>),
         | 
| 19 | 
            +
              .o_register_active      (<%= register_active %>),
         | 
| 20 | 
            +
              .o_register_ready       (<%= register_ready %>),
         | 
| 21 | 
            +
              .o_register_status      (<%= register_status %>),
         | 
| 22 | 
            +
              .o_register_read_data   (<%= register_read_data %>),
         | 
| 23 | 
            +
              .o_register_value       (<%= register_value %>),
         | 
| 24 | 
            +
              .i_indirect_index       (<%= indirect_index %>),
         | 
| 25 | 
            +
              .o_bit_field_valid      (<%= bit_field_valid %>),
         | 
| 26 | 
            +
              .o_bit_field_read_mask  (<%= bit_field_read_mask %>),
         | 
| 27 | 
            +
              .o_bit_field_write_mask (<%= bit_field_write_mask %>),
         | 
| 28 | 
            +
              .o_bit_field_write_data (<%= bit_field_write_data %>),
         | 
| 29 | 
            +
              .i_bit_field_read_data  (<%= bit_field_read_data %>),
         | 
| 30 | 
            +
              .i_bit_field_value      (<%= bit_field_value %>)
         | 
| 31 | 
            +
            );
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            RgGen.define_list_item_feature(:register, :type, :indirect) do
         | 
| 4 | 
            +
              verilog do
         | 
| 5 | 
            +
                include RgGen::SystemVerilog::RTL::IndirectIndex
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                build do
         | 
| 8 | 
            +
                  wire :indirect_index, {
         | 
| 9 | 
            +
                    name: 'w_indirect_index', width: index_width
         | 
| 10 | 
            +
                  }
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                main_code :register do |code|
         | 
| 14 | 
            +
                  code << indirect_index_assignment << nl
         | 
| 15 | 
            +
                  code << process_template
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            RgGen.define_simple_feature(:register, :verilog_top) do
         | 
| 4 | 
            +
              verilog do
         | 
| 5 | 
            +
                include RgGen::SystemVerilog::RTL::RegisterIndex
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                build do
         | 
| 8 | 
            +
                  unless register.bit_fields.empty?
         | 
| 9 | 
            +
                    wire :bit_field_valid, {
         | 
| 10 | 
            +
                      name: 'w_bit_field_valid', width: 1
         | 
| 11 | 
            +
                    }
         | 
| 12 | 
            +
                    wire :bit_field_read_mask, {
         | 
| 13 | 
            +
                      name: 'w_bit_field_read_mask', width: register.width
         | 
| 14 | 
            +
                    }
         | 
| 15 | 
            +
                    wire :bit_field_write_mask, {
         | 
| 16 | 
            +
                      name: 'w_bit_field_write_mask', width: register.width
         | 
| 17 | 
            +
                    }
         | 
| 18 | 
            +
                    wire :bit_field_write_data, {
         | 
| 19 | 
            +
                      name: 'w_bit_field_write_data', width: register.width
         | 
| 20 | 
            +
                    }
         | 
| 21 | 
            +
                    wire :bit_field_read_data, {
         | 
| 22 | 
            +
                      name: 'w_bit_field_read_data', width: register.width
         | 
| 23 | 
            +
                    }
         | 
| 24 | 
            +
                    wire :bit_field_value, {
         | 
| 25 | 
            +
                      name: 'w_bit_field_value', width: register.width
         | 
| 26 | 
            +
                    }
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                main_code :register_file do
         | 
| 31 | 
            +
                  local_scope("g_#{register.name}") do |scope|
         | 
| 32 | 
            +
                    scope.top_scope top_scope?
         | 
| 33 | 
            +
                    scope.loop_size loop_size
         | 
| 34 | 
            +
                    scope.variables variables
         | 
| 35 | 
            +
                    scope.body(&method(:body_code))
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                private
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def top_scope?
         | 
| 42 | 
            +
                  register_file.nil?
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                def loop_size
         | 
| 46 | 
            +
                  (register.array? || nil) &&
         | 
| 47 | 
            +
                    local_loop_variables.zip(register.array_size).to_h
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                def variables
         | 
| 51 | 
            +
                  register.declarations[:variable]
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                def body_code(code)
         | 
| 55 | 
            +
                  register.generate_code(code, :register, :top_down)
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         |