rggen 0.8.2 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CODE_OF_CONDUCT.md +54 -29
- data/{LICENSE.txt → LICENSE} +1 -1
- data/README.md +65 -56
- data/lib/rggen.rb +4 -63
- data/lib/rggen/built_in.rb +53 -0
- data/lib/rggen/built_in/bit_field/bit_assignment.rb +108 -0
- data/lib/rggen/built_in/bit_field/comment.rb +16 -0
- data/lib/rggen/built_in/bit_field/initial_value.rb +45 -0
- data/lib/rggen/built_in/bit_field/name.rb +39 -0
- data/lib/rggen/built_in/bit_field/reference.rb +100 -0
- data/lib/rggen/built_in/bit_field/sv_rtl_top.rb +87 -0
- data/lib/rggen/built_in/bit_field/type.rb +279 -0
- data/lib/rggen/built_in/bit_field/type/rc_w0c_w1c.erb +15 -0
- data/lib/rggen/built_in/bit_field/type/rc_w0c_w1c.rb +68 -0
- data/lib/rggen/built_in/bit_field/type/reserved.erb +3 -0
- data/lib/rggen/built_in/bit_field/type/reserved.rb +16 -0
- data/lib/rggen/built_in/bit_field/type/ro.erb +6 -0
- data/lib/rggen/built_in/bit_field/type/ro.rb +34 -0
- data/lib/rggen/built_in/bit_field/type/rof.erb +6 -0
- data/lib/rggen/built_in/bit_field/type/rof.rb +17 -0
- data/lib/rggen/built_in/bit_field/type/rs_w0s_w1s.erb +13 -0
- data/lib/rggen/built_in/bit_field/type/rs_w0s_w1s.rb +52 -0
- data/lib/rggen/built_in/bit_field/type/rw_wo.erb +9 -0
- data/lib/rggen/built_in/bit_field/type/rw_wo.rb +33 -0
- data/lib/rggen/built_in/bit_field/type/rwe_rwl.erb +14 -0
- data/lib/rggen/built_in/bit_field/type/rwe_rwl.rb +39 -0
- data/lib/rggen/built_in/global/address_width.rb +32 -0
- data/lib/rggen/built_in/global/array_port_format.rb +19 -0
- data/lib/rggen/built_in/global/bus_width.rb +33 -0
- data/lib/rggen/built_in/global/fold_sv_interface_port.rb +24 -0
- data/lib/rggen/built_in/register/name.rb +34 -0
- data/lib/rggen/built_in/register/offset_address.rb +96 -0
- data/lib/rggen/built_in/register/size.rb +49 -0
- data/lib/rggen/built_in/register/sv_rtl_top.rb +82 -0
- data/lib/rggen/built_in/register/type.rb +374 -0
- data/lib/rggen/built_in/register/type/default_sv_ral.erb +8 -0
- data/lib/rggen/built_in/register/type/default_sv_rtl.erb +15 -0
- data/lib/rggen/built_in/register/type/external.erb +11 -0
- data/lib/rggen/built_in/register/type/external.rb +141 -0
- data/lib/rggen/built_in/register/type/indirect.rb +329 -0
- data/lib/rggen/built_in/register/type/indirect_sv_ral.erb +13 -0
- data/lib/rggen/built_in/register/type/indirect_sv_rtl.erb +17 -0
- data/lib/rggen/built_in/register_block/byte_size.rb +59 -0
- data/lib/rggen/built_in/register_block/name.rb +36 -0
- data/lib/rggen/built_in/register_block/protocol.rb +71 -0
- data/lib/rggen/built_in/register_block/protocol/apb.erb +10 -0
- data/lib/rggen/built_in/register_block/protocol/apb.rb +113 -0
- data/lib/rggen/built_in/register_block/protocol/axi4lite.erb +11 -0
- data/lib/rggen/built_in/register_block/protocol/axi4lite.rb +167 -0
- data/lib/rggen/built_in/register_block/sv_ral_block_model.erb +11 -0
- data/lib/rggen/built_in/register_block/sv_ral_package.rb +58 -0
- data/lib/rggen/built_in/register_block/sv_rtl_macros.erb +9 -0
- data/lib/rggen/built_in/register_block/sv_rtl_top.rb +87 -0
- data/lib/rggen/built_in/version.rb +7 -0
- data/lib/rggen/default_setup_file.rb +6 -0
- data/lib/rggen/setup/default.rb +26 -0
- data/lib/rggen/version.rb +5 -4
- data/sample/block_0.rb +85 -0
- data/sample/block_0.sv +601 -0
- data/sample/block_0.xlsx +0 -0
- data/sample/block_0.yml +94 -0
- data/sample/block_0_ral_pkg.sv +174 -0
- data/sample/block_1.rb +22 -0
- data/sample/block_1.sv +136 -0
- data/sample/block_1.xlsx +0 -0
- data/sample/block_1.yml +26 -0
- data/sample/block_1_ral_pkg.sv +68 -0
- data/sample/config.json +5 -0
- data/sample/config.yml +3 -0
- metadata +96 -270
- data/bin/rggen +0 -6
- data/c_header/LICENSE +0 -21
- data/c_header/rggen.h +0 -17
- data/lib/rggen/base/component.rb +0 -31
- data/lib/rggen/base/component_factory.rb +0 -53
- data/lib/rggen/base/hierarchical_accessors.rb +0 -87
- data/lib/rggen/base/hierarchical_item_accessors.rb +0 -79
- data/lib/rggen/base/internal_struct.rb +0 -28
- data/lib/rggen/base/item.rb +0 -35
- data/lib/rggen/base/item_factory.rb +0 -25
- data/lib/rggen/builder/builder.rb +0 -69
- data/lib/rggen/builder/category.rb +0 -63
- data/lib/rggen/builder/component_entry.rb +0 -50
- data/lib/rggen/builder/component_store.rb +0 -42
- data/lib/rggen/builder/input_component_store.rb +0 -25
- data/lib/rggen/builder/item_store.rb +0 -89
- data/lib/rggen/builder/list_item_entry.rb +0 -81
- data/lib/rggen/builder/output_component_store.rb +0 -13
- data/lib/rggen/builder/simple_item_entry.rb +0 -33
- data/lib/rggen/builtins.rb +0 -55
- data/lib/rggen/builtins/bit_field/bit_assignment.rb +0 -39
- data/lib/rggen/builtins/bit_field/field_model.rb +0 -38
- data/lib/rggen/builtins/bit_field/initial_value.rb +0 -36
- data/lib/rggen/builtins/bit_field/name.rb +0 -26
- data/lib/rggen/builtins/bit_field/reference.rb +0 -40
- data/lib/rggen/builtins/bit_field/rtl_top.rb +0 -11
- data/lib/rggen/builtins/bit_field/type.rb +0 -244
- data/lib/rggen/builtins/bit_field/types/reserved.erb +0 -6
- data/lib/rggen/builtins/bit_field/types/reserved.rb +0 -18
- data/lib/rggen/builtins/bit_field/types/ro.erb +0 -6
- data/lib/rggen/builtins/bit_field/types/ro.rb +0 -22
- data/lib/rggen/builtins/bit_field/types/rw.erb +0 -9
- data/lib/rggen/builtins/bit_field/types/rw.rb +0 -23
- data/lib/rggen/builtins/bit_field/types/rwl_rwe.erb +0 -11
- data/lib/rggen/builtins/bit_field/types/rwl_rwe.rb +0 -54
- data/lib/rggen/builtins/bit_field/types/w0c_w1c.erb +0 -12
- data/lib/rggen/builtins/bit_field/types/w0c_w1c.rb +0 -33
- data/lib/rggen/builtins/bit_field/types/w0s_w1s.erb +0 -12
- data/lib/rggen/builtins/bit_field/types/w0s_w1s.rb +0 -33
- data/lib/rggen/builtins/bit_field/types/wo.rb +0 -5
- data/lib/rggen/builtins/global/address_width.rb +0 -17
- data/lib/rggen/builtins/global/array_port_format.rb +0 -15
- data/lib/rggen/builtins/global/data_width.rb +0 -20
- data/lib/rggen/builtins/global/unfold_sv_interface_port.rb +0 -22
- data/lib/rggen/builtins/loaders/configuration/json_loader.rb +0 -7
- data/lib/rggen/builtins/loaders/configuration/yaml_loader.rb +0 -7
- data/lib/rggen/builtins/loaders/register_map/csv_loader.rb +0 -12
- data/lib/rggen/builtins/loaders/register_map/xls_loader.rb +0 -17
- data/lib/rggen/builtins/loaders/register_map/xlsx_ods_loader.rb +0 -21
- data/lib/rggen/builtins/register/array.rb +0 -30
- data/lib/rggen/builtins/register/constructor.rb +0 -17
- data/lib/rggen/builtins/register/field_model_creator.rb +0 -14
- data/lib/rggen/builtins/register/indirect_index_configurator.rb +0 -54
- data/lib/rggen/builtins/register/name.rb +0 -26
- data/lib/rggen/builtins/register/offset_address.rb +0 -61
- data/lib/rggen/builtins/register/reg_model.rb +0 -107
- data/lib/rggen/builtins/register/rtl_top.rb +0 -68
- data/lib/rggen/builtins/register/sub_block_model.rb +0 -34
- data/lib/rggen/builtins/register/type.rb +0 -283
- data/lib/rggen/builtins/register/types/default.erb +0 -10
- data/lib/rggen/builtins/register/types/external.erb +0 -11
- data/lib/rggen/builtins/register/types/external.rb +0 -77
- data/lib/rggen/builtins/register/types/indirect.erb +0 -13
- data/lib/rggen/builtins/register/types/indirect.rb +0 -175
- data/lib/rggen/builtins/register/uniqueness_validator.rb +0 -51
- data/lib/rggen/builtins/register_block/address_struct.rb +0 -56
- data/lib/rggen/builtins/register_block/base_address.rb +0 -64
- data/lib/rggen/builtins/register_block/block_model.rb +0 -20
- data/lib/rggen/builtins/register_block/byte_size.rb +0 -37
- data/lib/rggen/builtins/register_block/c_header_file.rb +0 -15
- data/lib/rggen/builtins/register_block/clock_reset.rb +0 -8
- data/lib/rggen/builtins/register_block/constructor.rb +0 -14
- data/lib/rggen/builtins/register_block/default_map_creator.rb +0 -39
- data/lib/rggen/builtins/register_block/host_if.rb +0 -64
- data/lib/rggen/builtins/register_block/host_ifs/apb.erb +0 -10
- data/lib/rggen/builtins/register_block/host_ifs/apb.rb +0 -64
- data/lib/rggen/builtins/register_block/host_ifs/axi4lite.erb +0 -11
- data/lib/rggen/builtins/register_block/host_ifs/axi4lite.rb +0 -93
- data/lib/rggen/builtins/register_block/name.rb +0 -26
- data/lib/rggen/builtins/register_block/ral_package.rb +0 -24
- data/lib/rggen/builtins/register_block/rtl_top.rb +0 -38
- data/lib/rggen/builtins/register_block/sub_model_creator.rb +0 -14
- data/lib/rggen/commands.rb +0 -23
- data/lib/rggen/core_components.rb +0 -54
- data/lib/rggen/core_components/c_header/item.rb +0 -8
- data/lib/rggen/core_components/c_header/setup.rb +0 -19
- data/lib/rggen/core_components/c_utility.rb +0 -19
- data/lib/rggen/core_components/c_utility/data_structure_definition.rb +0 -60
- data/lib/rggen/core_components/c_utility/source_file.rb +0 -10
- data/lib/rggen/core_components/c_utility/variable_declaration.rb +0 -35
- data/lib/rggen/core_components/code_utility.rb +0 -56
- data/lib/rggen/core_components/code_utility/code_block.rb +0 -72
- data/lib/rggen/core_components/code_utility/line.rb +0 -28
- data/lib/rggen/core_components/code_utility/source_file.rb +0 -97
- data/lib/rggen/core_components/configuration/configuration_factory.rb +0 -23
- data/lib/rggen/core_components/configuration/item.rb +0 -11
- data/lib/rggen/core_components/configuration/item_factory.rb +0 -20
- data/lib/rggen/core_components/configuration/raise_error.rb +0 -11
- data/lib/rggen/core_components/configuration/setup.rb +0 -14
- data/lib/rggen/core_components/erb_engine.rb +0 -15
- data/lib/rggen/core_components/ral/component.rb +0 -24
- data/lib/rggen/core_components/ral/item.rb +0 -59
- data/lib/rggen/core_components/ral/setup.rb +0 -19
- data/lib/rggen/core_components/register_map/bit_field_factory.rb +0 -11
- data/lib/rggen/core_components/register_map/component.rb +0 -15
- data/lib/rggen/core_components/register_map/component_factory.rb +0 -9
- data/lib/rggen/core_components/register_map/generic_map.rb +0 -80
- data/lib/rggen/core_components/register_map/item.rb +0 -26
- data/lib/rggen/core_components/register_map/item_factory.rb +0 -26
- data/lib/rggen/core_components/register_map/loader.rb +0 -11
- data/lib/rggen/core_components/register_map/raise_error.rb +0 -17
- data/lib/rggen/core_components/register_map/register_block_factory.rb +0 -29
- data/lib/rggen/core_components/register_map/register_factory.rb +0 -18
- data/lib/rggen/core_components/register_map/register_map_factory.rb +0 -18
- data/lib/rggen/core_components/register_map/setup.rb +0 -33
- data/lib/rggen/core_components/rtl/component.rb +0 -24
- data/lib/rggen/core_components/rtl/item.rb +0 -82
- data/lib/rggen/core_components/rtl/setup.rb +0 -19
- data/lib/rggen/core_components/verilog_utility.rb +0 -88
- data/lib/rggen/core_components/verilog_utility/class_definition.rb +0 -56
- data/lib/rggen/core_components/verilog_utility/identifier.rb +0 -78
- data/lib/rggen/core_components/verilog_utility/interface_instance.rb +0 -37
- data/lib/rggen/core_components/verilog_utility/interface_port.rb +0 -33
- data/lib/rggen/core_components/verilog_utility/local_scope.rb +0 -75
- data/lib/rggen/core_components/verilog_utility/module_definition.rb +0 -82
- data/lib/rggen/core_components/verilog_utility/package_definition.rb +0 -57
- data/lib/rggen/core_components/verilog_utility/source_file.rb +0 -10
- data/lib/rggen/core_components/verilog_utility/structure_definition.rb +0 -51
- data/lib/rggen/core_components/verilog_utility/subroutine_definition.rb +0 -41
- data/lib/rggen/core_components/verilog_utility/variable.rb +0 -115
- data/lib/rggen/core_extensions/array.rb +0 -9
- data/lib/rggen/core_extensions/facets.rb +0 -22
- data/lib/rggen/core_extensions/forwardable.rb +0 -49
- data/lib/rggen/core_extensions/integer.rb +0 -5
- data/lib/rggen/core_extensions/math.rb +0 -7
- data/lib/rggen/core_extensions/roo.rb +0 -17
- data/lib/rggen/exceptions.rb +0 -28
- data/lib/rggen/generator.rb +0 -67
- data/lib/rggen/input_base/component.rb +0 -28
- data/lib/rggen/input_base/component_factory.rb +0 -58
- data/lib/rggen/input_base/item.rb +0 -171
- data/lib/rggen/input_base/item_factory.rb +0 -13
- data/lib/rggen/input_base/loader.rb +0 -23
- data/lib/rggen/input_base/regexp_patterns.rb +0 -29
- data/lib/rggen/option_switches.rb +0 -60
- data/lib/rggen/options.rb +0 -97
- data/lib/rggen/output_base/code_generator.rb +0 -36
- data/lib/rggen/output_base/component.rb +0 -78
- data/lib/rggen/output_base/component_factory.rb +0 -32
- data/lib/rggen/output_base/file_writer.rb +0 -36
- data/lib/rggen/output_base/item.rb +0 -110
- data/lib/rggen/output_base/item_factory.rb +0 -9
- data/lib/rggen/output_base/template_engine.rb +0 -24
- data/lib/rggen/rggen_home.rb +0 -3
- data/ral/LICENSE +0 -21
- data/ral/compile.f +0 -2
- data/ral/rggen_ral_block.svh +0 -83
- data/ral/rggen_ral_field.svh +0 -47
- data/ral/rggen_ral_field_rwl_rwe.svh +0 -158
- data/ral/rggen_ral_indirect_reg.svh +0 -193
- data/ral/rggen_ral_macros.svh +0 -27
- data/ral/rggen_ral_map.svh +0 -124
- data/ral/rggen_ral_pkg.sv +0 -15
- data/ral/rggen_ral_reg.svh +0 -88
- data/rtl/LICENSE +0 -21
- data/rtl/compile.f +0 -18
- data/rtl/rggen_address_decoder.sv +0 -23
- data/rtl/rggen_apb_if.sv +0 -41
- data/rtl/rggen_axi4lite_if.sv +0 -68
- data/rtl/rggen_bit_field_if.sv +0 -28
- data/rtl/rggen_bit_field_ro.sv +0 -9
- data/rtl/rggen_bit_field_rw.sv +0 -25
- data/rtl/rggen_bit_field_rwl_rwe.sv +0 -29
- data/rtl/rggen_bit_field_w01s_w01c.sv +0 -55
- data/rtl/rggen_bus_if.sv +0 -43
- data/rtl/rggen_bus_splitter.sv +0 -86
- data/rtl/rggen_default_register.sv +0 -15
- data/rtl/rggen_external_register.sv +0 -83
- data/rtl/rggen_host_if_apb.sv +0 -29
- data/rtl/rggen_host_if_axi4lite.sv +0 -161
- data/rtl/rggen_indirect_register.sv +0 -21
- data/rtl/rggen_register_base.sv +0 -57
- data/rtl/rggen_register_if.sv +0 -42
- data/rtl/rggen_rtl_pkg.sv +0 -23
- data/sample/LICENSE +0 -21
- data/sample/sample.csv +0 -21
- data/sample/sample.json +0 -6
- data/sample/sample.xls +0 -0
- data/sample/sample.xlsx +0 -0
- data/sample/sample.yaml +0 -4
- data/sample/sample_0.h +0 -17
- data/sample/sample_0.sv +0 -402
- data/sample/sample_0_ral_pkg.sv +0 -145
- data/sample/sample_1.h +0 -9
- data/sample/sample_1.sv +0 -128
- data/sample/sample_1_ral_pkg.sv +0 -56
- data/sample/sample_setup.rb +0 -24
- data/setup/default.rb +0 -14
@@ -0,0 +1,13 @@
|
|
1
|
+
function new(string name);
|
2
|
+
super.new(name, <%= register.width%>, 0);
|
3
|
+
endfunction
|
4
|
+
function void build();
|
5
|
+
<% field_model_constructors.each do |constructor| %>
|
6
|
+
<%= constructor %>
|
7
|
+
<% end%>
|
8
|
+
endfunction
|
9
|
+
function void setup_index_fields();
|
10
|
+
<% index_properties.each do |reg_name, field_name, value| %>
|
11
|
+
setup_index_field("<%= reg_name %>", "<%= field_name%>", <%= value %>);
|
12
|
+
<% end %>
|
13
|
+
endfunction
|
@@ -0,0 +1,17 @@
|
|
1
|
+
rggen_indirect_register #(
|
2
|
+
.READABLE (<%= readable %>),
|
3
|
+
.WRITABLE (<%= writable %>),
|
4
|
+
.ADDRESS_WIDTH (<%= address_width %>),
|
5
|
+
.OFFSET_ADDRESS (<%= offset_address %>),
|
6
|
+
.BUS_WIDTH (<%= configuration.bus_width %>),
|
7
|
+
.DATA_WIDTH (<%= register.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 (<%= register_block.clock %>),
|
13
|
+
.i_rst_n (<%= register_block.reset %>),
|
14
|
+
.register_if (<%= register_if %>),
|
15
|
+
.i_indirect_index (<%= indirect_index %>),
|
16
|
+
.bit_field_if (<%= register.bit_field_if %>)
|
17
|
+
);
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register_block, :byte_size) do
|
4
|
+
register_map do
|
5
|
+
property :byte_size
|
6
|
+
property :local_address_width
|
7
|
+
|
8
|
+
build do |value|
|
9
|
+
@byte_size =
|
10
|
+
begin
|
11
|
+
Integer(value)
|
12
|
+
rescue ArgumentError, TypeError
|
13
|
+
error "cannot convert #{value.inspect} into byte size"
|
14
|
+
end
|
15
|
+
@local_address_width = (@byte_size - 1).bit_length
|
16
|
+
end
|
17
|
+
|
18
|
+
verify(:feature) do
|
19
|
+
error_condition { !byte_size }
|
20
|
+
message { 'no byte size is given' }
|
21
|
+
end
|
22
|
+
|
23
|
+
verify(:feature) do
|
24
|
+
error_condition { !byte_size.positive? }
|
25
|
+
message do
|
26
|
+
"non positive value is not allowed for byte size: #{byte_size}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
verify(:feature) do
|
31
|
+
error_condition { byte_size > max_byte_size }
|
32
|
+
message do
|
33
|
+
'input byte size is greater than maximum byte size: ' \
|
34
|
+
"input byte size #{byte_size} maximum byte size #{max_byte_size}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
verify(:feature) do
|
39
|
+
error_condition { (byte_size % byte_width).positive? }
|
40
|
+
message do
|
41
|
+
"byte size is not aligned with bus width(#{bus_width}): #{byte_size}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def max_byte_size
|
48
|
+
2**configuration.address_width
|
49
|
+
end
|
50
|
+
|
51
|
+
def byte_width
|
52
|
+
configuration.byte_width
|
53
|
+
end
|
54
|
+
|
55
|
+
def bus_width
|
56
|
+
configuration.bus_width
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register_block, :name) do
|
4
|
+
register_map do
|
5
|
+
property :name
|
6
|
+
|
7
|
+
input_pattern variable_name
|
8
|
+
|
9
|
+
build do |value|
|
10
|
+
@name =
|
11
|
+
if pattern_matched?
|
12
|
+
match_data.to_s
|
13
|
+
else
|
14
|
+
error "illegal input value for register block name: #{value.inspect}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
verify(:feature) do
|
19
|
+
error_condition { !name }
|
20
|
+
message { 'no register block name is given' }
|
21
|
+
end
|
22
|
+
|
23
|
+
verify(:feature) do
|
24
|
+
error_condition { duplicated_name? }
|
25
|
+
message { "duplicated register block name: #{name}" }
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def duplicated_name?
|
31
|
+
register_map
|
32
|
+
.register_blocks
|
33
|
+
.any? { |register_block| register_block.name == name }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_feature(:register_block, :protocol) do
|
4
|
+
shared_context do
|
5
|
+
def feature_registry(registry = nil)
|
6
|
+
@registry = registry if registry
|
7
|
+
@registry
|
8
|
+
end
|
9
|
+
|
10
|
+
def available_protocols
|
11
|
+
feature_registry
|
12
|
+
.enabled_features(:protocol)
|
13
|
+
.select(&method(:valid_protocol?))
|
14
|
+
end
|
15
|
+
|
16
|
+
def valid_protocol?(protocol)
|
17
|
+
feature_registry.feature?(:protocol, protocol)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
configuration do
|
22
|
+
base_feature do
|
23
|
+
property :protocol
|
24
|
+
build { |protocol| @protocol = protocol }
|
25
|
+
end
|
26
|
+
|
27
|
+
default_feature do
|
28
|
+
end
|
29
|
+
|
30
|
+
factory do
|
31
|
+
convert_value do |value, position|
|
32
|
+
protocol = find_protocol(value)
|
33
|
+
protocol ||
|
34
|
+
(error "unknown protocol: #{value.inspect}", position)
|
35
|
+
end
|
36
|
+
|
37
|
+
default_value do |position|
|
38
|
+
default_protocol ||
|
39
|
+
(error 'no protocols are available', position)
|
40
|
+
end
|
41
|
+
|
42
|
+
def select_feature(data)
|
43
|
+
target_features[data.value]
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def find_protocol(value)
|
49
|
+
available_protocols.find(&value.to_sym.method(:casecmp?))
|
50
|
+
end
|
51
|
+
|
52
|
+
def default_protocol
|
53
|
+
available_protocols.first
|
54
|
+
end
|
55
|
+
|
56
|
+
def available_protocols
|
57
|
+
@available_protocols ||= shared_context.available_protocols
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
sv_rtl do
|
63
|
+
shared_context.feature_registry(registry)
|
64
|
+
|
65
|
+
factory do
|
66
|
+
def select_feature(configuration, _register_block)
|
67
|
+
target_features[configuration.protocol]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
rggen_apb_adapter #(
|
2
|
+
.ADDRESS_WIDTH (<%= register_block.local_address_width %>),
|
3
|
+
.BUS_WIDTH (<%= configuration.bus_width %>),
|
4
|
+
.REGISTERS (<%= register_block.total_registers %>)
|
5
|
+
) u_adapter (
|
6
|
+
.i_clk (<%= register_block.clock %>),
|
7
|
+
.i_rst_n (<%= register_block.reset %>),
|
8
|
+
.apb_if (<%= apb_if %>),
|
9
|
+
.register_if (<%= register_block.register_if %>)
|
10
|
+
);
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register_block, :protocol, :apb) do
|
4
|
+
configuration do
|
5
|
+
verify(:component) do
|
6
|
+
error_condition { configuration.bus_width > 32 }
|
7
|
+
message do
|
8
|
+
'bus width over 32 bit is not supported: ' \
|
9
|
+
"#{configuration.bus_width}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
verify(:component) do
|
14
|
+
error_condition { configuration.address_width > 32 }
|
15
|
+
message do
|
16
|
+
'address width over 32 bit is not supported: ' \
|
17
|
+
"#{configuration.address_width}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
sv_rtl do
|
23
|
+
build do
|
24
|
+
if configuration.fold_sv_interface_port?
|
25
|
+
interface_port :register_block, :apb_if, {
|
26
|
+
name: 'apb_if',
|
27
|
+
interface_type: 'rggen_apb_if',
|
28
|
+
modport: 'slave'
|
29
|
+
}
|
30
|
+
else
|
31
|
+
input :register_block, :psel, {
|
32
|
+
name: 'i_psel',
|
33
|
+
data_type: :logic,
|
34
|
+
width: 1
|
35
|
+
}
|
36
|
+
input :register_block, :penable, {
|
37
|
+
name: 'i_penable',
|
38
|
+
data_type: :logic,
|
39
|
+
width: 1
|
40
|
+
}
|
41
|
+
input :register_block, :paddr, {
|
42
|
+
name: 'i_paddr',
|
43
|
+
data_type: :logic,
|
44
|
+
width: configuration.address_width
|
45
|
+
}
|
46
|
+
input :register_block, :pprot, {
|
47
|
+
name: 'i_pprot',
|
48
|
+
data_type: :logic,
|
49
|
+
width: 3
|
50
|
+
}
|
51
|
+
input :register_block, :pwrite, {
|
52
|
+
name: 'i_pwrite',
|
53
|
+
data_type: :logic,
|
54
|
+
width: 1
|
55
|
+
}
|
56
|
+
input :register_block, :pstrb, {
|
57
|
+
name: 'i_pstrb',
|
58
|
+
data_type: :logic,
|
59
|
+
width: configuration.byte_width
|
60
|
+
}
|
61
|
+
input :register_block, :pwdata, {
|
62
|
+
name: 'i_pwdata',
|
63
|
+
data_type: :logic,
|
64
|
+
width: configuration.bus_width
|
65
|
+
}
|
66
|
+
output :register_block, :pready, {
|
67
|
+
name: 'o_pready',
|
68
|
+
data_type: :logic,
|
69
|
+
width: 1
|
70
|
+
}
|
71
|
+
output :register_block, :prdata, {
|
72
|
+
name: 'o_prdata',
|
73
|
+
data_type: :logic,
|
74
|
+
width: configuration.bus_width
|
75
|
+
}
|
76
|
+
output :register_block, :pslverr, {
|
77
|
+
name: 'o_pslverr',
|
78
|
+
data_type: :logic,
|
79
|
+
width: 1
|
80
|
+
}
|
81
|
+
interface :register_block, :apb_if, {
|
82
|
+
name: 'apb_if',
|
83
|
+
interface_type: 'rggen_apb_if',
|
84
|
+
parameter_values: [
|
85
|
+
configuration.address_width, configuration.bus_width
|
86
|
+
],
|
87
|
+
variables: [
|
88
|
+
'psel', 'penable', 'paddr', 'pprot', 'pwrite', 'pstrb', 'pwdata',
|
89
|
+
'pready', 'prdata', 'pslverr'
|
90
|
+
]
|
91
|
+
}
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
main_code :register_block, from_template: true
|
96
|
+
main_code :register_block do |code|
|
97
|
+
unless configuration.fold_sv_interface_port?
|
98
|
+
[
|
99
|
+
[apb_if.psel, psel],
|
100
|
+
[apb_if.penable, penable],
|
101
|
+
[apb_if.paddr, paddr],
|
102
|
+
[apb_if.pprot, pprot],
|
103
|
+
[apb_if.pwrite, pwrite],
|
104
|
+
[apb_if.pstrb, pstrb],
|
105
|
+
[apb_if.pwdata, pwdata],
|
106
|
+
[pready, apb_if.pready],
|
107
|
+
[prdata, apb_if.prdata],
|
108
|
+
[pslverr, apb_if.pslverr]
|
109
|
+
].map { |lhs, rhs| code << assign(lhs, rhs) << nl }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
rggen_axi4lite_adapter #(
|
2
|
+
.ADDRESS_WIDTH (<%= register_block.local_address_width %>),
|
3
|
+
.BUS_WIDTH (<%= configuration.bus_width %>),
|
4
|
+
.REGISTERS (<%= register_block.total_registers %>),
|
5
|
+
.WRITE_FIRST (<%= write_first %>)
|
6
|
+
) u_adapter (
|
7
|
+
.i_clk (<%= register_block.clock %>),
|
8
|
+
.i_rst_n (<%= register_block.reset %>),
|
9
|
+
.axi4lite_if (<%= axi4lite_if %>),
|
10
|
+
.register_if (<%= register_block.register_if %>)
|
11
|
+
);
|
@@ -0,0 +1,167 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register_block, :protocol, :axi4lite) do
|
4
|
+
configuration do
|
5
|
+
verify(:component) do
|
6
|
+
error_condition { ![32, 64].include?(configuration.bus_width) }
|
7
|
+
message do
|
8
|
+
'bus width eigher 32 bit or 64 bit is only supported: ' \
|
9
|
+
"#{configuration.bus_width}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
sv_rtl do
|
15
|
+
build do
|
16
|
+
parameter :register_block, :write_first, {
|
17
|
+
name: 'WRITE_FIRST',
|
18
|
+
data_type: :bit,
|
19
|
+
default: 1
|
20
|
+
}
|
21
|
+
if configuration.fold_sv_interface_port?
|
22
|
+
interface_port :register_block, :axi4lite_if, {
|
23
|
+
name: 'axi4lite_if',
|
24
|
+
interface_type: 'rggen_axi4lite_if',
|
25
|
+
modport: 'slave'
|
26
|
+
}
|
27
|
+
else
|
28
|
+
input :register_block, :awvalid, {
|
29
|
+
name: 'i_awvalid',
|
30
|
+
data_type: :logic,
|
31
|
+
width: 1
|
32
|
+
}
|
33
|
+
output :register_block, :awready, {
|
34
|
+
name: 'o_awready',
|
35
|
+
data_type: :logic,
|
36
|
+
width: 1
|
37
|
+
}
|
38
|
+
input :register_block, :awaddr, {
|
39
|
+
name: 'i_awaddr',
|
40
|
+
data_type: :logic,
|
41
|
+
width: configuration.address_width
|
42
|
+
}
|
43
|
+
input :register_block, :awprot, {
|
44
|
+
name: 'i_awprot',
|
45
|
+
data_type: :logic,
|
46
|
+
width: 3
|
47
|
+
}
|
48
|
+
input :register_block, :wvalid, {
|
49
|
+
name: 'i_wvalid',
|
50
|
+
data_type: :logic,
|
51
|
+
width: 1
|
52
|
+
}
|
53
|
+
output :register_block, :wready, {
|
54
|
+
name: 'o_wready',
|
55
|
+
data_type: :logic,
|
56
|
+
width: 1
|
57
|
+
}
|
58
|
+
input :register_block, :wdata, {
|
59
|
+
name: 'i_wdata',
|
60
|
+
data_type: :logic,
|
61
|
+
width: configuration.bus_width
|
62
|
+
}
|
63
|
+
input :register_block, :wstrb, {
|
64
|
+
name: 'i_wstrb',
|
65
|
+
data_type: :logic,
|
66
|
+
width: configuration.byte_width
|
67
|
+
}
|
68
|
+
output :register_block, :bvalid, {
|
69
|
+
name: 'o_bvalid',
|
70
|
+
data_type: :logic,
|
71
|
+
width: 1
|
72
|
+
}
|
73
|
+
input :register_block, :bready, {
|
74
|
+
name: 'i_bready',
|
75
|
+
data_type: :logic,
|
76
|
+
width: 1
|
77
|
+
}
|
78
|
+
output :register_block, :bresp, {
|
79
|
+
name: 'o_bresp',
|
80
|
+
data_type: :logic,
|
81
|
+
width: 2
|
82
|
+
}
|
83
|
+
input :register_block, :arvalid, {
|
84
|
+
name: 'i_arvalid',
|
85
|
+
data_type: :logic,
|
86
|
+
width: 1
|
87
|
+
}
|
88
|
+
output :register_block, :arready, {
|
89
|
+
name: 'o_arready',
|
90
|
+
data_type: :logic,
|
91
|
+
width: 1
|
92
|
+
}
|
93
|
+
input :register_block, :araddr, {
|
94
|
+
name: 'i_araddr',
|
95
|
+
data_type: :logic,
|
96
|
+
width: configuration.address_width
|
97
|
+
}
|
98
|
+
input :register_block, :arprot, {
|
99
|
+
name: 'i_arprot',
|
100
|
+
data_type: :logic,
|
101
|
+
width: 3
|
102
|
+
}
|
103
|
+
output :register_block, :rvalid, {
|
104
|
+
name: 'o_rvalid',
|
105
|
+
data_type: :logic,
|
106
|
+
width: 1
|
107
|
+
}
|
108
|
+
input :register_block, :rready, {
|
109
|
+
name: 'i_rready',
|
110
|
+
data_type: :logic,
|
111
|
+
width: 1
|
112
|
+
}
|
113
|
+
output :register_block, :rdata, {
|
114
|
+
name: 'o_rdata',
|
115
|
+
data_type: :logic,
|
116
|
+
width: configuration.bus_width
|
117
|
+
}
|
118
|
+
output :register_block, :rresp, {
|
119
|
+
name: 'o_rresp',
|
120
|
+
data_type: :logic,
|
121
|
+
width: 2
|
122
|
+
}
|
123
|
+
interface :register_block, :axi4lite_if, {
|
124
|
+
name: 'axi4lite_if',
|
125
|
+
interface_type: 'rggen_axi4lite_if',
|
126
|
+
parameter_values: [
|
127
|
+
configuration.address_width, configuration.bus_width
|
128
|
+
],
|
129
|
+
variables: [
|
130
|
+
'awvalid', 'awready', 'awaddr', 'awprot',
|
131
|
+
'wvalid', 'wready', 'wdata', 'wstrb',
|
132
|
+
'bvalid', 'bready', 'bresp',
|
133
|
+
'arvalid', 'arready', 'araddr', 'arprot',
|
134
|
+
'rvalid', 'rready', 'rdata', 'rresp'
|
135
|
+
]
|
136
|
+
}
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
main_code :register_block, from_template: true
|
141
|
+
main_code :register_block do |code|
|
142
|
+
unless configuration.fold_sv_interface_port?
|
143
|
+
[
|
144
|
+
[axi4lite_if.awvalid, awvalid],
|
145
|
+
[awready, axi4lite_if.awready],
|
146
|
+
[axi4lite_if.awaddr, awaddr],
|
147
|
+
[axi4lite_if.awprot, awprot],
|
148
|
+
[axi4lite_if.wvalid, wvalid],
|
149
|
+
[wready, axi4lite_if.wready],
|
150
|
+
[axi4lite_if.wdata, wdata],
|
151
|
+
[axi4lite_if.wstrb, wstrb],
|
152
|
+
[bvalid, axi4lite_if.bvalid],
|
153
|
+
[axi4lite_if.bready, bready],
|
154
|
+
[bresp, axi4lite_if.bresp],
|
155
|
+
[axi4lite_if.arvalid, arvalid],
|
156
|
+
[arready, axi4lite_if.arready],
|
157
|
+
[axi4lite_if.araddr, araddr],
|
158
|
+
[axi4lite_if.arprot, arprot],
|
159
|
+
[rvalid, axi4lite_if.rvalid],
|
160
|
+
[axi4lite_if.rready, rready],
|
161
|
+
[rdata, axi4lite_if.rdata],
|
162
|
+
[rresp, axi4lite_if.rresp]
|
163
|
+
].each { |lhs, rhs| code << assign(lhs, rhs) << nl }
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|