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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/rggen/systemverilog/common/feature.rb +15 -8
  4. data/lib/rggen/systemverilog/ral/bit_field/type.rb +13 -5
  5. data/lib/rggen/systemverilog/ral/register/type.rb +3 -3
  6. data/lib/rggen/systemverilog/ral/register_common.rb +1 -1
  7. data/lib/rggen/systemverilog/ral/register_file/sv_ral_model.rb +3 -3
  8. data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +15 -23
  9. data/lib/rggen/systemverilog/rtl/bit_field/type/custom.rb +8 -16
  10. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.rb +3 -6
  11. data/lib/rggen/systemverilog/rtl/bit_field/type/ro_rotrg.rb +2 -4
  12. data/lib/rggen/systemverilog/rtl/bit_field/type/rohw.rb +3 -6
  13. data/lib/rggen/systemverilog/rtl/bit_field/type/row0trg_row1trg.rb +2 -4
  14. data/lib/rggen/systemverilog/rtl/bit_field/type/rowo_rowotrg.rb +4 -8
  15. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.rb +2 -4
  16. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_rwtrg_w1.rb +3 -6
  17. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -4
  18. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.rb +2 -4
  19. data/lib/rggen/systemverilog/rtl/bit_field/type/rwhw.rb +3 -6
  20. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +2 -4
  21. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb +1 -2
  22. data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.rb +1 -2
  23. data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -2
  24. data/lib/rggen/systemverilog/rtl/bit_field/type/wo_wo1_wotrg.rb +2 -4
  25. data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.rb +1 -2
  26. data/lib/rggen/systemverilog/rtl/bit_field/type.rb +2 -6
  27. data/lib/rggen/systemverilog/rtl/bit_field_index.rb +18 -9
  28. data/lib/rggen/systemverilog/rtl/register_block/protocol/avalon.erb +17 -0
  29. data/lib/rggen/systemverilog/rtl/register_block/protocol/avalon.rb +37 -0
  30. data/lib/rggen/systemverilog/rtl/register_block/protocol/native.erb +1 -0
  31. data/lib/rggen/systemverilog/rtl/register_block/protocol/native.rb +3 -0
  32. data/lib/rggen/systemverilog/rtl/register_index.rb +8 -8
  33. data/lib/rggen/systemverilog/rtl.rb +1 -1
  34. data/lib/rggen/systemverilog/version.rb +1 -1
  35. metadata +5 -4
  36. 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: 8cc342768f025e2052c86e0933fcf41ad2e61089992b0513fd36d05937745aea
4
- data.tar.gz: 3f9528a85fe70ec52d5e4237cdff2f498a4712082a5939a0caa379884f3f48e7
3
+ metadata.gz: d847affbd147ff2959eb902a7faafde4e99b9612a65ea0d001508a86fcb94862
4
+ data.tar.gz: 4e1a31f3c1f8fa082fed1eb115ad01f4e06f4310dd7dc99fe91ec2d66886d038
5
5
  SHA512:
6
- metadata.gz: 917f2b1026e1cd5bc124827ac04a2389b6466b92af6197022ba8b376c8eae568b1cb6fb55f605a3480430c6714d83ab3465f180f9b67dfce91ab8657d8f9ecb0
7
- data.tar.gz: 96cac8545993b73e14290d3bb950dd62912c514d9ff907e5f9315aa774644e7d1a833406b88c8462fedc69eb66f7d0d5008badca0f7086500047b5172c6d3a5f
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://api.codeclimate.com/v1/badges/88086c5be538a1564a35/maintainability)](https://codeclimate.com/github/rggen/rggen-systemverilog/maintainability)
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
- define_method(entity_type) do |name, *args, &block|
20
- if args.size >= 3
21
- message = 'wrong number of arguments ' \
22
- "(given #{args.size + 1}, expected 1..3)"
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
- Array(bit_field.sequence_size)
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(index), valid_reset, index || -1, string(reference)
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(index)
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
- array_indices.map.with_index(&method(:constructor_code))
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), offset_address(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
 
@@ -6,7 +6,7 @@ module RgGen
6
6
  module RegisterCommon
7
7
  private
8
8
 
9
- def array_indices
9
+ def array_indexes
10
10
  if component.array?
11
11
  index_table = component.array_size.map { |size| (0...size).to_a }
12
12
  index_table[0].product(*index_table[1..])
@@ -14,7 +14,7 @@ RgGen.define_simple_feature(:register_file, :sv_ral_model) do
14
14
  end
15
15
 
16
16
  def constructors
17
- array_indices.map.with_index(&method(:constructor_code))
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), offset_address(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, array_format: initial_value_format,
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, array_format: initial_value_format,
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.local_indices)
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? && [bit_field.sequence_size] || nil
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? && initial_value_array_rhs || sized_initial_value
74
- end
75
-
76
- def initial_value_array_rhs
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
- repeat(bit_field.sequence_size, sized_initial_value)
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.initial_values&.map { |v| hex(v, bit_field.width) }
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
 
@@ -6,8 +6,7 @@ RgGen.define_list_item_feature(
6
6
  sv_rtl do
7
7
  build do
8
8
  output :value_out, {
9
- name: "o_#{full_name}", width:,
10
- array_size:, array_format: array_port_format
9
+ name: "o_#{full_name}", width:, array_size:
11
10
  }
12
11
  end
13
12
 
@@ -4,8 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:w0t, :w1t]) 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
  end
11
10
 
@@ -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
@@ -4,8 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:wrc, :wrs]) 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
  end
11
10
 
@@ -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? && bit_field.local_index || nil
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.local_indices, bit_field.reference_width)
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, :local_indices, :loop_variables, :array_size
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 local_indices
22
- [*register.local_indices, local_index_name]
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
- (inside_loop? || nil) &&
32
- [
33
- *register_files.flat_map(&:array_size),
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, :local_indices,
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 local_indices
49
- [*upper_register_file&.local_indices, local_index]
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(:reduce_indices))
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 reduce_indices(indices)
88
- if indices.empty? || indices.all?(&method(:integer?))
89
- indices.sum
87
+ def reduce_indexes(indexes)
88
+ if indexes.empty? || indexes.all?(&method(:integer?))
89
+ indexes.sum
90
90
  else
91
- indices.join('+')
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',
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RgGen
4
4
  module SystemVerilog
5
- VERSION = '0.34.0'
5
+ VERSION = '0.35.0'
6
6
  end
7
7
  end
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.34.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-01-23 00:00:00.000000000 Z
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.34.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