rggen-systemverilog 0.34.0 → 0.35.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/rggen/systemverilog/common/feature.rb +15 -8
- data/lib/rggen/systemverilog/ral/bit_field/type.rb +13 -5
- data/lib/rggen/systemverilog/ral/register/type.rb +3 -3
- data/lib/rggen/systemverilog/ral/register_common.rb +1 -1
- data/lib/rggen/systemverilog/ral/register_file/sv_ral_model.rb +3 -3
- data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +15 -23
- data/lib/rggen/systemverilog/rtl/bit_field/type/custom.rb +8 -16
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.rb +3 -6
- data/lib/rggen/systemverilog/rtl/bit_field/type/ro_rotrg.rb +2 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/rohw.rb +3 -6
- data/lib/rggen/systemverilog/rtl/bit_field/type/row0trg_row1trg.rb +2 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/rowo_rowotrg.rb +4 -8
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.rb +2 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/rw_rwtrg_w1.rb +3 -6
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.rb +2 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwhw.rb +3 -6
- data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +2 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb +1 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.rb +1 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/wo_wo1_wotrg.rb +2 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.rb +1 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type.rb +2 -6
- data/lib/rggen/systemverilog/rtl/bit_field_index.rb +18 -9
- data/lib/rggen/systemverilog/rtl/register_block/protocol/avalon.erb +17 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/avalon.rb +37 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/native.erb +1 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/native.rb +3 -0
- data/lib/rggen/systemverilog/rtl/register_index.rb +8 -8
- data/lib/rggen/systemverilog/rtl.rb +1 -1
- data/lib/rggen/systemverilog/version.rb +1 -1
- metadata +5 -4
- data/lib/rggen/systemverilog/rtl/global/array_port_format.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d847affbd147ff2959eb902a7faafde4e99b9612a65ea0d001508a86fcb94862
|
4
|
+
data.tar.gz: 4e1a31f3c1f8fa082fed1eb115ad01f4e06f4310dd7dc99fe91ec2d66886d038
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c6084365cfaa7de447a6f5022646f42fa2e6e7eb7f713cd7d1ce4ed6d4b758795d4e66442c8c016ccb46d2fbbe38cb0b881068ab75d3780a4a7ac42797b91ff
|
7
|
+
data.tar.gz: 140f2292d953d72185b0bf03a04b55818ca29618a3b23f8f4ed02b38ff5833b277cb06dfe89bd472722b7c930f72e43aeca7bcbb70f39506ceb8be5ebf9c5a74
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
[![Gem Version](https://badge.fury.io/rb/rggen-systemverilog.svg)](https://badge.fury.io/rb/rggen-systemverilog)
|
2
2
|
[![CI](https://github.com/rggen/rggen-systemverilog/workflows/CI/badge.svg)](https://github.com/rggen/rggen-systemverilog/actions?query=workflow%3ACI)
|
3
|
-
[![Maintainability](https://
|
3
|
+
[![Maintainability](https://qlty.sh/badges/1b06df23-43bd-413d-90f9-b98c565be895/maintainability.svg)](https://qlty.sh/gh/rggen/projects/rggen-systemverilog)
|
4
4
|
[![codecov](https://codecov.io/gh/rggen/rggen-systemverilog/branch/master/graph/badge.svg)](https://codecov.io/gh/rggen/rggen-systemverilog)
|
5
5
|
[![Gitter](https://badges.gitter.im/rggen/rggen.svg)](https://gitter.im/rggen/rggen?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
6
6
|
|
@@ -16,14 +16,10 @@ module RgGen
|
|
16
16
|
def define_entity(entity_type, method, declaration_type, default_layer)
|
17
17
|
context =
|
18
18
|
EntityContext.new(entity_type, method, declaration_type, default_layer)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
raise ArgumentError.new(message)
|
24
|
-
end
|
25
|
-
define_entity(context, name, args, &block)
|
26
|
-
end
|
19
|
+
feature_hash_variable_store(:@entity_contexts, entity_type, context)
|
20
|
+
|
21
|
+
return if method_defined?(entity_type)
|
22
|
+
public alias_method(entity_type, :entity_method)
|
27
23
|
end
|
28
24
|
end
|
29
25
|
|
@@ -38,6 +34,17 @@ module RgGen
|
|
38
34
|
@package_imports = Hash.new { |h, k| h[k] = [] }
|
39
35
|
end
|
40
36
|
|
37
|
+
def entity_method(name, *args, &)
|
38
|
+
if args.size >= 3
|
39
|
+
message = 'wrong number of arguments ' \
|
40
|
+
"(given #{args.size + 1}, expected 1..3)"
|
41
|
+
raise ArgumentError.new(message)
|
42
|
+
end
|
43
|
+
|
44
|
+
context = feature_hash_variable_fetch(:@entity_contexts, __callee__)
|
45
|
+
define_entity(context, name, args, &)
|
46
|
+
end
|
47
|
+
|
41
48
|
def define_entity(context, name, args, &)
|
42
49
|
layer, attributes = parse_entity_arguments(args)
|
43
50
|
entity = create_entity(context, name, attributes, &)
|
@@ -49,13 +49,14 @@ RgGen.define_list_feature(:bit_field, :type) do
|
|
49
49
|
private
|
50
50
|
|
51
51
|
def array_size
|
52
|
-
|
52
|
+
bit_field.sequence_size&.then { [_1] }
|
53
53
|
end
|
54
54
|
|
55
55
|
def arguments(index)
|
56
56
|
[
|
57
57
|
ral_model[index], bit_field.lsb(index), bit_field.width, string(access),
|
58
|
-
volatile, reset_value
|
58
|
+
volatile, reset_value, reset_values, valid_reset,
|
59
|
+
index || 0, bit_field.sequence_size || 0, string(reference)
|
59
60
|
]
|
60
61
|
end
|
61
62
|
|
@@ -63,12 +64,19 @@ RgGen.define_list_feature(:bit_field, :type) do
|
|
63
64
|
bit_field.volatile? && 1 || 0
|
64
65
|
end
|
65
66
|
|
66
|
-
def reset_value
|
67
|
-
value =
|
68
|
-
bit_field.initial_values&.at(index) || bit_field.initial_value || 0
|
67
|
+
def reset_value
|
68
|
+
value = bit_field.initial_value || 0
|
69
69
|
hex(value, bit_field.width)
|
70
70
|
end
|
71
71
|
|
72
|
+
def reset_values
|
73
|
+
values =
|
74
|
+
bit_field
|
75
|
+
.initial_values(flatten: true)
|
76
|
+
&.map { |value| hex(value, bit_field.width) }
|
77
|
+
array(values)
|
78
|
+
end
|
79
|
+
|
72
80
|
def valid_reset
|
73
81
|
bit_field.initial_value? && 1 || 0
|
74
82
|
end
|
@@ -32,7 +32,7 @@ RgGen.define_list_feature(:register, :type) do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def constructors
|
35
|
-
|
35
|
+
array_indexes.map.with_index(&method(:constructor_code))
|
36
36
|
end
|
37
37
|
|
38
38
|
private
|
@@ -55,8 +55,8 @@ RgGen.define_list_feature(:register, :type) do
|
|
55
55
|
|
56
56
|
def arguments(array_index, index)
|
57
57
|
[
|
58
|
-
ral_model[array_index], array(array_index),
|
59
|
-
string(access_rights), string(hdl_path(array_index))
|
58
|
+
ral_model[array_index], array(array_index), array(register.array_size),
|
59
|
+
offset_address(index), string(access_rights), string(hdl_path(array_index))
|
60
60
|
]
|
61
61
|
end
|
62
62
|
|
@@ -14,7 +14,7 @@ RgGen.define_simple_feature(:register_file, :sv_ral_model) do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def constructors
|
17
|
-
|
17
|
+
array_indexes.map.with_index(&method(:constructor_code))
|
18
18
|
end
|
19
19
|
|
20
20
|
main_code :ral_package do
|
@@ -37,8 +37,8 @@ RgGen.define_simple_feature(:register_file, :sv_ral_model) do
|
|
37
37
|
|
38
38
|
def arguments(array_index, index)
|
39
39
|
[
|
40
|
-
ral_model[array_index], array(array_index),
|
41
|
-
string(hdl_path(array_index))
|
40
|
+
ral_model[array_index], array(array_index), array(register_file.array_size),
|
41
|
+
offset_address(index), string(hdl_path(array_index))
|
42
42
|
]
|
43
43
|
end
|
44
44
|
|
@@ -10,20 +10,17 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
10
10
|
if fixed_initial_value?
|
11
11
|
localparam :initial_value, {
|
12
12
|
name: initial_value_name, data_type: :bit, width: bit_field.width,
|
13
|
-
array_size: initial_value_size,
|
14
|
-
default: initial_value_rhs
|
13
|
+
array_size: initial_value_size, default: initial_value_rhs
|
15
14
|
}
|
16
15
|
elsif initial_value?
|
17
16
|
parameter :initial_value, {
|
18
17
|
name: initial_value_name, data_type: :bit, width: bit_field.width,
|
19
|
-
array_size: initial_value_size,
|
20
|
-
default: initial_value_rhs
|
18
|
+
array_size: initial_value_size, default: initial_value_rhs
|
21
19
|
}
|
22
20
|
end
|
23
21
|
interface :bit_field_sub_if, {
|
24
22
|
name: 'bit_field_sub_if',
|
25
|
-
interface_type: 'rggen_bit_field_if',
|
26
|
-
parameter_values: [bit_field.width]
|
23
|
+
interface_type: 'rggen_bit_field_if', parameter_values: [bit_field.width]
|
27
24
|
}
|
28
25
|
end
|
29
26
|
|
@@ -49,7 +46,7 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
49
46
|
end
|
50
47
|
|
51
48
|
def register_if(offsets)
|
52
|
-
index = register.index(offsets || register.
|
49
|
+
index = register.index(offsets || register.local_indexes)
|
53
50
|
register_block.register_if[index]
|
54
51
|
end
|
55
52
|
|
@@ -61,25 +58,17 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
61
58
|
end
|
62
59
|
|
63
60
|
def initial_value_size
|
64
|
-
initial_value_array? &&
|
65
|
-
end
|
66
|
-
|
67
|
-
def initial_value_format
|
68
|
-
fixed_initial_value? && :unpacked ||
|
69
|
-
configuration.array_port_format
|
61
|
+
initial_value_array? && array_size || nil
|
70
62
|
end
|
71
63
|
|
72
64
|
def initial_value_rhs
|
73
|
-
initial_value_array?
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
if fixed_initial_value?
|
78
|
-
array(sized_initial_values)
|
79
|
-
elsif initial_value_format == :unpacked
|
80
|
-
array(default: sized_initial_value)
|
65
|
+
if !initial_value_array?
|
66
|
+
sized_initial_value
|
67
|
+
elsif fixed_initial_value?
|
68
|
+
concat(sized_initial_values)
|
81
69
|
else
|
82
|
-
|
70
|
+
size = array_size.inject(:*)
|
71
|
+
repeat(size, sized_initial_value)
|
83
72
|
end
|
84
73
|
end
|
85
74
|
|
@@ -89,7 +78,10 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
|
|
89
78
|
end
|
90
79
|
|
91
80
|
def sized_initial_values
|
92
|
-
bit_field
|
81
|
+
bit_field
|
82
|
+
.initial_values(flatten: true)
|
83
|
+
.map { |v| hex(v, bit_field.width) }
|
84
|
+
.reverse
|
93
85
|
end
|
94
86
|
|
95
87
|
def loop_size
|
@@ -5,47 +5,39 @@ RgGen.define_list_item_feature(:bit_field, :type, :custom) do
|
|
5
5
|
build do
|
6
6
|
if external_read_data?
|
7
7
|
input :value_in, {
|
8
|
-
name: "i_#{full_name}", width:,
|
9
|
-
array_size:, array_format: array_port_format
|
8
|
+
name: "i_#{full_name}", width:, array_size:
|
10
9
|
}
|
11
10
|
else
|
12
11
|
output :value_out, {
|
13
|
-
name: "o_#{full_name}", width:,
|
14
|
-
array_size:, array_format: array_port_format
|
12
|
+
name: "o_#{full_name}", width:, array_size:
|
15
13
|
}
|
16
14
|
end
|
17
15
|
if bit_field.hw_write?
|
18
16
|
input :hw_write_enable, {
|
19
|
-
name: "i_#{full_name}_hw_write_enable", width: 1,
|
20
|
-
array_size:, array_format: array_port_format
|
17
|
+
name: "i_#{full_name}_hw_write_enable", width: 1, array_size:
|
21
18
|
}
|
22
19
|
input :hw_write_data, {
|
23
|
-
name: "i_#{full_name}_hw_write_data", width:,
|
24
|
-
array_size:, array_format: array_port_format
|
20
|
+
name: "i_#{full_name}_hw_write_data", width:, array_size:
|
25
21
|
}
|
26
22
|
end
|
27
23
|
if bit_field.hw_set?
|
28
24
|
input :hw_set, {
|
29
|
-
name: "i_#{full_name}_hw_set", width:,
|
30
|
-
array_size:, array_format: array_port_format
|
25
|
+
name: "i_#{full_name}_hw_set", width:, array_size:
|
31
26
|
}
|
32
27
|
end
|
33
28
|
if bit_field.hw_clear?
|
34
29
|
input :hw_clear, {
|
35
|
-
name: "i_#{full_name}_hw_clear", width:,
|
36
|
-
array_size:, array_format: array_port_format
|
30
|
+
name: "i_#{full_name}_hw_clear", width:, array_size:
|
37
31
|
}
|
38
32
|
end
|
39
33
|
if bit_field.write_trigger?
|
40
34
|
output :write_trigger, {
|
41
|
-
name: "o_#{full_name}_write_trigger", width: 1,
|
42
|
-
array_size:, array_format: array_port_format
|
35
|
+
name: "o_#{full_name}_write_trigger", width: 1, array_size:
|
43
36
|
}
|
44
37
|
end
|
45
38
|
if bit_field.read_trigger?
|
46
39
|
output :read_trigger, {
|
47
|
-
name: "o_#{full_name}_read_trigger", width: 1,
|
48
|
-
array_size:, array_format: array_port_format
|
40
|
+
name: "o_#{full_name}_read_trigger", width: 1, array_size:
|
49
41
|
}
|
50
42
|
end
|
51
43
|
end
|
@@ -4,17 +4,14 @@ RgGen.define_list_item_feature(:bit_field, :type, [:rc, :w0c, :w1c, :wc, :woc])
|
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
6
|
input :set, {
|
7
|
-
name: "i_#{full_name}_set", width:,
|
8
|
-
array_size:, array_format: array_port_format
|
7
|
+
name: "i_#{full_name}_set", width:, array_size:
|
9
8
|
}
|
10
9
|
output :value_out, {
|
11
|
-
name: "o_#{full_name}", width:,
|
12
|
-
array_size:, array_format: array_port_format
|
10
|
+
name: "o_#{full_name}", width:, array_size:
|
13
11
|
}
|
14
12
|
if bit_field.reference?
|
15
13
|
output :value_unmasked, {
|
16
|
-
name: "o_#{full_name}_unmasked", width:,
|
17
|
-
array_size:, array_format: array_port_format
|
14
|
+
name: "o_#{full_name}_unmasked", width:, array_size:
|
18
15
|
}
|
19
16
|
end
|
20
17
|
end
|
@@ -5,14 +5,12 @@ RgGen.define_list_item_feature(:bit_field, :type, [:ro, :rotrg]) do
|
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
7
|
input :value_in, {
|
8
|
-
name: "i_#{full_name}", width:,
|
9
|
-
array_size:, array_format: array_port_format
|
8
|
+
name: "i_#{full_name}", width:, array_size:
|
10
9
|
}
|
11
10
|
end
|
12
11
|
if rotrg?
|
13
12
|
output :read_trigger, {
|
14
|
-
name: "o_#{full_name}_read_trigger", width: 1,
|
15
|
-
array_size:, array_format: array_port_format
|
13
|
+
name: "o_#{full_name}_read_trigger", width: 1, array_size:
|
16
14
|
}
|
17
15
|
end
|
18
16
|
end
|
@@ -5,17 +5,14 @@ RgGen.define_list_item_feature(:bit_field, :type, :rohw) do
|
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
7
|
input :valid, {
|
8
|
-
name: "i_#{full_name}_valid", width: 1,
|
9
|
-
array_size:, array_format: array_port_format
|
8
|
+
name: "i_#{full_name}_valid", width: 1, array_size:
|
10
9
|
}
|
11
10
|
end
|
12
11
|
input :value_in, {
|
13
|
-
name: "i_#{full_name}", width:,
|
14
|
-
array_size:, array_format: array_port_format
|
12
|
+
name: "i_#{full_name}", width:, array_size:
|
15
13
|
}
|
16
14
|
output :value_out, {
|
17
|
-
name: "o_#{full_name}", width:,
|
18
|
-
array_size:, array_format: array_port_format
|
15
|
+
name: "o_#{full_name}", width:, array_size:
|
19
16
|
}
|
20
17
|
end
|
21
18
|
|
@@ -5,13 +5,11 @@ RgGen.define_list_item_feature(:bit_field, :type, [:row0trg, :row1trg]) do
|
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
7
|
input :value_in, {
|
8
|
-
name: "i_#{full_name}", width:,
|
9
|
-
array_size:, array_format: array_port_format
|
8
|
+
name: "i_#{full_name}", width:, array_size:
|
10
9
|
}
|
11
10
|
end
|
12
11
|
output :trigger, {
|
13
|
-
name: "o_#{full_name}_trigger", width:,
|
14
|
-
array_size:, array_format: array_port_format
|
12
|
+
name: "o_#{full_name}_trigger", width:, array_size:
|
15
13
|
}
|
16
14
|
end
|
17
15
|
|
@@ -4,23 +4,19 @@ RgGen.define_list_item_feature(:bit_field, :type, [:rowo, :rowotrg]) do
|
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
6
|
output :value_out, {
|
7
|
-
name: "o_#{full_name}", width:,
|
8
|
-
array_size:, array_format: array_port_format
|
7
|
+
name: "o_#{full_name}", width:, array_size:
|
9
8
|
}
|
10
9
|
unless bit_field.reference?
|
11
10
|
input :value_in, {
|
12
|
-
name: "i_#{full_name}", width:,
|
13
|
-
array_size:, array_format: array_port_format
|
11
|
+
name: "i_#{full_name}", width:, array_size:
|
14
12
|
}
|
15
13
|
end
|
16
14
|
if rowotrg?
|
17
15
|
output :write_trigger, {
|
18
|
-
name: "o_#{full_name}_write_trigger", width: 1,
|
19
|
-
array_size:, array_format: array_port_format
|
16
|
+
name: "o_#{full_name}_write_trigger", width: 1, array_size:
|
20
17
|
}
|
21
18
|
output :read_trigger, {
|
22
|
-
name: "o_#{full_name}_read_trigger", width: 1,
|
23
|
-
array_size:, array_format: array_port_format
|
19
|
+
name: "o_#{full_name}_read_trigger", width: 1, array_size:
|
24
20
|
}
|
25
21
|
end
|
26
22
|
end
|
@@ -4,12 +4,10 @@ RgGen.define_list_item_feature(:bit_field, :type, [:rs, :w0s, :w1s, :ws, :wos])
|
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
6
|
input :clear, {
|
7
|
-
name: "i_#{full_name}_clear", width:,
|
8
|
-
array_size:, array_format: array_port_format
|
7
|
+
name: "i_#{full_name}_clear", width:, array_size:
|
9
8
|
}
|
10
9
|
output :value_out, {
|
11
|
-
name: "o_#{full_name}", width:,
|
12
|
-
array_size:, array_format: array_port_format
|
10
|
+
name: "o_#{full_name}", width:, array_size:
|
13
11
|
}
|
14
12
|
end
|
15
13
|
|
@@ -4,17 +4,14 @@ RgGen.define_list_item_feature(:bit_field, :type, [:rw, :rwtrg, :w1]) do
|
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
6
|
output :value_out, {
|
7
|
-
name: "o_#{full_name}", width:,
|
8
|
-
array_size:, array_format: array_port_format
|
7
|
+
name: "o_#{full_name}", width:, array_size:
|
9
8
|
}
|
10
9
|
if rwtrg?
|
11
10
|
output :write_trigger, {
|
12
|
-
name: "o_#{full_name}_write_trigger", width: 1,
|
13
|
-
array_size:, array_format: array_port_format
|
11
|
+
name: "o_#{full_name}_write_trigger", width: 1, array_size:
|
14
12
|
}
|
15
13
|
output :read_trigger, {
|
16
|
-
name: "o_#{full_name}_read_trigger", width: 1,
|
17
|
-
array_size:, array_format: array_port_format
|
14
|
+
name: "o_#{full_name}_read_trigger", width: 1, array_size:
|
18
15
|
}
|
19
16
|
end
|
20
17
|
end
|
@@ -5,13 +5,11 @@ RgGen.define_list_item_feature(:bit_field, :type, :rwc) do
|
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
7
|
input :clear, {
|
8
|
-
name: "i_#{full_name}_clear", width: 1,
|
9
|
-
array_size:, array_format: array_port_format
|
8
|
+
name: "i_#{full_name}_clear", width: 1, array_size:
|
10
9
|
}
|
11
10
|
end
|
12
11
|
output :value_out, {
|
13
|
-
name: "o_#{full_name}", width:,
|
14
|
-
array_size:, array_format: array_port_format
|
12
|
+
name: "o_#{full_name}", width:, array_size:
|
15
13
|
}
|
16
14
|
end
|
17
15
|
|
@@ -5,13 +5,11 @@ RgGen.define_list_item_feature(:bit_field, :type, [:rwe, :rwl]) do
|
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
7
|
input :control, {
|
8
|
-
name: "i_#{full_name}_#{enable_or_lock}", width: 1,
|
9
|
-
array_size:, array_format: array_port_format
|
8
|
+
name: "i_#{full_name}_#{enable_or_lock}", width: 1, array_size:
|
10
9
|
}
|
11
10
|
end
|
12
11
|
output :value_out, {
|
13
|
-
name: "o_#{full_name}", width:,
|
14
|
-
array_size:, array_format: array_port_format
|
12
|
+
name: "o_#{full_name}", width:, array_size:
|
15
13
|
}
|
16
14
|
end
|
17
15
|
|
@@ -5,17 +5,14 @@ RgGen.define_list_item_feature(:bit_field, :type, :rwhw) do
|
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
7
|
input :valid, {
|
8
|
-
name: "i_#{full_name}_valid", width: 1,
|
9
|
-
array_size:, array_format: array_port_format
|
8
|
+
name: "i_#{full_name}_valid", width: 1, array_size:
|
10
9
|
}
|
11
10
|
end
|
12
11
|
input :value_in, {
|
13
|
-
name: "i_#{full_name}", width:,
|
14
|
-
array_size:, array_format: array_port_format
|
12
|
+
name: "i_#{full_name}", width:, array_size:
|
15
13
|
}
|
16
14
|
output :value_out, {
|
17
|
-
name: "o_#{full_name}", width:,
|
18
|
-
array_size:, array_format: array_port_format
|
15
|
+
name: "o_#{full_name}", width:, array_size:
|
19
16
|
}
|
20
17
|
end
|
21
18
|
|
@@ -5,13 +5,11 @@ RgGen.define_list_item_feature(:bit_field, :type, :rws) do
|
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
7
|
input :set, {
|
8
|
-
name: "i_#{full_name}_set", width: 1,
|
9
|
-
array_size:, array_format: array_port_format
|
8
|
+
name: "i_#{full_name}_set", width: 1, array_size:
|
10
9
|
}
|
11
10
|
end
|
12
11
|
output :value_out, {
|
13
|
-
name: "o_#{full_name}", width:,
|
14
|
-
array_size:, array_format: array_port_format
|
12
|
+
name: "o_#{full_name}", width:, array_size:
|
15
13
|
}
|
16
14
|
end
|
17
15
|
|
@@ -4,8 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:w0trg, :w1trg]) do
|
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
6
|
output :trigger, {
|
7
|
-
name: "o_#{full_name}_trigger", width:,
|
8
|
-
array_size:, array_format: array_port_format
|
7
|
+
name: "o_#{full_name}_trigger", width:, array_size:
|
9
8
|
}
|
10
9
|
end
|
11
10
|
|
@@ -4,13 +4,11 @@ RgGen.define_list_item_feature(:bit_field, :type, [:wo, :wo1, :wotrg]) do
|
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
6
|
output :value_out, {
|
7
|
-
name: "o_#{full_name}", width:,
|
8
|
-
array_size:, array_format: array_port_format
|
7
|
+
name: "o_#{full_name}", width:, array_size:
|
9
8
|
}
|
10
9
|
if wotrg?
|
11
10
|
output :write_trigger, {
|
12
|
-
name: "o_#{full_name}_write_trigger", width: 1,
|
13
|
-
array_size:, array_format: array_port_format
|
11
|
+
name: "o_#{full_name}_write_trigger", width: 1, array_size:
|
14
12
|
}
|
15
13
|
end
|
16
14
|
end
|
@@ -9,10 +9,6 @@ RgGen.define_list_feature(:bit_field, :type) do
|
|
9
9
|
|
10
10
|
private
|
11
11
|
|
12
|
-
def array_port_format
|
13
|
-
configuration.array_port_format
|
14
|
-
end
|
15
|
-
|
16
12
|
def full_name
|
17
13
|
bit_field.full_name('_')
|
18
14
|
end
|
@@ -38,7 +34,7 @@ RgGen.define_list_feature(:bit_field, :type) do
|
|
38
34
|
end
|
39
35
|
|
40
36
|
def initial_value
|
41
|
-
index = bit_field.initial_value_array? &&
|
37
|
+
index = bit_field.initial_value_array? && loop_variables || nil
|
42
38
|
bit_field.initial_value[index]
|
43
39
|
end
|
44
40
|
|
@@ -50,7 +46,7 @@ RgGen.define_list_feature(:bit_field, :type) do
|
|
50
46
|
bit_field.reference? &&
|
51
47
|
bit_field
|
52
48
|
.find_reference(register_block.bit_fields)
|
53
|
-
.value(bit_field.
|
49
|
+
.value(bit_field.local_indexes, bit_field.reference_width)
|
54
50
|
end
|
55
51
|
|
56
52
|
def bit_field_if
|
@@ -5,7 +5,7 @@ module RgGen
|
|
5
5
|
module RTL
|
6
6
|
module BitFieldIndex
|
7
7
|
EXPORTED_METHODS = [
|
8
|
-
:local_index, :
|
8
|
+
:local_index, :local_indexes, :loop_variables, :flat_loop_index, :array_size
|
9
9
|
].freeze
|
10
10
|
|
11
11
|
def self.included(feature)
|
@@ -18,8 +18,8 @@ module RgGen
|
|
18
18
|
create_identifier(local_index_name)
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
[*register.
|
21
|
+
def local_indexes
|
22
|
+
[*register.local_indexes, local_index_name]
|
23
23
|
end
|
24
24
|
|
25
25
|
def loop_variables
|
@@ -27,13 +27,22 @@ module RgGen
|
|
27
27
|
[*register.loop_variables, local_index].compact
|
28
28
|
end
|
29
29
|
|
30
|
+
def flat_loop_index
|
31
|
+
return unless inside_loop?
|
32
|
+
|
33
|
+
size = array_size
|
34
|
+
factors =
|
35
|
+
Array.new(size.size) { |i| size[(i + 1)..].inject(1, :*) }
|
36
|
+
factors
|
37
|
+
.zip(loop_variables)
|
38
|
+
.map { |f, v| f == 1 && v || "#{f}*#{v}" }
|
39
|
+
.join('+')
|
40
|
+
end
|
41
|
+
|
30
42
|
def array_size
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
*register.array_size,
|
35
|
-
*bit_field.sequence_size
|
36
|
-
].compact
|
43
|
+
return unless inside_loop?
|
44
|
+
|
45
|
+
[*register.array_size(hierarchical: true), *bit_field.sequence_size]
|
37
46
|
end
|
38
47
|
|
39
48
|
private
|
@@ -0,0 +1,17 @@
|
|
1
|
+
rggen_avalon_adapter #(
|
2
|
+
.ADDRESS_WIDTH (<%= address_width %>),
|
3
|
+
.LOCAL_ADDRESS_WIDTH (<%= local_address_width %>),
|
4
|
+
.BUS_WIDTH (<%= bus_width %>),
|
5
|
+
.REGISTERS (<%= total_registers %>),
|
6
|
+
.PRE_DECODE (<%= pre_decode %>),
|
7
|
+
.BASE_ADDRESS (<%= base_address %>),
|
8
|
+
.BYTE_SIZE (<%= byte_size %>),
|
9
|
+
.ERROR_STATUS (<%= error_status %>),
|
10
|
+
.DEFAULT_READ_DATA (<%= default_read_data %>),
|
11
|
+
.INSERT_SLICER (<%= insert_slicer %>)
|
12
|
+
) u_adapter (
|
13
|
+
.i_clk (<%= clock %>),
|
14
|
+
.i_rst_n (<%= reset %>),
|
15
|
+
.avalon_if (<%= avalon_if %>),
|
16
|
+
.register_if (<%= register_if %>)
|
17
|
+
);
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register_block, :protocol, :avalon) do
|
4
|
+
register_map do
|
5
|
+
verify(:component) do
|
6
|
+
error_condition { configuration.address_width > 64 }
|
7
|
+
message do
|
8
|
+
'address width over 64 bits is not supported: ' \
|
9
|
+
"#{configuration.address_width}"
|
10
|
+
end
|
11
|
+
position do
|
12
|
+
configuration.feature(:address_width).position
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
verify(:component) do
|
17
|
+
error_condition { register_block.bus_width > 1024 }
|
18
|
+
message do
|
19
|
+
'bus width over 1024 bits is not supported: ' \
|
20
|
+
"#{register_block.bus_width}"
|
21
|
+
end
|
22
|
+
position do
|
23
|
+
register_block.feature(:bus_width).position
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
sv_rtl do
|
29
|
+
build do
|
30
|
+
interface_port :avalon_if, {
|
31
|
+
name: 'avalon_if', interface_type: 'rggen_avalon_if', modport: 'agent'
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
main_code :register_block, from_template: true
|
36
|
+
end
|
37
|
+
end
|
@@ -7,6 +7,7 @@ rggen_native_adapter #(
|
|
7
7
|
.PRE_DECODE (<%= pre_decode %>),
|
8
8
|
.BASE_ADDRESS (<%= base_address %>),
|
9
9
|
.BYTE_SIZE (<%= byte_size %>),
|
10
|
+
.USE_READ_STROBE (<%= use_read_strobe %>),
|
10
11
|
.ERROR_STATUS (<%= error_status %>),
|
11
12
|
.DEFAULT_READ_DATA (<%= default_read_data %>),
|
12
13
|
.INSERT_SLICER (<%= insert_slicer %>)
|
@@ -6,6 +6,9 @@ RgGen.define_list_item_feature(:register_block, :protocol, :native) do
|
|
6
6
|
parameter :strobe_width, {
|
7
7
|
name: 'STROBE_WIDTH', data_type: :int, default: bus_width / 8
|
8
8
|
}
|
9
|
+
parameter :use_read_strobe, {
|
10
|
+
name: 'USE_READ_STROBE', data_type: :bit, default: 0
|
11
|
+
}
|
9
12
|
interface_port :csrbus_if, {
|
10
13
|
name: 'csrbus_if', interface_type: 'rggen_bus_if', modport: 'slave'
|
11
14
|
}
|
@@ -8,7 +8,7 @@ module RgGen
|
|
8
8
|
|
9
9
|
EXPORTED_METHODS = [
|
10
10
|
:loop_variables, :local_loop_variables,
|
11
|
-
:local_index, :
|
11
|
+
:local_index, :local_indexes,
|
12
12
|
:index, :inside_loop?
|
13
13
|
].freeze
|
14
14
|
|
@@ -45,15 +45,15 @@ module RgGen
|
|
45
45
|
.join('+')
|
46
46
|
end
|
47
47
|
|
48
|
-
def
|
49
|
-
[*upper_register_file&.
|
48
|
+
def local_indexes
|
49
|
+
[*upper_register_file&.local_indexes, local_index]
|
50
50
|
end
|
51
51
|
|
52
52
|
def index(offset_or_offsets = nil)
|
53
53
|
offset_or_offsets
|
54
54
|
.then(&method(:index_operands))
|
55
55
|
.then(&method(:partial_sums))
|
56
|
-
.then(&method(:
|
56
|
+
.then(&method(:reduce_indexes))
|
57
57
|
end
|
58
58
|
|
59
59
|
def inside_loop?
|
@@ -84,11 +84,11 @@ module RgGen
|
|
84
84
|
]
|
85
85
|
end
|
86
86
|
|
87
|
-
def
|
88
|
-
if
|
89
|
-
|
87
|
+
def reduce_indexes(indexes)
|
88
|
+
if indexes.empty? || indexes.all?(&method(:integer?))
|
89
|
+
indexes.sum
|
90
90
|
else
|
91
|
-
|
91
|
+
indexes.join('+')
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
@@ -21,11 +21,11 @@ RgGen.setup_plugin :'rggen-sv-rtl' do |plugin|
|
|
21
21
|
end
|
22
22
|
|
23
23
|
plugin.files [
|
24
|
-
'rtl/global/array_port_format',
|
25
24
|
'rtl/register_block/sv_rtl_top',
|
26
25
|
'rtl/register_block/protocol',
|
27
26
|
'rtl/register_block/protocol/apb',
|
28
27
|
'rtl/register_block/protocol/axi4lite',
|
28
|
+
'rtl/register_block/protocol/avalon',
|
29
29
|
'rtl/register_block/protocol/wishbone',
|
30
30
|
'rtl/register_block/protocol/native',
|
31
31
|
'rtl/register_file/sv_rtl_top',
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rggen-systemverilog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.35.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Taichi Ishitani
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-
|
10
|
+
date: 2025-02-19 00:00:00.000000000 Z
|
11
11
|
dependencies: []
|
12
12
|
description: 'SystemVerilog RTL and UVM RAL model generators for RgGen.
|
13
13
|
|
@@ -102,7 +102,6 @@ files:
|
|
102
102
|
- lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.rb
|
103
103
|
- lib/rggen/systemverilog/rtl/bit_field_index.rb
|
104
104
|
- lib/rggen/systemverilog/rtl/feature.rb
|
105
|
-
- lib/rggen/systemverilog/rtl/global/array_port_format.rb
|
106
105
|
- lib/rggen/systemverilog/rtl/indirect_index.rb
|
107
106
|
- lib/rggen/systemverilog/rtl/partial_sum.rb
|
108
107
|
- lib/rggen/systemverilog/rtl/register/sv_rtl_top.rb
|
@@ -117,6 +116,8 @@ files:
|
|
117
116
|
- lib/rggen/systemverilog/rtl/register_block/protocol.rb
|
118
117
|
- lib/rggen/systemverilog/rtl/register_block/protocol/apb.erb
|
119
118
|
- lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb
|
119
|
+
- lib/rggen/systemverilog/rtl/register_block/protocol/avalon.erb
|
120
|
+
- lib/rggen/systemverilog/rtl/register_block/protocol/avalon.rb
|
120
121
|
- lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.erb
|
121
122
|
- lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb
|
122
123
|
- lib/rggen/systemverilog/rtl/register_block/protocol/native.erb
|
@@ -158,5 +159,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
159
|
requirements: []
|
159
160
|
rubygems_version: 3.6.2
|
160
161
|
specification_version: 4
|
161
|
-
summary: rggen-systemverilog-0.
|
162
|
+
summary: rggen-systemverilog-0.35.0
|
162
163
|
test_files: []
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RgGen.define_simple_feature(:global, :array_port_format) do
|
4
|
-
configuration do
|
5
|
-
property :array_port_format, default: :packed
|
6
|
-
|
7
|
-
input_pattern /(packed|unpacked|serialized)/i
|
8
|
-
ignore_empty_value false
|
9
|
-
|
10
|
-
build do |value|
|
11
|
-
@array_port_format =
|
12
|
-
if pattern_matched?
|
13
|
-
match_data[1].downcase.to_sym
|
14
|
-
else
|
15
|
-
error "illegal input value for array port format: #{value.inspect}"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
printable :array_port_format
|
20
|
-
end
|
21
|
-
end
|