rggen 0.3.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.
Files changed (152) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +7 -0
  3. data/.rubocop_todo.yml +91 -0
  4. data/CODE_OF_CONDUCT.md +49 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +31 -0
  7. data/bin/rggen +6 -0
  8. data/lib/rggen/base/component.rb +27 -0
  9. data/lib/rggen/base/component_factory.rb +46 -0
  10. data/lib/rggen/base/hierarchical_accessors.rb +87 -0
  11. data/lib/rggen/base/hierarchical_item_accessors.rb +79 -0
  12. data/lib/rggen/base/item.rb +24 -0
  13. data/lib/rggen/base/item_factory.rb +20 -0
  14. data/lib/rggen/builder/builder.rb +69 -0
  15. data/lib/rggen/builder/category.rb +52 -0
  16. data/lib/rggen/builder/component_entry.rb +50 -0
  17. data/lib/rggen/builder/component_store.rb +42 -0
  18. data/lib/rggen/builder/input_component_store.rb +25 -0
  19. data/lib/rggen/builder/item_store.rb +89 -0
  20. data/lib/rggen/builder/list_item_entry.rb +81 -0
  21. data/lib/rggen/builder/output_component_store.rb +13 -0
  22. data/lib/rggen/builder/simple_item_entry.rb +33 -0
  23. data/lib/rggen/builtins/bit_field/bit_assignment.rb +39 -0
  24. data/lib/rggen/builtins/bit_field/field_model_creation.rb +25 -0
  25. data/lib/rggen/builtins/bit_field/field_model_declaration.rb +9 -0
  26. data/lib/rggen/builtins/bit_field/initial_value.rb +36 -0
  27. data/lib/rggen/builtins/bit_field/name.rb +26 -0
  28. data/lib/rggen/builtins/bit_field/reference.rb +42 -0
  29. data/lib/rggen/builtins/bit_field/reserved.rb +9 -0
  30. data/lib/rggen/builtins/bit_field/ro.rb +19 -0
  31. data/lib/rggen/builtins/bit_field/rw.erb +13 -0
  32. data/lib/rggen/builtins/bit_field/rw.rb +25 -0
  33. data/lib/rggen/builtins/bit_field/type.rb +205 -0
  34. data/lib/rggen/builtins/bit_field/wo.rb +5 -0
  35. data/lib/rggen/builtins/global/address_width.rb +17 -0
  36. data/lib/rggen/builtins/global/data_width.rb +20 -0
  37. data/lib/rggen/builtins/loaders/configuration/json_loader.rb +7 -0
  38. data/lib/rggen/builtins/loaders/configuration/yaml_loader.rb +7 -0
  39. data/lib/rggen/builtins/loaders/register_map/csv_loader.rb +14 -0
  40. data/lib/rggen/builtins/loaders/register_map/xls_loader.rb +19 -0
  41. data/lib/rggen/builtins/loaders/register_map/xlsx_ods_loader.rb +24 -0
  42. data/lib/rggen/builtins/register/accessibility.rb +23 -0
  43. data/lib/rggen/builtins/register/address_decoder.erb +16 -0
  44. data/lib/rggen/builtins/register/address_decoder.rb +92 -0
  45. data/lib/rggen/builtins/register/array.rb +133 -0
  46. data/lib/rggen/builtins/register/field_model_creator.rb +10 -0
  47. data/lib/rggen/builtins/register/field_model_declarations.rb +7 -0
  48. data/lib/rggen/builtins/register/name.rb +26 -0
  49. data/lib/rggen/builtins/register/offset_address.rb +55 -0
  50. data/lib/rggen/builtins/register/read_data.rb +36 -0
  51. data/lib/rggen/builtins/register/reg_model_constructor.rb +17 -0
  52. data/lib/rggen/builtins/register/reg_model_creation.rb +64 -0
  53. data/lib/rggen/builtins/register/reg_model_declaration.rb +13 -0
  54. data/lib/rggen/builtins/register/reg_model_definition.rb +22 -0
  55. data/lib/rggen/builtins/register/shadow.rb +130 -0
  56. data/lib/rggen/builtins/register/shadow_index_configurator.rb +53 -0
  57. data/lib/rggen/builtins/register/uniqueness_validator.rb +48 -0
  58. data/lib/rggen/builtins/register_block/apb.erb +27 -0
  59. data/lib/rggen/builtins/register_block/apb.rb +20 -0
  60. data/lib/rggen/builtins/register_block/base_address.rb +64 -0
  61. data/lib/rggen/builtins/register_block/block_model_constructor.rb +14 -0
  62. data/lib/rggen/builtins/register_block/block_model_default_map_creator.rb +39 -0
  63. data/lib/rggen/builtins/register_block/block_model_definition.rb +18 -0
  64. data/lib/rggen/builtins/register_block/byte_size.rb +37 -0
  65. data/lib/rggen/builtins/register_block/clock_reset.rb +8 -0
  66. data/lib/rggen/builtins/register_block/host_if.rb +46 -0
  67. data/lib/rggen/builtins/register_block/module_definition.rb +13 -0
  68. data/lib/rggen/builtins/register_block/name.rb +26 -0
  69. data/lib/rggen/builtins/register_block/ral_package_definition.rb +19 -0
  70. data/lib/rggen/builtins/register_block/reg_model_creator.rb +14 -0
  71. data/lib/rggen/builtins/register_block/reg_model_declarations.rb +7 -0
  72. data/lib/rggen/builtins/register_block/response_mux.erb +14 -0
  73. data/lib/rggen/builtins/register_block/response_mux.rb +16 -0
  74. data/lib/rggen/builtins/register_block/signal_declarations.rb +9 -0
  75. data/lib/rggen/builtins.rb +52 -0
  76. data/lib/rggen/commands.rb +23 -0
  77. data/lib/rggen/core_components/configuration/configuration_factory.rb +23 -0
  78. data/lib/rggen/core_components/configuration/item_factory.rb +13 -0
  79. data/lib/rggen/core_components/configuration/raise_error.rb +11 -0
  80. data/lib/rggen/core_components/configuration/setup.rb +14 -0
  81. data/lib/rggen/core_components/ral/item.rb +16 -0
  82. data/lib/rggen/core_components/ral/setup.rb +19 -0
  83. data/lib/rggen/core_components/register_map/bit_field_factory.rb +11 -0
  84. data/lib/rggen/core_components/register_map/component.rb +12 -0
  85. data/lib/rggen/core_components/register_map/generic_map.rb +69 -0
  86. data/lib/rggen/core_components/register_map/item.rb +22 -0
  87. data/lib/rggen/core_components/register_map/item_factory.rb +13 -0
  88. data/lib/rggen/core_components/register_map/loader.rb +13 -0
  89. data/lib/rggen/core_components/register_map/raise_error.rb +17 -0
  90. data/lib/rggen/core_components/register_map/register_block_factory.rb +29 -0
  91. data/lib/rggen/core_components/register_map/register_factory.rb +18 -0
  92. data/lib/rggen/core_components/register_map/register_map_factory.rb +21 -0
  93. data/lib/rggen/core_components/register_map/setup.rb +33 -0
  94. data/lib/rggen/core_components/rtl/component.rb +28 -0
  95. data/lib/rggen/core_components/rtl/item.rb +83 -0
  96. data/lib/rggen/core_components/rtl/setup.rb +19 -0
  97. data/lib/rggen/core_components.rb +23 -0
  98. data/lib/rggen/core_extensions/facets.rb +17 -0
  99. data/lib/rggen/core_extensions/forwardable.rb +26 -0
  100. data/lib/rggen/core_extensions/integer.rb +5 -0
  101. data/lib/rggen/core_extensions/math.rb +7 -0
  102. data/lib/rggen/exceptions.rb +22 -0
  103. data/lib/rggen/generator.rb +185 -0
  104. data/lib/rggen/input_base/component.rb +19 -0
  105. data/lib/rggen/input_base/component_factory.rb +58 -0
  106. data/lib/rggen/input_base/item.rb +170 -0
  107. data/lib/rggen/input_base/item_factory.rb +13 -0
  108. data/lib/rggen/input_base/loader.rb +14 -0
  109. data/lib/rggen/input_base/regexp_patterns.rb +29 -0
  110. data/lib/rggen/output_base/code_block.rb +72 -0
  111. data/lib/rggen/output_base/code_utility.rb +44 -0
  112. data/lib/rggen/output_base/component.rb +88 -0
  113. data/lib/rggen/output_base/component_factory.rb +32 -0
  114. data/lib/rggen/output_base/item.rb +175 -0
  115. data/lib/rggen/output_base/item_factory.rb +6 -0
  116. data/lib/rggen/output_base/line.rb +28 -0
  117. data/lib/rggen/output_base/template_utility.rb +29 -0
  118. data/lib/rggen/output_base/verilog_utility/class_definition.rb +23 -0
  119. data/lib/rggen/output_base/verilog_utility/declaration.rb +70 -0
  120. data/lib/rggen/output_base/verilog_utility/identifier.rb +29 -0
  121. data/lib/rggen/output_base/verilog_utility/module_definition.rb +47 -0
  122. data/lib/rggen/output_base/verilog_utility/package_definition.rb +67 -0
  123. data/lib/rggen/output_base/verilog_utility/structure_definition.rb +52 -0
  124. data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +43 -0
  125. data/lib/rggen/output_base/verilog_utility.rb +66 -0
  126. data/lib/rggen/version.rb +6 -0
  127. data/lib/rggen.rb +65 -0
  128. data/ral/compile.f +4 -0
  129. data/ral/rggen_ral_block.svh +84 -0
  130. data/ral/rggen_ral_field.svh +47 -0
  131. data/ral/rggen_ral_macros.svh +22 -0
  132. data/ral/rggen_ral_map.svh +124 -0
  133. data/ral/rggen_ral_pkg.sv +14 -0
  134. data/ral/rggen_ral_reg.svh +52 -0
  135. data/ral/rggen_ral_shadow_reg.svh +188 -0
  136. data/rggen.gemspec +45 -0
  137. data/rtl/bit_field/rggen_bit_field_rw.sv +28 -0
  138. data/rtl/register/rggen_address_decoder.sv +49 -0
  139. data/rtl/register_block/rggen_host_if_apb.sv +40 -0
  140. data/rtl/register_block/rggen_response_mux.sv +82 -0
  141. data/sample/sample.csv +14 -0
  142. data/sample/sample.json +4 -0
  143. data/sample/sample.xls +0 -0
  144. data/sample/sample.xlsx +0 -0
  145. data/sample/sample.yaml +2 -0
  146. data/sample/sample_0.sv +285 -0
  147. data/sample/sample_0_ral_pkg.sv +99 -0
  148. data/sample/sample_1.sv +172 -0
  149. data/sample/sample_1_ral_pkg.sv +53 -0
  150. data/sample/sample_setup.rb +21 -0
  151. data/setup/default.rb +11 -0
  152. metadata +296 -0
