rggen 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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