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.
- checksums.yaml +7 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +91 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/LICENSE.txt +21 -0
- data/README.md +31 -0
- data/bin/rggen +6 -0
- data/lib/rggen/base/component.rb +27 -0
- data/lib/rggen/base/component_factory.rb +46 -0
- data/lib/rggen/base/hierarchical_accessors.rb +87 -0
- data/lib/rggen/base/hierarchical_item_accessors.rb +79 -0
- data/lib/rggen/base/item.rb +24 -0
- data/lib/rggen/base/item_factory.rb +20 -0
- data/lib/rggen/builder/builder.rb +69 -0
- data/lib/rggen/builder/category.rb +52 -0
- data/lib/rggen/builder/component_entry.rb +50 -0
- data/lib/rggen/builder/component_store.rb +42 -0
- data/lib/rggen/builder/input_component_store.rb +25 -0
- data/lib/rggen/builder/item_store.rb +89 -0
- data/lib/rggen/builder/list_item_entry.rb +81 -0
- data/lib/rggen/builder/output_component_store.rb +13 -0
- data/lib/rggen/builder/simple_item_entry.rb +33 -0
- data/lib/rggen/builtins/bit_field/bit_assignment.rb +39 -0
- data/lib/rggen/builtins/bit_field/field_model_creation.rb +25 -0
- data/lib/rggen/builtins/bit_field/field_model_declaration.rb +9 -0
- data/lib/rggen/builtins/bit_field/initial_value.rb +36 -0
- data/lib/rggen/builtins/bit_field/name.rb +26 -0
- data/lib/rggen/builtins/bit_field/reference.rb +42 -0
- data/lib/rggen/builtins/bit_field/reserved.rb +9 -0
- data/lib/rggen/builtins/bit_field/ro.rb +19 -0
- data/lib/rggen/builtins/bit_field/rw.erb +13 -0
- data/lib/rggen/builtins/bit_field/rw.rb +25 -0
- data/lib/rggen/builtins/bit_field/type.rb +205 -0
- data/lib/rggen/builtins/bit_field/wo.rb +5 -0
- data/lib/rggen/builtins/global/address_width.rb +17 -0
- data/lib/rggen/builtins/global/data_width.rb +20 -0
- data/lib/rggen/builtins/loaders/configuration/json_loader.rb +7 -0
- data/lib/rggen/builtins/loaders/configuration/yaml_loader.rb +7 -0
- data/lib/rggen/builtins/loaders/register_map/csv_loader.rb +14 -0
- data/lib/rggen/builtins/loaders/register_map/xls_loader.rb +19 -0
- data/lib/rggen/builtins/loaders/register_map/xlsx_ods_loader.rb +24 -0
- data/lib/rggen/builtins/register/accessibility.rb +23 -0
- data/lib/rggen/builtins/register/address_decoder.erb +16 -0
- data/lib/rggen/builtins/register/address_decoder.rb +92 -0
- data/lib/rggen/builtins/register/array.rb +133 -0
- data/lib/rggen/builtins/register/field_model_creator.rb +10 -0
- data/lib/rggen/builtins/register/field_model_declarations.rb +7 -0
- data/lib/rggen/builtins/register/name.rb +26 -0
- data/lib/rggen/builtins/register/offset_address.rb +55 -0
- data/lib/rggen/builtins/register/read_data.rb +36 -0
- data/lib/rggen/builtins/register/reg_model_constructor.rb +17 -0
- data/lib/rggen/builtins/register/reg_model_creation.rb +64 -0
- data/lib/rggen/builtins/register/reg_model_declaration.rb +13 -0
- data/lib/rggen/builtins/register/reg_model_definition.rb +22 -0
- data/lib/rggen/builtins/register/shadow.rb +130 -0
- data/lib/rggen/builtins/register/shadow_index_configurator.rb +53 -0
- data/lib/rggen/builtins/register/uniqueness_validator.rb +48 -0
- data/lib/rggen/builtins/register_block/apb.erb +27 -0
- data/lib/rggen/builtins/register_block/apb.rb +20 -0
- data/lib/rggen/builtins/register_block/base_address.rb +64 -0
- data/lib/rggen/builtins/register_block/block_model_constructor.rb +14 -0
- data/lib/rggen/builtins/register_block/block_model_default_map_creator.rb +39 -0
- data/lib/rggen/builtins/register_block/block_model_definition.rb +18 -0
- data/lib/rggen/builtins/register_block/byte_size.rb +37 -0
- data/lib/rggen/builtins/register_block/clock_reset.rb +8 -0
- data/lib/rggen/builtins/register_block/host_if.rb +46 -0
- data/lib/rggen/builtins/register_block/module_definition.rb +13 -0
- data/lib/rggen/builtins/register_block/name.rb +26 -0
- data/lib/rggen/builtins/register_block/ral_package_definition.rb +19 -0
- data/lib/rggen/builtins/register_block/reg_model_creator.rb +14 -0
- data/lib/rggen/builtins/register_block/reg_model_declarations.rb +7 -0
- data/lib/rggen/builtins/register_block/response_mux.erb +14 -0
- data/lib/rggen/builtins/register_block/response_mux.rb +16 -0
- data/lib/rggen/builtins/register_block/signal_declarations.rb +9 -0
- data/lib/rggen/builtins.rb +52 -0
- data/lib/rggen/commands.rb +23 -0
- data/lib/rggen/core_components/configuration/configuration_factory.rb +23 -0
- data/lib/rggen/core_components/configuration/item_factory.rb +13 -0
- data/lib/rggen/core_components/configuration/raise_error.rb +11 -0
- data/lib/rggen/core_components/configuration/setup.rb +14 -0
- data/lib/rggen/core_components/ral/item.rb +16 -0
- data/lib/rggen/core_components/ral/setup.rb +19 -0
- data/lib/rggen/core_components/register_map/bit_field_factory.rb +11 -0
- data/lib/rggen/core_components/register_map/component.rb +12 -0
- data/lib/rggen/core_components/register_map/generic_map.rb +69 -0
- data/lib/rggen/core_components/register_map/item.rb +22 -0
- data/lib/rggen/core_components/register_map/item_factory.rb +13 -0
- data/lib/rggen/core_components/register_map/loader.rb +13 -0
- data/lib/rggen/core_components/register_map/raise_error.rb +17 -0
- data/lib/rggen/core_components/register_map/register_block_factory.rb +29 -0
- data/lib/rggen/core_components/register_map/register_factory.rb +18 -0
- data/lib/rggen/core_components/register_map/register_map_factory.rb +21 -0
- data/lib/rggen/core_components/register_map/setup.rb +33 -0
- data/lib/rggen/core_components/rtl/component.rb +28 -0
- data/lib/rggen/core_components/rtl/item.rb +83 -0
- data/lib/rggen/core_components/rtl/setup.rb +19 -0
- data/lib/rggen/core_components.rb +23 -0
- data/lib/rggen/core_extensions/facets.rb +17 -0
- data/lib/rggen/core_extensions/forwardable.rb +26 -0
- data/lib/rggen/core_extensions/integer.rb +5 -0
- data/lib/rggen/core_extensions/math.rb +7 -0
- data/lib/rggen/exceptions.rb +22 -0
- data/lib/rggen/generator.rb +185 -0
- data/lib/rggen/input_base/component.rb +19 -0
- data/lib/rggen/input_base/component_factory.rb +58 -0
- data/lib/rggen/input_base/item.rb +170 -0
- data/lib/rggen/input_base/item_factory.rb +13 -0
- data/lib/rggen/input_base/loader.rb +14 -0
- data/lib/rggen/input_base/regexp_patterns.rb +29 -0
- data/lib/rggen/output_base/code_block.rb +72 -0
- data/lib/rggen/output_base/code_utility.rb +44 -0
- data/lib/rggen/output_base/component.rb +88 -0
- data/lib/rggen/output_base/component_factory.rb +32 -0
- data/lib/rggen/output_base/item.rb +175 -0
- data/lib/rggen/output_base/item_factory.rb +6 -0
- data/lib/rggen/output_base/line.rb +28 -0
- data/lib/rggen/output_base/template_utility.rb +29 -0
- data/lib/rggen/output_base/verilog_utility/class_definition.rb +23 -0
- data/lib/rggen/output_base/verilog_utility/declaration.rb +70 -0
- data/lib/rggen/output_base/verilog_utility/identifier.rb +29 -0
- data/lib/rggen/output_base/verilog_utility/module_definition.rb +47 -0
- data/lib/rggen/output_base/verilog_utility/package_definition.rb +67 -0
- data/lib/rggen/output_base/verilog_utility/structure_definition.rb +52 -0
- data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +43 -0
- data/lib/rggen/output_base/verilog_utility.rb +66 -0
- data/lib/rggen/version.rb +6 -0
- data/lib/rggen.rb +65 -0
- data/ral/compile.f +4 -0
- data/ral/rggen_ral_block.svh +84 -0
- data/ral/rggen_ral_field.svh +47 -0
- data/ral/rggen_ral_macros.svh +22 -0
- data/ral/rggen_ral_map.svh +124 -0
- data/ral/rggen_ral_pkg.sv +14 -0
- data/ral/rggen_ral_reg.svh +52 -0
- data/ral/rggen_ral_shadow_reg.svh +188 -0
- data/rggen.gemspec +45 -0
- data/rtl/bit_field/rggen_bit_field_rw.sv +28 -0
- data/rtl/register/rggen_address_decoder.sv +49 -0
- data/rtl/register_block/rggen_host_if_apb.sv +40 -0
- data/rtl/register_block/rggen_response_mux.sv +82 -0
- data/sample/sample.csv +14 -0
- data/sample/sample.json +4 -0
- data/sample/sample.xls +0 -0
- data/sample/sample.xlsx +0 -0
- data/sample/sample.yaml +2 -0
- data/sample/sample_0.sv +285 -0
- data/sample/sample_0_ral_pkg.sv +99 -0
- data/sample/sample_1.sv +172 -0
- data/sample/sample_1_ral_pkg.sv +53 -0
- data/sample/sample_setup.rb +21 -0
- data/setup/default.rb +11 -0
- 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,
|
data/sample/sample.json
ADDED
data/sample/sample.xls
ADDED
|
Binary file
|
data/sample/sample.xlsx
ADDED
|
Binary file
|
data/sample/sample.yaml
ADDED