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