rggen-systemverilog 0.19.0 → 0.20.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 +4 -4
- data/lib/rggen/systemverilog/common.rb +2 -2
- data/lib/rggen/systemverilog/common/component.rb +2 -6
- data/lib/rggen/systemverilog/common/feature.rb +39 -26
- data/lib/rggen/systemverilog/common/utility/interface_port.rb +7 -3
- data/lib/rggen/systemverilog/common/utility/local_scope.rb +2 -2
- data/lib/rggen/systemverilog/common/utility/structure_definition.rb +1 -3
- data/lib/rggen/systemverilog/ral.rb +4 -1
- data/lib/rggen/systemverilog/ral/bit_field/type.rb +15 -10
- data/lib/rggen/systemverilog/ral/bit_field/type/rwe_rwl.rb +1 -11
- data/lib/rggen/systemverilog/ral/feature.rb +4 -4
- data/lib/rggen/systemverilog/ral/register/type.rb +10 -52
- data/lib/rggen/systemverilog/ral/register/type/default.erb +1 -1
- data/lib/rggen/systemverilog/ral/register/type/external.rb +6 -10
- data/lib/rggen/systemverilog/ral/register/type/indirect.erb +3 -3
- data/lib/rggen/systemverilog/ral/register/type/indirect.rb +5 -2
- data/lib/rggen/systemverilog/ral/register_block/sv_ral_model.erb +8 -0
- data/lib/rggen/systemverilog/ral/register_block/sv_ral_model.rb +36 -0
- data/lib/rggen/systemverilog/ral/register_block/sv_ral_package.rb +1 -32
- data/lib/rggen/systemverilog/ral/register_common.rb +46 -0
- data/lib/rggen/systemverilog/ral/register_file/sv_ral_model.erb +8 -0
- data/lib/rggen/systemverilog/ral/register_file/sv_ral_model.rb +57 -0
- data/lib/rggen/systemverilog/ral/setup.rb +2 -1
- data/lib/rggen/systemverilog/rtl.rb +4 -1
- data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +34 -19
- data/lib/rggen/systemverilog/rtl/bit_field/type.rb +1 -5
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.rb +3 -3
- data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.rb +2 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.rb +2 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.rb +2 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +3 -3
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w1crs.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0src_w1src.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -1
- data/lib/rggen/systemverilog/rtl/feature.rb +12 -16
- data/lib/rggen/systemverilog/rtl/partial_sum.rb +29 -0
- data/lib/rggen/systemverilog/rtl/register/sv_rtl_top.rb +10 -47
- data/lib/rggen/systemverilog/rtl/register/type.rb +25 -1
- data/lib/rggen/systemverilog/rtl/register/type/external.rb +10 -10
- data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +2 -2
- data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +2 -2
- data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +13 -14
- data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +23 -25
- data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +11 -10
- data/lib/rggen/systemverilog/rtl/register_file/sv_rtl_top.rb +30 -0
- data/lib/rggen/systemverilog/rtl/register_index.rb +112 -0
- data/lib/rggen/systemverilog/rtl/setup.rb +1 -0
- data/lib/rggen/systemverilog/version.rb +1 -1
- metadata +11 -4
- data/lib/rggen/systemverilog/ral/register_block/sv_ral_block_model.erb +0 -11
@@ -4,10 +4,10 @@ endfunction
|
|
4
4
|
function void build();
|
5
5
|
<% field_model_constructors.each do |constructor| %>
|
6
6
|
<%= constructor %>
|
7
|
-
<% end%>
|
7
|
+
<% end %>
|
8
8
|
endfunction
|
9
9
|
function void setup_index_fields();
|
10
|
-
<% index_properties.each do |
|
11
|
-
setup_index_field("<%=
|
10
|
+
<% index_properties.each do |field_name, value| %>
|
11
|
+
setup_index_field("<%= field_name %>", <%= value %>);
|
12
12
|
<% end %>
|
13
13
|
endfunction
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
RgGen.define_list_item_feature(:register, :type, :indirect) do
|
4
4
|
sv_ral do
|
5
|
-
unmapped
|
6
5
|
offset_address { register.offset_address }
|
7
6
|
|
8
7
|
main_code :ral_package do
|
@@ -24,12 +23,16 @@ RgGen.define_list_item_feature(:register, :type, :indirect) do
|
|
24
23
|
else
|
25
24
|
"array_index[#{array_position += 1}]"
|
26
25
|
end
|
27
|
-
[field
|
26
|
+
[field_full_name(field), value]
|
28
27
|
end
|
29
28
|
end
|
30
29
|
|
31
30
|
def index_fields
|
32
31
|
register.collect_index_fields(register_block.bit_fields)
|
33
32
|
end
|
33
|
+
|
34
|
+
def field_full_name(field)
|
35
|
+
[field.register.full_name('.'), field.name].join('.')
|
36
|
+
end
|
34
37
|
end
|
35
38
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register_block, :sv_ral_model) do
|
4
|
+
sv_ral do
|
5
|
+
main_code :ral_package do
|
6
|
+
class_definition(model_name) do |sv_class|
|
7
|
+
sv_class.base 'rggen_ral_block'
|
8
|
+
sv_class.parameters parameters
|
9
|
+
sv_class.variables variables
|
10
|
+
sv_class.body { process_template }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def model_name
|
17
|
+
"#{register_block.name}_block_model"
|
18
|
+
end
|
19
|
+
|
20
|
+
def parameters
|
21
|
+
register_block.declarations[:parameter]
|
22
|
+
end
|
23
|
+
|
24
|
+
def variables
|
25
|
+
register_block.declarations[:variable]
|
26
|
+
end
|
27
|
+
|
28
|
+
def byte_width
|
29
|
+
configuration.byte_width
|
30
|
+
end
|
31
|
+
|
32
|
+
def child_model_constructors
|
33
|
+
register_block.children.flat_map(&:constructors)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -8,23 +8,12 @@ RgGen.define_simple_feature(:register_block, :sv_ral_package) do
|
|
8
8
|
package.package_imports packages
|
9
9
|
package.include_files include_files
|
10
10
|
package.body do |code|
|
11
|
-
register_block.generate_code(:ral_package, :bottom_up
|
11
|
+
register_block.generate_code(code, :ral_package, :bottom_up)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
main_code :ral_package do
|
18
|
-
class_definition(model_name) do |sv_class|
|
19
|
-
sv_class.base 'rggen_ral_block'
|
20
|
-
sv_class.parameters parameters
|
21
|
-
sv_class.variables variables
|
22
|
-
sv_class.body do
|
23
|
-
process_template(File.join(__dir__, 'sv_ral_block_model.erb'))
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
17
|
private
|
29
18
|
|
30
19
|
def package_name
|
@@ -41,25 +30,5 @@ RgGen.define_simple_feature(:register_block, :sv_ral_package) do
|
|
41
30
|
def include_files
|
42
31
|
['uvm_macros.svh', 'rggen_ral_macros.svh']
|
43
32
|
end
|
44
|
-
|
45
|
-
def model_name
|
46
|
-
"#{register_block.name}_block_model"
|
47
|
-
end
|
48
|
-
|
49
|
-
def parameters
|
50
|
-
register_block.declarations(:register_block, :parameter)
|
51
|
-
end
|
52
|
-
|
53
|
-
def variables
|
54
|
-
register_block.declarations(:register_block, :variable)
|
55
|
-
end
|
56
|
-
|
57
|
-
def reg_model_constructors
|
58
|
-
register_block.registers.flat_map(&:constructors)
|
59
|
-
end
|
60
|
-
|
61
|
-
def byte_width
|
62
|
-
configuration.byte_width
|
63
|
-
end
|
64
33
|
end
|
65
34
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RgGen
|
4
|
+
module SystemVerilog
|
5
|
+
module RAL
|
6
|
+
module RegisterCommon
|
7
|
+
private
|
8
|
+
|
9
|
+
def array_indices
|
10
|
+
if component.array?
|
11
|
+
index_table = component.array_size.map { |size| (0...size).to_a }
|
12
|
+
index_table[0].product(*index_table[1..-1])
|
13
|
+
else
|
14
|
+
[nil]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def offset_address(index)
|
19
|
+
address =
|
20
|
+
if register? && helper.offset_address
|
21
|
+
instance_exec(index, &helper.offset_address)
|
22
|
+
else
|
23
|
+
default_offset_address(index)
|
24
|
+
end
|
25
|
+
hex(address, register_block.local_address_width)
|
26
|
+
end
|
27
|
+
|
28
|
+
def default_offset_address(index)
|
29
|
+
component.offset_address + component.byte_size(false) * index
|
30
|
+
end
|
31
|
+
|
32
|
+
def hdl_path(array_index)
|
33
|
+
[
|
34
|
+
"g_#{component.name}",
|
35
|
+
*Array(array_index).map { |i| "g[#{i}]" },
|
36
|
+
*unit_instance_name
|
37
|
+
].join('.')
|
38
|
+
end
|
39
|
+
|
40
|
+
def unit_instance_name
|
41
|
+
register? && 'u_register' || nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register_file, :sv_ral_model) do
|
4
|
+
sv_ral do
|
5
|
+
include RgGen::SystemVerilog::RAL::RegisterCommon
|
6
|
+
|
7
|
+
export :constructors
|
8
|
+
|
9
|
+
build do
|
10
|
+
variable :ral_model, {
|
11
|
+
name: register_file.name, data_type: model_name,
|
12
|
+
array_size: register_file.array_size, random: true
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def constructors
|
17
|
+
array_indices.map.with_index(&method(:constructor_code))
|
18
|
+
end
|
19
|
+
|
20
|
+
main_code :ral_package do
|
21
|
+
class_definition(model_name) do |sv_class|
|
22
|
+
sv_class.base 'rggen_ral_reg_file'
|
23
|
+
sv_class.variables variables
|
24
|
+
sv_class.body { process_template }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def model_name
|
31
|
+
"#{register_file.full_name('_')}_reg_file_model"
|
32
|
+
end
|
33
|
+
|
34
|
+
def constructor_code(array_index, index)
|
35
|
+
macro_call(:rggen_ral_create_reg_file, arguments(array_index, index))
|
36
|
+
end
|
37
|
+
|
38
|
+
def arguments(array_index, index)
|
39
|
+
[
|
40
|
+
ral_model[array_index], array(array_index), offset_address(index),
|
41
|
+
string(hdl_path(array_index))
|
42
|
+
]
|
43
|
+
end
|
44
|
+
|
45
|
+
def variables
|
46
|
+
register_file.declarations[:variable]
|
47
|
+
end
|
48
|
+
|
49
|
+
def byte_width
|
50
|
+
configuration.byte_width
|
51
|
+
end
|
52
|
+
|
53
|
+
def child_model_constructors
|
54
|
+
register_file.children.flat_map(&:constructors)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -3,5 +3,6 @@
|
|
3
3
|
require 'rggen/systemverilog/ral'
|
4
4
|
|
5
5
|
RgGen.setup :'rggen-sv-ral', RgGen::SystemVerilog::RAL do |builder|
|
6
|
-
builder.enable :register_block, [:sv_ral_package]
|
6
|
+
builder.enable :register_block, [:sv_ral_model, :sv_ral_package]
|
7
|
+
builder.enable :register_file, [:sv_ral_model]
|
7
8
|
end
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require_relative 'common'
|
4
4
|
require_relative 'rtl/feature'
|
5
|
+
require_relative 'rtl/partial_sum'
|
6
|
+
require_relative 'rtl/register_index'
|
5
7
|
|
6
8
|
module RgGen
|
7
9
|
module SystemVerilog
|
@@ -31,7 +33,8 @@ module RgGen
|
|
31
33
|
'rtl/register_block/protocol',
|
32
34
|
'rtl/register_block/protocol/apb',
|
33
35
|
'rtl/register_block/protocol/axi4lite',
|
34
|
-
'rtl/register_block/sv_rtl_top'
|
36
|
+
'rtl/register_block/sv_rtl_top',
|
37
|
+
'rtl/register_file/sv_rtl_top'
|
35
38
|
].freeze
|
36
39
|
|
37
40
|
def self.version
|
@@ -3,25 +3,26 @@
|
|
3
3
|
RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
4
4
|
sv_rtl do
|
5
5
|
export :local_index
|
6
|
+
export :local_indices
|
6
7
|
export :loop_variables
|
7
8
|
export :array_size
|
8
9
|
export :value
|
9
10
|
|
10
11
|
build do
|
11
12
|
if fixed_initial_value?
|
12
|
-
localparam :
|
13
|
+
localparam :initial_value, {
|
13
14
|
name: initial_value_name, data_type: :bit, width: bit_field.width,
|
14
15
|
array_size: initial_value_size, array_format: initial_value_format,
|
15
16
|
default: initial_value_lhs
|
16
17
|
}
|
17
18
|
elsif initial_value?
|
18
|
-
parameter :
|
19
|
+
parameter :initial_value, {
|
19
20
|
name: initial_value_name, data_type: :bit, width: bit_field.width,
|
20
21
|
array_size: initial_value_size, array_format: initial_value_format,
|
21
22
|
default: initial_value_lhs
|
22
23
|
}
|
23
24
|
end
|
24
|
-
interface :
|
25
|
+
interface :bit_field_sub_if, {
|
25
26
|
name: 'bit_field_sub_if',
|
26
27
|
interface_type: 'rggen_bit_field_if',
|
27
28
|
parameter_values: [bit_field.width]
|
@@ -42,13 +43,12 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def local_index
|
45
|
-
(
|
46
|
+
(index_name = local_index_name) &&
|
46
47
|
create_identifier(index_name)
|
47
48
|
end
|
48
49
|
|
49
|
-
def
|
50
|
-
|
51
|
-
loop_index(depth)
|
50
|
+
def local_indices
|
51
|
+
[*register.local_indices, local_index_name]
|
52
52
|
end
|
53
53
|
|
54
54
|
def loop_variables
|
@@ -58,15 +58,17 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
58
58
|
|
59
59
|
def array_size
|
60
60
|
(inside_loop? || nil) &&
|
61
|
-
[
|
61
|
+
[
|
62
|
+
*register_files.flat_map(&:array_size),
|
63
|
+
*register.array_size,
|
64
|
+
*bit_field.sequence_size
|
65
|
+
].compact
|
62
66
|
end
|
63
67
|
|
64
|
-
def value(
|
65
|
-
|
66
|
-
width
|
67
|
-
|
68
|
-
.register_if[register.index(register_offset)]
|
69
|
-
.value[bit_field.lsb(bit_field_offset), width]
|
68
|
+
def value(offsets = nil, width = nil)
|
69
|
+
value_lsb = bit_field.lsb(offsets&.last || local_index_name)
|
70
|
+
value_width = width || bit_field.width
|
71
|
+
register_if(offsets&.slice(0..-2)).value[value_lsb, value_width]
|
70
72
|
end
|
71
73
|
|
72
74
|
private
|
@@ -75,6 +77,19 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
75
77
|
define_method(m) { bit_field.__send__(__method__) }
|
76
78
|
end
|
77
79
|
|
80
|
+
def local_index_name
|
81
|
+
(bit_field.sequential? || nil) &&
|
82
|
+
begin
|
83
|
+
depth = (register.loop_variables&.size || 0) + 1
|
84
|
+
loop_index(depth)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def register_if(offsets)
|
89
|
+
index = register.index(offsets || register.local_indices)
|
90
|
+
register_block.register_if[index]
|
91
|
+
end
|
92
|
+
|
78
93
|
def initial_value_name
|
79
94
|
identifiers = []
|
80
95
|
identifiers << bit_field.full_name('_') unless fixed_initial_value?
|
@@ -119,20 +134,20 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
119
134
|
end
|
120
135
|
|
121
136
|
def loop_size
|
122
|
-
(
|
123
|
-
{
|
137
|
+
(loop_variable = local_index_name) &&
|
138
|
+
{ loop_variable => bit_field.sequence_size }
|
124
139
|
end
|
125
140
|
|
126
141
|
def parameters
|
127
|
-
bit_field.declarations
|
142
|
+
bit_field.declarations[:parameter]
|
128
143
|
end
|
129
144
|
|
130
145
|
def variables
|
131
|
-
bit_field.declarations
|
146
|
+
bit_field.declarations[:variable]
|
132
147
|
end
|
133
148
|
|
134
149
|
def body_code(code)
|
135
|
-
bit_field.generate_code(:bit_field, :top_down
|
150
|
+
bit_field.generate_code(code, :bit_field, :top_down)
|
136
151
|
end
|
137
152
|
|
138
153
|
def bit_field_if_connection
|
@@ -43,11 +43,7 @@ RgGen.define_list_feature(:bit_field, :type) do
|
|
43
43
|
bit_field.reference? &&
|
44
44
|
bit_field
|
45
45
|
.find_reference(register_block.bit_fields)
|
46
|
-
.value(
|
47
|
-
register.local_index,
|
48
|
-
bit_field.local_index,
|
49
|
-
bit_field.reference_width
|
50
|
-
)
|
46
|
+
.value(bit_field.local_indices, bit_field.reference_width)
|
51
47
|
end
|
52
48
|
|
53
49
|
def bit_field_if
|
@@ -3,16 +3,16 @@
|
|
3
3
|
RgGen.define_list_item_feature(:bit_field, :type, [:rc, :w0c, :w1c]) do
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
|
-
input :
|
6
|
+
input :set, {
|
7
7
|
name: "i_#{full_name}_set", data_type: :logic, width: width,
|
8
8
|
array_size: array_size, array_format: array_port_format
|
9
9
|
}
|
10
|
-
output :
|
10
|
+
output :value_out, {
|
11
11
|
name: "o_#{full_name}", data_type: :logic, width: width,
|
12
12
|
array_size: array_size, array_format: array_port_format
|
13
13
|
}
|
14
14
|
if bit_field.reference?
|
15
|
-
output :
|
15
|
+
output :value_unmasked, {
|
16
16
|
name: "o_#{full_name}_unmasked", data_type: :logic, width: width,
|
17
17
|
array_size: array_size, array_format: array_port_format
|
18
18
|
}
|
@@ -4,7 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, :ro) do
|
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
|
-
input :
|
7
|
+
input :value_in, {
|
8
8
|
name: "i_#{full_name}", data_type: :logic, width: width,
|
9
9
|
array_size: array_size, array_format: array_port_format
|
10
10
|
}
|
@@ -3,11 +3,11 @@
|
|
3
3
|
RgGen.define_list_item_feature(:bit_field, :type, [:rs, :w0s, :w1s]) do
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
|
-
input :
|
6
|
+
input :clear, {
|
7
7
|
name: "i_#{full_name}_clear", data_type: :logic, width: width,
|
8
8
|
array_size: array_size, array_format: array_port_format
|
9
9
|
}
|
10
|
-
output :
|
10
|
+
output :value_out, {
|
11
11
|
name: "o_#{full_name}", data_type: :logic, width: width,
|
12
12
|
array_size: array_size, array_format: array_port_format
|
13
13
|
}
|