@@ -0,0 +1,188 @@
1
+ `ifndef __RGEN_RAL_SHADOW_REG_SVH__
2
+ `define __RGEN_RAL_SHADOW_REG_SVH__
3
+ typedef class rgen_ral_shadow_reg_index;
4
+ typedef class rgen_ral_shadow_reg_ftdr_seq;
5
+
6
+ class rgen_ral_shadow_reg extends rgen_ral_reg;
7
+ protected rgen_ral_shadow_reg_index shadow_reg_indexes[$];
8
+
9
+ extern function new(string name, int unsigned n_bits, int has_coverage);
10
+
11
+ extern function void configure(
12
+ uvm_object cfg,
13
+ uvm_reg_block blk_parent,
14
+ uvm_reg_file regfile_parent,
15
+ int indexes[$],
16
+ string hdl_path = ""
17
+ );
18
+
19
+ extern virtual function uvm_reg_frontdoor create_frontdoor();
20
+ extern virtual function bit is_active();
21
+
22
+ extern protected virtual function void configure_shadow_indexes();
23
+ extern protected function void set_shadow_index(string reg_name, string field_name, uvm_reg_data_t value);
24
+ endclass
25
+
26
+ function rgen_ral_shadow_reg::new(string name, int unsigned n_bits, int has_coverage);
27
+ super.new(name, n_bits, has_coverage);
28
+ endfunction
29
+
30
+ function void rgen_ral_shadow_reg::configure(
31
+ uvm_object cfg,
32
+ uvm_reg_block blk_parent,
33
+ uvm_reg_file regfile_parent,
34
+ int indexes[$],
35
+ string hdl_path
36
+ );
37
+ super.configure(cfg, blk_parent, regfile_parent, indexes, hdl_path);
38
+ configure_shadow_indexes();
39
+ endfunction
40
+
41
+ function uvm_reg_frontdoor rgen_ral_shadow_reg::create_frontdoor();
42
+ rgen_ral_shadow_reg_ftdr_seq fd = new(shadow_reg_indexes);
43
+ return fd;
44
+ endfunction
45
+
46
+ function bit rgen_ral_shadow_reg::is_active();
47
+ foreach (shadow_reg_indexes[i]) begin
48
+ if (!shadow_reg_indexes[i].is_matched()) begin
49
+ return 0;
50
+ end
51
+ end
52
+ return 1;
53
+ endfunction
54
+
55
+ function void rgen_ral_shadow_reg::configure_shadow_indexes();
56
+ endfunction
57
+
58
+ function void rgen_ral_shadow_reg::set_shadow_index(string reg_name, string field_name, uvm_reg_data_t value);
59
+ rgen_ral_shadow_reg_index shadow_reg_index;
60
+ shadow_reg_index = new(this, reg_name, field_name, value);
61
+ shadow_reg_indexes.push_back(shadow_reg_index);
62
+ endfunction
63
+
64
+ class rgen_ral_shadow_reg_index;
65
+ protected rgen_ral_shadow_reg shadow_reg;
66
+ protected string reg_name;
67
+ protected string field_name;
68
+ protected uvm_reg_data_t value;
69
+ protected uvm_reg_field index_field;
70
+
71
+ extern function new(
72
+ rgen_ral_shadow_reg shadow_reg,
73
+ string reg_name,
74
+ string field_name,
75
+ uvm_reg_data_t value
76
+ );
77
+
78
+ extern virtual function bit is_matched();
79
+ extern virtual task update(
80
+ output uvm_status_e status,
81
+ input uvm_path_e path = UVM_DEFAULT_PATH,
82
+ input uvm_reg_map map = null,
83
+ input uvm_sequence_base parent = null,
84
+ input int prior = -1,
85
+ input uvm_object extension = null,
86
+ input string fname = "",
87
+ input int lineno = 0
88
+ );
89
+
90
+ extern protected virtual function uvm_reg_field get_index_field();
91
+ endclass
92
+
93
+ function rgen_ral_shadow_reg_index::new(
94
+ rgen_ral_shadow_reg shadow_reg,
95
+ string reg_name,
96
+ string field_name,
97
+ uvm_reg_data_t value
98
+ );
99
+ this.shadow_reg = shadow_reg;
100
+ this.reg_name = reg_name;
101
+ this.field_name = field_name;
102
+ this.value = value;
103
+ endfunction
104
+
105
+ function bit rgen_ral_shadow_reg_index::is_matched();
106
+ uvm_reg_field field = get_index_field();
107
+ return (field.value == value) ? 1 : 0;
108
+ endfunction
109
+
110
+ task rgen_ral_shadow_reg_index::update(
111
+ output uvm_status_e status,
112
+ input uvm_path_e path,
113
+ input uvm_reg_map map,
114
+ input uvm_sequence_base parent,
115
+ input int prior,
116
+ input uvm_object extension,
117
+ input string fname,
118
+ input int lineno
119
+ );
120
+ uvm_reg_field field = get_index_field();
121
+ uvm_reg parent_reg = field.get_parent();
122
+ field.set(value);
123
+ parent_reg.update(status, path, map, parent, prior, extension, fname, lineno);
124
+ endtask
125
+
126
+ function uvm_reg_field rgen_ral_shadow_reg_index::get_index_field();
127
+ if (index_field == null) begin
128
+ uvm_reg_block parent_block = shadow_reg.get_parent();
129
+ uvm_reg index_reg;
130
+
131
+ index_reg = parent_block.get_reg_by_name(reg_name);
132
+ if (index_reg == null) begin
133
+ `uvm_fatal("rgen_ral_shadow_reg_index", $sformatf("Unable to locate index register: %s", reg_name))
134
+ return null;
135
+ end
136
+
137
+ index_field = index_reg.get_field_by_name(field_name);
138
+ if (index_field == null) begin
139
+ `uvm_fatal("rgen_ral_shadow_reg_index", $sformatf("Unable to locate index field: %s", field_name))
140
+ return null;
141
+ end
142
+ end
143
+ return index_field;
144
+ endfunction
145
+
146
+ class rgen_ral_shadow_reg_ftdr_seq extends uvm_reg_frontdoor;
147
+ protected rgen_ral_shadow_reg_index shadow_indexes[$];
148
+
149
+ extern function new(ref rgen_ral_shadow_reg_index shadow_indexes[$]);
150
+
151
+ extern virtual task body();
152
+ endclass
153
+
154
+ function rgen_ral_shadow_reg_ftdr_seq::new(ref rgen_ral_shadow_reg_index shadow_indexes[$]);
155
+ super.new("rgen_ral_shadow_reg_ftdr_seq");
156
+ foreach (shadow_indexes[i]) begin
157
+ this.shadow_indexes.push_back(shadow_indexes[i]);
158
+ end
159
+ endfunction
160
+
161
+ task rgen_ral_shadow_reg_ftdr_seq::body();
162
+ foreach (shadow_indexes[i]) begin
163
+ uvm_status_e status;
164
+ shadow_indexes[i].update(
165
+ status,
166
+ rw_info.path,
167
+ rw_info.map,
168
+ rw_info.parent,
169
+ rw_info.prior,
170
+ rw_info.extension,
171
+ rw_info.fname,
172
+ rw_info.lineno
173
+ );
174
+ if (status == UVM_NOT_OK) begin
175
+ `uvm_warning("rgen_ral_shadow_reg_ftdr_seq", "Updating index field failed")
176
+ rw_info.status = status;
177
+ return;
178
+ end
179
+ end
180
+
181
+ if (rw_info.kind == UVM_WRITE) begin
182
+ rw_info.local_map.do_write(rw_info);
183
+ end
184
+ else begin
185
+ rw_info.local_map.do_read(rw_info);
186
+ end
187
+ endtask
188
+ `endif
data/rggen.gemspec ADDED
@@ -0,0 +1,45 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rggen/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'rggen'
8
+ spec.version = RgGen::VERSION
9
+ spec.required_ruby_version = '>= 2.0'
10
+ spec.authors = ['Taichi Ishitani']
11
+ spec.email = ['taichi730@gmail.com']
12
+
13
+ spec.summary = 'Code generation tool for control registers in a SoC design.'
14
+ spec.description = <<-EOS
15
+ RgGen is a code generation tool for SoC designers.
16
+ You can automatically generate soruce code for control registers in a SoC design, e.g. RTL, UVM RAL model, from its register map document.
17
+ You can also customize RgGen, so you can build your specific generation tool.
18
+ EOS
19
+ spec.homepage = ''
20
+ spec.license = 'MIT'
21
+
22
+ spec.files = `git ls-files -z`.split("\x0").reject { |f|
23
+ f =~ %r{^(?:
24
+ bin/setup
25
+ |spec/.*
26
+ |Gemfile
27
+ |Rakefile
28
+ |.gitignore
29
+ |.rspec
30
+ |.travis.yml
31
+ )$}x
32
+ }
33
+ spec.bindir = 'bin'
34
+ spec.executables = ['rggen']
35
+ spec.require_paths = ['lib']
36
+
37
+ spec.add_runtime_dependency 'baby_erubis', '>= 2.0'
38
+ spec.add_runtime_dependency 'facets' , '>= 3.0'
39
+ spec.add_runtime_dependency 'roo' , '>= 2.1.1'
40
+ spec.add_runtime_dependency 'spreadsheet', '>= 1.0.3'
41
+
42
+ spec.add_development_dependency 'rake' , '~> 10.0'
43
+ spec.add_development_dependency 'rspec' , '>= 3.3'
44
+ spec.add_development_dependency 'rubocop', '>= 0.35'
45
+ end
@@ -0,0 +1,28 @@
1
+ module rggen_bit_field_rw #(
2
+ parameter WIDTH = 1,
3
+ parameter INITIAL_VALUE = 0
4
+ )(
5
+ input clk,
6
+ input rst_n,
7
+ input i_command_valid,
8
+ input i_select,
9
+ input i_write,
10
+ input [WIDTH-1:0] i_write_data,
11
+ input [WIDTH-1:0] i_write_mask,
12
+ output [WIDTH-1:0] o_value
13
+ );
14
+ logic [WIDTH-1:0] write_data;
15
+ logic [WIDTH-1:0] value;
16
+
17
+ assign o_value = value;
18
+ assign write_data = (i_write_data & ( i_write_mask))
19
+ | (value & (~i_write_mask));
20
+ always_ff @(posedge clk or negedge rst_n) begin
21
+ if (!rst_n) begin
22
+ value <= INITIAL_VALUE;
23
+ end
24
+ else if (i_command_valid && i_select && i_write) begin
25
+ value <= write_data;
26
+ end
27
+ end
28
+ endmodule
@@ -0,0 +1,49 @@
1
+ module rggen_address_decoder #(
2
+ parameter READABLE = 1,
3
+ parameter WRITABLE = 1,
4
+ parameter ADDRESS_WIDTH = 16,
5
+ parameter START_ADDRESS = 'h00,
6
+ parameter END_ADDRESS = 'h00,
7
+ parameter USE_SHADOW_INDEX = 0,
8
+ parameter SHADOW_INDEX_WIDTH = 1,
9
+ parameter SHADOW_INDEX_VALUE = 'h00
10
+ )(
11
+ input i_read,
12
+ input i_write,
13
+ input [ADDRESS_WIDTH-1:0] i_address,
14
+ input [SHADOW_INDEX_WIDTH-1:0] i_shadow_index,
15
+ output o_select
16
+ );
17
+ localparam READ_ONLY = (READABLE && (!WRITABLE)) ? 1 : 0;
18
+ localparam WRITE_ONLY = (WRITABLE && (!READABLE)) ? 1 : 0;
19
+
20
+ logic match;
21
+ logic match_address;
22
+ logic match_shadow_index;
23
+
24
+ assign match = (match_address && match_shadow_index) ? 1'b1 : 1'b0;
25
+
26
+ if (START_ADDRESS == END_ADDRESS) begin
27
+ assign match_address = (i_address == START_ADDRESS) ? 1'b1 : 1'b0;
28
+ end
29
+ else begin
30
+ assign match_address = (i_address inside {[START_ADDRESS:END_ADDRESS]}) ? 1'b1 : 1'b0;
31
+ end
32
+
33
+ if (USE_SHADOW_INDEX) begin
34
+ assign match_shadow_index = (i_shadow_index == SHADOW_INDEX_VALUE) ? 1'b1 : 1'b0;
35
+ end
36
+ else begin
37
+ assign match_shadow_index = 1'b1;
38
+ end
39
+
40
+ if (READ_ONLY) begin
41
+ assign o_select = (match && i_read) ? 1'b1 : 1'b0;
42
+ end
43
+ else if (WRITE_ONLY) begin
44
+ assign o_select = (match && i_write) ? 1'b1 : 1'b0;
45
+ end
46
+ else begin
47
+ assign o_select = match;
48
+ end
49
+ endmodule
@@ -0,0 +1,40 @@
1
+ module rggen_host_if_apb #(
2
+ parameter DATA_WIDTH = 32,
3
+ parameter HOST_ADDRESS_WIDTH = 16,
4
+ parameter LOCAL_ADDRESS_WIDTH = 16
5
+ )(
6
+ input clk,
7
+ input rst_n,
8
+ input [HOST_ADDRESS_WIDTH-1:0] i_paddr,
9
+ input [2:0] i_pprot,
10
+ input i_psel,
11
+ input i_penable,
12
+ input i_pwrite,
13
+ input [DATA_WIDTH-1:0] i_pwdata,
14
+ input [DATA_WIDTH/8-1:0] i_pstrb,
15
+ output o_pready,
16
+ output [DATA_WIDTH-1:0] o_prdata,
17
+ output o_pslverr,
18
+ output o_command_valid,
19
+ output o_write,
20
+ output o_read,
21
+ output [LOCAL_ADDRESS_WIDTH-1:0] o_address,
22
+ output [DATA_WIDTH-1:0] o_write_data,
23
+ output [DATA_WIDTH-1:0] o_write_mask,
24
+ input i_response_ready,
25
+ input [DATA_WIDTH-1:0] i_read_data,
26
+ input [1:0] i_status
27
+ );
28
+ assign o_pready = i_response_ready;
29
+ assign o_prdata = i_read_data;
30
+ assign o_pslverr = i_status[0];
31
+
32
+ assign o_command_valid = i_psel;
33
+ assign o_write = i_pwrite;
34
+ assign o_read = ~i_pwrite;
35
+ assign o_address = i_paddr[LOCAL_ADDRESS_WIDTH-1:0];
36
+ assign o_write_data = i_pwdata;
37
+ for (genvar i = 0;i < DATA_WIDTH / 8;i++) begin
38
+ assign o_write_mask[i*8+:8] = {8{i_pstrb[i]}};
39
+ end
40
+ endmodule
@@ -0,0 +1,82 @@
1
+ module rggen_response_mux #(
2
+ parameter DATA_WIDTH = 32,
3
+ parameter TOTAL_REGISTERS = 1
4
+ )(
5
+ input clk,
6
+ input rst_n,
7
+ input i_command_valid,
8
+ input i_read,
9
+ output o_response_ready,
10
+ output [DATA_WIDTH-1:0] o_read_data,
11
+ output [1:0] o_status,
12
+ input [TOTAL_REGISTERS-1:0] i_register_select,
13
+ input [DATA_WIDTH-1:0] i_register_read_data[TOTAL_REGISTERS]
14
+ );
15
+ // Response ready
16
+ logic response_valid;
17
+ logic response_ready;
18
+
19
+ assign o_response_ready = response_ready;
20
+ assign response_valid = (i_command_valid && (!response_ready)) ? 1'b1 : 1'b0;
21
+ always_ff @(posedge clk or negedge rst_n) begin
22
+ if (!rst_n) begin
23
+ response_ready <= 1'b0;
24
+ end
25
+ else if (response_valid) begin
26
+ response_ready <= 1'b1;
27
+ end
28
+ else begin
29
+ response_ready <= 1'b0;
30
+ end
31
+ end
32
+
33
+ // Status
34
+ logic slave_error;
35
+ logic exokay;
36
+ logic [1:0] status;
37
+
38
+ assign o_status = status;
39
+ assign slave_error = (TOTAL_REGISTERS == 1) ? ~i_register_select[0] : ~|i_register_select;
40
+ assign exokay = 1'b0;
41
+ always_ff @(posedge clk or negedge rst_n) begin
42
+ if (!rst_n) begin
43
+ status <= 2'b00;
44
+ end
45
+ else if (response_valid) begin
46
+ status <= {exokay, slave_error};
47
+ end
48
+ else begin
49
+ status <= 2'b00;
50
+ end
51
+ end
52
+
53
+ // Read data
54
+ logic [DATA_WIDTH-1:0] read_data;
55
+ logic [DATA_WIDTH-1:0] selected_data;
56
+
57
+ assign o_read_data = read_data;
58
+ always_ff @(posedge clk or negedge rst_n) begin
59
+ if (!rst_n) begin
60
+ read_data <= {DATA_WIDTH{1'b0}};
61
+ end
62
+ else if (response_valid && i_read) begin
63
+ read_data <= selected_data;
64
+ end
65
+ else begin
66
+ read_data <= {DATA_WIDTH{1'b0}};
67
+ end
68
+ end
69
+
70
+ if (TOTAL_REGISTERS > 1) begin
71
+ for (genvar i = 0;i < DATA_WIDTH;i++) begin
72
+ logic [TOTAL_REGISTERS-1:0] temp;
73
+ assign selected_data[i] = |temp;
74
+ for (genvar j = 0;j < TOTAL_REGISTERS;j++) begin
75
+ assign temp[j] = i_register_select[j] & i_register_read_data[j][i];
76
+ end
77
+ end
78
+ end
79
+ else begin
80
+ assign selected_data = i_register_read_data[0];
81
+ end
82
+ endmodule
data/sample/sample.csv ADDED
@@ -0,0 +1,14 @@
1
+ ,block name,block_0,,,,,,,
2
+ ,byte size,256,,,,,,,
3
+ ,,,,,,,,,
4
+ ,offset address,registe name,array dimension,shadow index,assignment,field name,type,initial value,reference
5
+ ,0x00,register_0,,,[31:16],bit_field_0_0,rw,0,
6
+ ,,,,,[15:0],bit_field_0_1,rw,0,
7
+ ,0x04,register_1,,,[31:0],bit_field_1_0,rw,0,
8
+ ,0x08,register_2,,,[16],bit_field_2_0,ro,,
9
+ ,,,,,[0],bit_field_2_1,rw,0,
10
+ ,0x0C,register_3,,,[31:0],bit_field_3_0,ro,,
11
+ ,0x10 - 0x1F,register_4,[4],,[31:16],bit_field_4_0,ro,,
12
+ ,,,,,[15:0],bit_field_4_1,rw,0,
13
+ ,0x20,register_5,"[2,4]","bit_field_2_1:1, bit_field_0_0, bit_field_0_1",[31:16],bit_field_5_0,ro,,
14
+ ,,,,,[15:0],bit_field_5_1,rw,0,
@@ -0,0 +1,4 @@
1
+ {
2
+ "address_width": 16,
3
+ "host_if" : "apb"
4
+ }
data/sample/sample.xls ADDED
Binary file
Binary file
@@ -0,0 +1,2 @@
1
+ address_width: 16
2
+ host_if: apb