rggen 0.4.4 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +3 -2
- data/c/rggen.h +17 -0
- data/lib/rggen.rb +7 -16
- data/lib/rggen/base/item_factory.rb +2 -0
- data/lib/rggen/builtins.rb +15 -13
- data/lib/rggen/builtins/bit_field/{reserved.rb → types/reserved.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{ro.erb → types/ro.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{ro.rb → types/ro.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{rw.erb → types/rw.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{rw.rb → types/rw.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{rwl_rwe.erb → types/rwl_rwe.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{rwl_rwe.rb → types/rwl_rwe.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0c_w1c.erb → types/w0c_w1c.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0c_w1c.rb → types/w0c_w1c.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0s_w1s.erb → types/w0s_w1s.erb} +0 -0
- data/lib/rggen/builtins/bit_field/{w0s_w1s.rb → types/w0s_w1s.rb} +0 -0
- data/lib/rggen/builtins/bit_field/{wo.rb → types/wo.rb} +0 -0
- data/lib/rggen/builtins/register/address_decoder.erb +9 -9
- data/lib/rggen/builtins/register/address_decoder.rb +24 -24
- data/lib/rggen/builtins/register/array.rb +0 -22
- data/lib/rggen/builtins/register/bus_exporter.rb +10 -2
- data/lib/rggen/builtins/register/indirect_index_configurator.rb +54 -0
- data/lib/rggen/builtins/register/offset_address.rb +21 -15
- data/lib/rggen/builtins/register/read_data.rb +1 -1
- data/lib/rggen/builtins/register/reg_model.rb +5 -5
- data/lib/rggen/builtins/register/sub_block_model.rb +1 -1
- data/lib/rggen/builtins/register/type.rb +207 -0
- data/lib/rggen/builtins/register/types/external.rb +15 -0
- data/lib/rggen/builtins/register/types/indirect.rb +134 -0
- data/lib/rggen/builtins/register/uniqueness_validator.rb +10 -7
- data/lib/rggen/builtins/register_block/address_struct.rb +56 -0
- data/lib/rggen/builtins/register_block/c_header_file.rb +15 -0
- data/lib/rggen/builtins/register_block/{apb.erb → host_ifs/apb.erb} +0 -0
- data/lib/rggen/builtins/register_block/{apb.rb → host_ifs/apb.rb} +0 -0
- data/lib/rggen/builtins/register_block/{axi4lite.erb → host_ifs/axi4lite.erb} +0 -0
- data/lib/rggen/builtins/register_block/{axi4lite.rb → host_ifs/axi4lite.rb} +0 -0
- data/lib/rggen/builtins/register_block/ral_package.rb +6 -1
- data/lib/rggen/builtins/register_block/response_mux.rb +2 -2
- data/lib/rggen/builtins/register_block/top_module.rb +5 -1
- data/lib/rggen/core_components.rb +25 -0
- data/lib/rggen/core_components/c_header/item.rb +8 -0
- data/lib/rggen/core_components/c_header/setup.rb +19 -0
- data/lib/rggen/core_components/c_utility.rb +19 -0
- data/lib/rggen/core_components/c_utility/data_structure_definition.rb +62 -0
- data/lib/rggen/core_components/c_utility/source_file.rb +10 -0
- data/lib/rggen/core_components/c_utility/variable_declaration.rb +35 -0
- data/lib/rggen/core_components/code_utility.rb +56 -0
- data/lib/rggen/{output_base → core_components/code_utility}/code_block.rb +1 -1
- data/lib/rggen/{output_base → core_components/code_utility}/line.rb +1 -1
- data/lib/rggen/core_components/code_utility/source_file.rb +97 -0
- data/lib/rggen/core_components/erb_engine.rb +15 -0
- data/lib/rggen/core_components/ral/item.rb +2 -1
- data/lib/rggen/core_components/register_map/generic_map.rb +3 -1
- data/lib/rggen/core_components/rtl/item.rb +2 -1
- data/lib/rggen/core_components/verilog_utility.rb +69 -0
- data/lib/rggen/core_components/verilog_utility/class_definition.rb +56 -0
- data/lib/rggen/core_components/verilog_utility/declaration.rb +66 -0
- data/lib/rggen/core_components/verilog_utility/identifier.rb +27 -0
- data/lib/rggen/core_components/verilog_utility/module_definition.rb +71 -0
- data/lib/rggen/core_components/verilog_utility/package_definition.rb +65 -0
- data/lib/rggen/core_components/verilog_utility/source_file.rb +10 -0
- data/lib/rggen/core_components/verilog_utility/structure_definition.rb +50 -0
- data/lib/rggen/core_components/verilog_utility/subroutine_definition.rb +41 -0
- data/lib/rggen/core_extensions/facets.rb +5 -0
- data/lib/rggen/generator.rb +19 -5
- data/lib/rggen/input_base/item.rb +6 -6
- data/lib/rggen/output_base/code_generator.rb +36 -0
- data/lib/rggen/output_base/component.rb +27 -41
- data/lib/rggen/output_base/file_writer.rb +36 -0
- data/lib/rggen/output_base/item.rb +34 -100
- data/lib/rggen/output_base/template_engine.rb +24 -0
- data/lib/rggen/rggen_home.rb +3 -0
- data/lib/rggen/version.rb +2 -2
- data/ral/rggen_ral_block.svh +1 -1
- data/ral/rggen_ral_indirect_reg.svh +193 -0
- data/ral/rggen_ral_map.svh +20 -20
- data/ral/rggen_ral_pkg.sv +1 -1
- data/rtl/register/rggen_address_decoder.sv +14 -14
- data/sample/sample.csv +21 -22
- data/sample/sample.xls +0 -0
- data/sample/sample.xlsx +0 -0
- data/sample/sample_0.h +17 -0
- data/sample/sample_0.sv +92 -92
- data/sample/sample_0_ral_pkg.sv +8 -5
- data/sample/sample_1.h +9 -0
- data/sample/sample_1.sv +27 -27
- data/sample/sample_1_ral_pkg.sv +3 -0
- data/sample/sample_setup.rb +4 -2
- data/setup/default.rb +4 -2
- metadata +53 -36
- data/lib/rggen/builtins/register/accessibility.rb +0 -23
- data/lib/rggen/builtins/register/external.rb +0 -42
- data/lib/rggen/builtins/register/shadow.rb +0 -130
- data/lib/rggen/builtins/register/shadow_index_configurator.rb +0 -56
- data/lib/rggen/output_base/code_utility.rb +0 -50
- data/lib/rggen/output_base/template_utility.rb +0 -29
- data/lib/rggen/output_base/verilog_utility.rb +0 -69
- data/lib/rggen/output_base/verilog_utility/class_definition.rb +0 -58
- data/lib/rggen/output_base/verilog_utility/declaration.rb +0 -68
- data/lib/rggen/output_base/verilog_utility/identifier.rb +0 -29
- data/lib/rggen/output_base/verilog_utility/module_definition.rb +0 -73
- data/lib/rggen/output_base/verilog_utility/package_definition.rb +0 -67
- data/lib/rggen/output_base/verilog_utility/structure_definition.rb +0 -52
- data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +0 -43
- data/ral/rggen_ral_shadow_reg.svh +0 -193
@@ -0,0 +1,24 @@
|
|
1
|
+
module RgGen
|
2
|
+
module OutputBase
|
3
|
+
class TemplateEngine
|
4
|
+
include Singleton
|
5
|
+
|
6
|
+
def process_template(context, path = nil, call_info = nil)
|
7
|
+
path ||= extract_template_path(call_info || caller[0])
|
8
|
+
render(context, templates[path])
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def templates
|
14
|
+
@templates ||= Hash.new do |t, p|
|
15
|
+
t[p] = parse_template(p)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def extract_template_path(call_info)
|
20
|
+
File.ext(call_info[/^(.+?):\d/, 1], file_extension.to_s)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/rggen/version.rb
CHANGED
data/ral/rggen_ral_block.svh
CHANGED
@@ -0,0 +1,193 @@
|
|
1
|
+
`ifndef __RGGEN_RAL_INDIRECT_REG_SVH__
|
2
|
+
`define __RGGEN_RAL_INDIRECT_REG_SVH__
|
3
|
+
typedef class rggen_ral_indirect_reg_index;
|
4
|
+
typedef class rggen_ral_indirect_reg_ftdr_seq;
|
5
|
+
|
6
|
+
class rggen_ral_indirect_reg extends rggen_ral_reg;
|
7
|
+
protected rggen_ral_indirect_reg_index indirect_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_indirect_indexes();
|
23
|
+
extern protected function void set_indirect_index(string reg_name, string field_name, uvm_reg_data_t value);
|
24
|
+
endclass
|
25
|
+
|
26
|
+
function rggen_ral_indirect_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 rggen_ral_indirect_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_indirect_indexes();
|
39
|
+
endfunction
|
40
|
+
|
41
|
+
function uvm_reg_frontdoor rggen_ral_indirect_reg::create_frontdoor();
|
42
|
+
rggen_ral_indirect_reg_ftdr_seq fd = new(indirect_reg_indexes);
|
43
|
+
return fd;
|
44
|
+
endfunction
|
45
|
+
|
46
|
+
function bit rggen_ral_indirect_reg::is_active();
|
47
|
+
foreach (indirect_reg_indexes[i]) begin
|
48
|
+
if (!indirect_reg_indexes[i].is_matched()) begin
|
49
|
+
return 0;
|
50
|
+
end
|
51
|
+
end
|
52
|
+
return 1;
|
53
|
+
endfunction
|
54
|
+
|
55
|
+
function void rggen_ral_indirect_reg::configure_indirect_indexes();
|
56
|
+
endfunction
|
57
|
+
|
58
|
+
function void rggen_ral_indirect_reg::set_indirect_index(string reg_name, string field_name, uvm_reg_data_t value);
|
59
|
+
rggen_ral_indirect_reg_index indirect_reg_index;
|
60
|
+
indirect_reg_index = new(this, reg_name, field_name, value);
|
61
|
+
indirect_reg_indexes.push_back(indirect_reg_index);
|
62
|
+
endfunction
|
63
|
+
|
64
|
+
class rggen_ral_indirect_reg_index;
|
65
|
+
protected rggen_ral_indirect_reg indirect_reg;
|
66
|
+
protected string reg_name;
|
67
|
+
protected string field_name;
|
68
|
+
protected uvm_reg_data_t value;
|
69
|
+
protected uvm_reg index_reg;
|
70
|
+
protected uvm_reg_field index_field;
|
71
|
+
|
72
|
+
extern function new(
|
73
|
+
rggen_ral_indirect_reg indirect_reg,
|
74
|
+
string reg_name,
|
75
|
+
string field_name,
|
76
|
+
uvm_reg_data_t value
|
77
|
+
);
|
78
|
+
|
79
|
+
extern virtual function bit is_matched();
|
80
|
+
extern virtual function void set(string fname = "", int lineno = 0);
|
81
|
+
extern virtual function uvm_reg get_index_reg();
|
82
|
+
extern virtual function uvm_reg_field get_index_field();
|
83
|
+
endclass
|
84
|
+
|
85
|
+
function rggen_ral_indirect_reg_index::new(
|
86
|
+
rggen_ral_indirect_reg indirect_reg,
|
87
|
+
string reg_name,
|
88
|
+
string field_name,
|
89
|
+
uvm_reg_data_t value
|
90
|
+
);
|
91
|
+
this.indirect_reg = indirect_reg;
|
92
|
+
this.reg_name = reg_name;
|
93
|
+
this.field_name = field_name;
|
94
|
+
this.value = value;
|
95
|
+
endfunction
|
96
|
+
|
97
|
+
function bit rggen_ral_indirect_reg_index::is_matched();
|
98
|
+
void'(get_index_field());
|
99
|
+
return (index_field.value == value) ? 1 : 0;
|
100
|
+
endfunction
|
101
|
+
|
102
|
+
function void rggen_ral_indirect_reg_index::set(string fname = "", int lineno = 0);
|
103
|
+
void'(get_index_field());
|
104
|
+
index_field.set(value, fname, lineno);
|
105
|
+
endfunction
|
106
|
+
|
107
|
+
function uvm_reg rggen_ral_indirect_reg_index::get_index_reg();
|
108
|
+
if (index_reg == null) begin
|
109
|
+
uvm_reg_block parent_block;
|
110
|
+
parent_block = indirect_reg.get_parent();
|
111
|
+
index_reg = parent_block.get_reg_by_name(reg_name);
|
112
|
+
if (index_reg == null) begin
|
113
|
+
`uvm_fatal("rggen_ral_indirect_reg_index", $sformatf("Unable to locate index register: %s", reg_name))
|
114
|
+
return null;
|
115
|
+
end
|
116
|
+
end
|
117
|
+
return index_reg;
|
118
|
+
endfunction
|
119
|
+
|
120
|
+
function uvm_reg_field rggen_ral_indirect_reg_index::get_index_field();
|
121
|
+
if (index_field == null) begin
|
122
|
+
void'(get_index_reg());
|
123
|
+
index_field = index_reg.get_field_by_name(field_name);
|
124
|
+
if (index_field == null) begin
|
125
|
+
`uvm_fatal("rggen_ral_indirect_reg_index", $sformatf("Unable to locate index field: %s", field_name))
|
126
|
+
return null;
|
127
|
+
end
|
128
|
+
end
|
129
|
+
return index_field;
|
130
|
+
endfunction
|
131
|
+
|
132
|
+
class rggen_ral_indirect_reg_ftdr_seq extends uvm_reg_frontdoor;
|
133
|
+
protected rggen_ral_indirect_reg_index indirect_indexes[$];
|
134
|
+
protected bit index_regs[uvm_reg];
|
135
|
+
|
136
|
+
extern function new(ref rggen_ral_indirect_reg_index indirect_indexes[$]);
|
137
|
+
|
138
|
+
extern virtual task body();
|
139
|
+
extern task update_index_regs(ref uvm_status_e status);
|
140
|
+
endclass
|
141
|
+
|
142
|
+
function rggen_ral_indirect_reg_ftdr_seq::new(ref rggen_ral_indirect_reg_index indirect_indexes[$]);
|
143
|
+
super.new("rggen_ral_indirect_reg_ftdr_seq");
|
144
|
+
foreach (indirect_indexes[i]) begin
|
145
|
+
this.indirect_indexes.push_back(indirect_indexes[i]);
|
146
|
+
end
|
147
|
+
endfunction
|
148
|
+
|
149
|
+
task rggen_ral_indirect_reg_ftdr_seq::body();
|
150
|
+
uvm_status_e status;
|
151
|
+
update_index_regs(status);
|
152
|
+
if (status == UVM_NOT_OK) begin
|
153
|
+
`uvm_warning("rggen_ral_indirect_reg_ftdr_seq", "Updating index registers failed")
|
154
|
+
rw_info.status = status;
|
155
|
+
return;
|
156
|
+
end
|
157
|
+
if (rw_info.kind == UVM_WRITE) begin
|
158
|
+
rw_info.local_map.do_write(rw_info);
|
159
|
+
end
|
160
|
+
else begin
|
161
|
+
rw_info.local_map.do_read(rw_info);
|
162
|
+
end
|
163
|
+
endtask
|
164
|
+
|
165
|
+
task rggen_ral_indirect_reg_ftdr_seq::update_index_regs(ref uvm_status_e status);
|
166
|
+
if (index_regs.size() == 0) begin
|
167
|
+
foreach (indirect_indexes[i]) begin
|
168
|
+
uvm_reg index_reg = indirect_indexes[i].get_index_reg();
|
169
|
+
if (!index_regs.exists(index_reg)) begin
|
170
|
+
index_regs[index_reg] = 1;
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
foreach (indirect_indexes[i]) begin
|
175
|
+
indirect_indexes[i].set(rw_info.fname, rw_info.lineno);
|
176
|
+
end
|
177
|
+
foreach (index_regs[index_reg]) begin
|
178
|
+
index_reg.update(
|
179
|
+
status,
|
180
|
+
rw_info.path,
|
181
|
+
rw_info.map,
|
182
|
+
rw_info.parent,
|
183
|
+
rw_info.prior,
|
184
|
+
rw_info.extension,
|
185
|
+
rw_info.fname,
|
186
|
+
rw_info.lineno
|
187
|
+
);
|
188
|
+
if (status == UVM_NOT_OK) begin
|
189
|
+
return;
|
190
|
+
end
|
191
|
+
end
|
192
|
+
endtask
|
193
|
+
`endif
|
data/ral/rggen_ral_map.svh
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
`ifndef __RGGEN_RAL_MAP_SVH__
|
2
2
|
`define __RGGEN_RAL_MAP_SVH__
|
3
3
|
class rggen_ral_map extends uvm_reg_map;
|
4
|
-
protected
|
4
|
+
protected rggen_ral_indirect_reg m_indirect_regs_by_offset[uvm_reg_addr_t][$];
|
5
5
|
|
6
6
|
extern function new(string name = "rggen_ral_map");
|
7
7
|
|
@@ -17,7 +17,7 @@ class rggen_ral_map extends uvm_reg_map;
|
|
17
17
|
|
18
18
|
extern virtual function uvm_reg get_reg_by_offset(uvm_reg_addr_t offset, bit read = 1);
|
19
19
|
|
20
|
-
extern function void
|
20
|
+
extern function void Xinit_indirect_reg_address_mapX();
|
21
21
|
|
22
22
|
`uvm_object_utils(rggen_ral_map)
|
23
23
|
endclass
|
@@ -33,13 +33,13 @@ function void rggen_ral_map::add_reg(
|
|
33
33
|
bit unmapped,
|
34
34
|
uvm_reg_frontdoor frontdoor
|
35
35
|
);
|
36
|
-
rggen_ral_reg
|
37
|
-
|
36
|
+
rggen_ral_reg rggen_reg;
|
37
|
+
rggen_ral_indirect_reg rggen_indirect_reg;
|
38
38
|
|
39
39
|
if ((frontdoor == null) && $cast(rggen_reg, rg)) begin
|
40
40
|
frontdoor = rggen_reg.create_frontdoor();
|
41
41
|
end
|
42
|
-
if ($cast(
|
42
|
+
if ($cast(rggen_indirect_reg, rg)) begin
|
43
43
|
unmapped = 1;
|
44
44
|
end
|
45
45
|
super.add_reg(rg, offset, rights, unmapped, frontdoor);
|
@@ -51,7 +51,7 @@ function void rggen_ral_map::set_base_addr(uvm_reg_addr_t offset);
|
|
51
51
|
bit locked = parent_block.is_locked();
|
52
52
|
super.set_base_addr(offset);
|
53
53
|
if ((parent_map == null) && locked) begin
|
54
|
-
|
54
|
+
Xinit_indirect_reg_address_mapX();
|
55
55
|
end
|
56
56
|
endfunction
|
57
57
|
|
@@ -63,7 +63,7 @@ function void rggen_ral_map::set_submap_offset(uvm_reg_map submap, uvm_reg_addr_
|
|
63
63
|
uvm_reg_map root_map = get_root_map();
|
64
64
|
rggen_ral_map rggen_map;
|
65
65
|
if ($cast(rggen_map, root_map)) begin
|
66
|
-
rggen_map.
|
66
|
+
rggen_map.Xinit_indirect_reg_address_mapX();
|
67
67
|
end
|
68
68
|
end
|
69
69
|
endfunction
|
@@ -71,10 +71,10 @@ endfunction
|
|
71
71
|
function uvm_reg rggen_ral_map::get_reg_by_offset(uvm_reg_addr_t offset, bit read);
|
72
72
|
uvm_reg rg = super.get_reg_by_offset(offset, read);
|
73
73
|
uvm_reg_block parent = get_parent();
|
74
|
-
if ((rg == null) && parent.is_locked() &&
|
75
|
-
foreach (
|
76
|
-
if (
|
77
|
-
rg =
|
74
|
+
if ((rg == null) && parent.is_locked() && m_indirect_regs_by_offset.exists(offset)) begin
|
75
|
+
foreach (m_indirect_regs_by_offset[offset][i]) begin
|
76
|
+
if (m_indirect_regs_by_offset[offset][i].is_active()) begin
|
77
|
+
rg = m_indirect_regs_by_offset[offset][i];
|
78
78
|
break;
|
79
79
|
end
|
80
80
|
end
|
@@ -82,7 +82,7 @@ function uvm_reg rggen_ral_map::get_reg_by_offset(uvm_reg_addr_t offset, bit rea
|
|
82
82
|
return rg;
|
83
83
|
endfunction
|
84
84
|
|
85
|
-
function void rggen_ral_map::
|
85
|
+
function void rggen_ral_map::Xinit_indirect_reg_address_mapX();
|
86
86
|
uvm_reg_map top_map;
|
87
87
|
rggen_ral_map top_rggen_map;
|
88
88
|
uvm_reg_map submaps[$];
|
@@ -90,7 +90,7 @@ function void rggen_ral_map::Xinit_shadow_reg_address_mapX();
|
|
90
90
|
|
91
91
|
top_map = get_root_map();
|
92
92
|
if (top_map == this) begin
|
93
|
-
|
93
|
+
m_indirect_regs_by_offset.delete();
|
94
94
|
end
|
95
95
|
if (!$cast(top_rggen_map, top_map)) begin
|
96
96
|
return;
|
@@ -100,24 +100,24 @@ function void rggen_ral_map::Xinit_shadow_reg_address_mapX();
|
|
100
100
|
foreach (submaps[i]) begin
|
101
101
|
rggen_ral_map rggen_map;
|
102
102
|
if ($cast(rggen_map, submaps[i])) begin
|
103
|
-
rggen_map.
|
103
|
+
rggen_map.Xinit_indirect_reg_address_mapX();
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
107
107
|
get_registers(regs, UVM_NO_HIER);
|
108
108
|
foreach (regs[i]) begin
|
109
|
-
|
110
|
-
uvm_reg_map_info
|
109
|
+
rggen_ral_indirect_reg indirect_reg;
|
110
|
+
uvm_reg_map_info map_info;
|
111
111
|
|
112
|
-
if (!$cast(
|
112
|
+
if (!$cast(indirect_reg, regs[i])) begin
|
113
113
|
continue;
|
114
114
|
end
|
115
115
|
|
116
|
-
map_info = get_reg_map_info(
|
116
|
+
map_info = get_reg_map_info(indirect_reg);
|
117
117
|
map_info.unmapped = 0;
|
118
|
-
void'(get_physical_addresses(map_info.offset, 0,
|
118
|
+
void'(get_physical_addresses(map_info.offset, 0, indirect_reg.get_n_bytes(), map_info.addr));
|
119
119
|
foreach (map_info.addr[j]) begin
|
120
|
-
top_rggen_map.
|
120
|
+
top_rggen_map.m_indirect_regs_by_offset[map_info.addr[j]].push_back(indirect_reg);
|
121
121
|
end
|
122
122
|
end
|
123
123
|
endfunction
|
data/ral/rggen_ral_pkg.sv
CHANGED
@@ -8,7 +8,7 @@ package rggen_ral_pkg;
|
|
8
8
|
`include "rggen_ral_field.svh"
|
9
9
|
`include "rggen_ral_field_rwl_rwe.svh"
|
10
10
|
`include "rggen_ral_reg.svh"
|
11
|
-
`include "
|
11
|
+
`include "rggen_ral_indirect_reg.svh"
|
12
12
|
`include "rggen_ral_map.svh"
|
13
13
|
`include "rggen_ral_block.svh"
|
14
14
|
endpackage
|
@@ -1,19 +1,19 @@
|
|
1
1
|
module rggen_address_decoder #(
|
2
|
-
parameter ADDRESS_WIDTH
|
3
|
-
parameter START_ADDRESS
|
4
|
-
parameter END_ADDRESS
|
5
|
-
parameter
|
6
|
-
parameter
|
7
|
-
parameter
|
2
|
+
parameter ADDRESS_WIDTH = 16,
|
3
|
+
parameter START_ADDRESS = 'h00,
|
4
|
+
parameter END_ADDRESS = 'h00,
|
5
|
+
parameter INDIRECT_REGISTER = 0,
|
6
|
+
parameter INDIRECT_INDEX_WIDTH = 1,
|
7
|
+
parameter INDIRECT_INDEX_VALUE = 'h00
|
8
8
|
)(
|
9
|
-
input [ADDRESS_WIDTH-1:0]
|
10
|
-
input [
|
11
|
-
output
|
9
|
+
input [ADDRESS_WIDTH-1:0] i_address,
|
10
|
+
input [INDIRECT_INDEX_WIDTH-1:0] i_indirect_index,
|
11
|
+
output o_select
|
12
12
|
);
|
13
13
|
logic match_address;
|
14
|
-
logic
|
14
|
+
logic match_indirect_index;
|
15
15
|
|
16
|
-
assign o_select = (match_address &&
|
16
|
+
assign o_select = (match_address && match_indirect_index) ? 1'b1 : 1'b0;
|
17
17
|
|
18
18
|
generate
|
19
19
|
if (START_ADDRESS == END_ADDRESS) begin
|
@@ -27,11 +27,11 @@ module rggen_address_decoder #(
|
|
27
27
|
endgenerate
|
28
28
|
|
29
29
|
generate
|
30
|
-
if (
|
31
|
-
assign
|
30
|
+
if (INDIRECT_REGISTER) begin
|
31
|
+
assign match_indirect_index = (i_indirect_index == INDIRECT_INDEX_VALUE) ? 1'b1 : 1'b0;
|
32
32
|
end
|
33
33
|
else begin
|
34
|
-
assign
|
34
|
+
assign match_indirect_index = 1'b1;
|
35
35
|
end
|
36
36
|
endgenerate
|
37
37
|
endmodule
|
data/sample/sample.csv
CHANGED
@@ -1,22 +1,21 @@
|
|
1
|
-
,block name,block_0
|
2
|
-
,byte size,256
|
3
|
-
|
4
|
-
,offset address,registe name,array dimension,
|
5
|
-
,0x00,register_0
|
6
|
-
|
7
|
-
,0x04,register_1
|
8
|
-
,0x08,register_2
|
9
|
-
|
10
|
-
,0x0C,register_3
|
11
|
-
,0x10 - 0x1F,register_4,[4]
|
12
|
-
|
13
|
-
,0x20,register_5,"[2,4]","bit_field_2_1:1, bit_field_0_0, bit_field_0_1"
|
14
|
-
|
15
|
-
,0x24,register_6
|
16
|
-
|
17
|
-
,0x28,register_7
|
18
|
-
|
19
|
-
,0x2C,register_8
|
20
|
-
|
21
|
-
,0x80-0xFF,register_9
|
22
|
-
,,,,,,,,,,,
|
1
|
+
,block name,block_0,,,,,,,
|
2
|
+
,byte size,256,,,,,,,
|
3
|
+
,,,,,,,,,
|
4
|
+
,offset address,registe name,array dimension,type,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]","indirect: 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,
|
15
|
+
,0x24,register_6,,,[8],bit_field_6_0,w0c,0,bit_field_2_1
|
16
|
+
,,,,,[0],bit_field_6_1,w1c,0,bit_field_2_1
|
17
|
+
,0x28,register_7,,,[8],bit_field_7_0,w0s,0,
|
18
|
+
,,,,,[0],bit_field_7_1,w1s,0,
|
19
|
+
,0x2C,register_8,,,[31:16],bit_field_8_0,rwl,0,bit_field_2_1
|
20
|
+
,,,,,[15:0],bit_field_8_1,rwe,0,bit_field_2_1
|
21
|
+
,0x80-0xFF,register_9,,external,,,,,
|