rggen-systemverilog 0.15.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +2 -2
  4. data/lib/rggen/systemverilog/common.rb +2 -2
  5. data/lib/rggen/systemverilog/common/component.rb +2 -6
  6. data/lib/rggen/systemverilog/common/feature.rb +39 -26
  7. data/lib/rggen/systemverilog/common/utility.rb +9 -4
  8. data/lib/rggen/systemverilog/common/utility/data_object.rb +2 -2
  9. data/lib/rggen/systemverilog/common/utility/interface_instance.rb +2 -2
  10. data/lib/rggen/systemverilog/common/utility/interface_port.rb +9 -5
  11. data/lib/rggen/systemverilog/common/utility/local_scope.rb +8 -2
  12. data/lib/rggen/systemverilog/common/utility/structure_definition.rb +3 -5
  13. data/lib/rggen/systemverilog/ral.rb +4 -1
  14. data/lib/rggen/systemverilog/ral/bit_field/type.rb +23 -19
  15. data/lib/rggen/systemverilog/ral/bit_field/type/rwe_rwl.rb +1 -11
  16. data/lib/rggen/systemverilog/ral/feature.rb +5 -7
  17. data/lib/rggen/systemverilog/ral/register/type.rb +12 -54
  18. data/lib/rggen/systemverilog/ral/register/type/default.erb +1 -1
  19. data/lib/rggen/systemverilog/ral/register/type/external.rb +6 -10
  20. data/lib/rggen/systemverilog/ral/register/type/indirect.erb +3 -3
  21. data/lib/rggen/systemverilog/ral/register/type/indirect.rb +5 -2
  22. data/lib/rggen/systemverilog/ral/register_block/sv_ral_model.erb +8 -0
  23. data/lib/rggen/systemverilog/ral/register_block/sv_ral_model.rb +36 -0
  24. data/lib/rggen/systemverilog/ral/register_block/sv_ral_package.rb +1 -32
  25. data/lib/rggen/systemverilog/ral/register_common.rb +46 -0
  26. data/lib/rggen/systemverilog/ral/register_file/sv_ral_model.erb +8 -0
  27. data/lib/rggen/systemverilog/ral/register_file/sv_ral_model.rb +57 -0
  28. data/lib/rggen/systemverilog/ral/setup.rb +2 -1
  29. data/lib/rggen/systemverilog/rtl.rb +5 -2
  30. data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +92 -16
  31. data/lib/rggen/systemverilog/rtl/bit_field/type.rb +5 -8
  32. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.rb +3 -3
  33. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +1 -1
  34. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.rb +2 -2
  35. data/lib/rggen/systemverilog/rtl/bit_field/type/{rw_wo.erb → rw_w1_wo_wo1.erb} +4 -2
  36. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.rb +24 -0
  37. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -2
  38. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.rb +2 -2
  39. data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.rb +2 -2
  40. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +3 -3
  41. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w1crs.rb +1 -1
  42. data/lib/rggen/systemverilog/rtl/bit_field/type/w0src_w1src.rb +1 -1
  43. data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -1
  44. data/lib/rggen/systemverilog/rtl/feature.rb +13 -16
  45. data/lib/rggen/systemverilog/rtl/global/array_port_format.rb +2 -0
  46. data/lib/rggen/systemverilog/rtl/global/fold_sv_interface_port.rb +4 -0
  47. data/lib/rggen/systemverilog/rtl/partial_sum.rb +29 -0
  48. data/lib/rggen/systemverilog/rtl/register/sv_rtl_top.rb +10 -47
  49. data/lib/rggen/systemverilog/rtl/register/type.rb +30 -5
  50. data/lib/rggen/systemverilog/rtl/register/type/external.rb +15 -15
  51. data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +3 -3
  52. data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +14 -4
  53. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.erb +5 -3
  54. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +14 -15
  55. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.erb +6 -4
  56. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +23 -25
  57. data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +11 -13
  58. data/lib/rggen/systemverilog/rtl/register_file/sv_rtl_top.rb +30 -0
  59. data/lib/rggen/systemverilog/rtl/register_index.rb +112 -0
  60. data/lib/rggen/systemverilog/rtl/setup.rb +1 -0
  61. data/lib/rggen/systemverilog/version.rb +1 -1
  62. metadata +16 -9
  63. data/lib/rggen/systemverilog/ral/register_block/sv_ral_block_model.erb +0 -11
  64. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_wo.rb +0 -14
@@ -3,12 +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
- interface :bit_field, :bit_field_sub_if, {
12
+ if fixed_initial_value?
13
+ localparam :initial_value, {
14
+ name: initial_value_name, data_type: :bit, width: bit_field.width,
15
+ array_size: initial_value_size, array_format: initial_value_format,
16
+ default: initial_value_lhs
17
+ }
18
+ elsif initial_value?
19
+ parameter :initial_value, {
20
+ name: initial_value_name, data_type: :bit, width: bit_field.width,
21
+ array_size: initial_value_size, array_format: initial_value_format,
22
+ default: initial_value_lhs
23
+ }
24
+ end
25
+ interface :bit_field_sub_if, {
12
26
  name: 'bit_field_sub_if',
13
27
  interface_type: 'rggen_bit_field_if',
14
28
  parameter_values: [bit_field.width]
@@ -18,6 +32,7 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
18
32
  main_code :register do
19
33
  local_scope("g_#{bit_field.name}") do |scope|
20
34
  scope.loop_size loop_size
35
+ scope.parameters parameters
21
36
  scope.variables variables
22
37
  scope.body(&method(:body_code))
23
38
  end
@@ -28,13 +43,12 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
28
43
  end
29
44
 
30
45
  def local_index
31
- (bit_field.sequential? || nil) &&
46
+ (index_name = local_index_name) &&
32
47
  create_identifier(index_name)
33
48
  end
34
49
 
35
- def index_name
36
- depth = (register.loop_variables&.size || 0) + 1
37
- loop_index(depth)
50
+ def local_indices
51
+ [*register.local_indices, local_index_name]
38
52
  end
39
53
 
40
54
  def loop_variables
@@ -44,34 +58,96 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
44
58
 
45
59
  def array_size
46
60
  (inside_loop? || nil) &&
47
- [*register.array_size, bit_field.sequence_size].compact
61
+ [
62
+ *register_files.flat_map(&:array_size),
63
+ *register.array_size,
64
+ *bit_field.sequence_size
65
+ ].compact
48
66
  end
49
67
 
50
- def value(register_offset = nil, bit_field_offset = nil, width = nil)
51
- bit_field_offset ||= local_index
52
- width ||= bit_field.width
53
- register_block
54
- .register_if[register.index(register_offset)]
55
- .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]
56
72
  end
57
73
 
58
74
  private
59
75
 
76
+ [:fixed_initial_value?, :initial_value_array?, :initial_value?].each do |m|
77
+ define_method(m) { bit_field.__send__(__method__) }
78
+ end
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
+
93
+ def initial_value_name
94
+ identifiers = []
95
+ identifiers << bit_field.full_name('_') unless fixed_initial_value?
96
+ identifiers << 'initial_value'
97
+ identifiers.join('_').upcase
98
+ end
99
+
100
+ def initial_value_size
101
+ initial_value_array? && [bit_field.sequence_size] || nil
102
+ end
103
+
104
+ def initial_value_format
105
+ fixed_initial_value? && :unpacked ||
106
+ configuration.array_port_format
107
+ end
108
+
109
+ def initial_value_lhs
110
+ initial_value_array? && initial_value_array_lhs || sized_initial_value
111
+ end
112
+
113
+ def initial_value_array_lhs
114
+ if fixed_initial_value?
115
+ array(sized_initial_values)
116
+ elsif initial_value_format == :unpacked
117
+ array(default: sized_initial_value)
118
+ else
119
+ repeat(bit_field.sequence_size, sized_initial_value)
120
+ end
121
+ end
122
+
123
+ def sized_initial_value
124
+ bit_field.initial_value &&
125
+ hex(bit_field.initial_value, bit_field.width)
126
+ end
127
+
128
+ def sized_initial_values
129
+ bit_field.initial_values&.map { |v| hex(v, bit_field.width) }
130
+ end
131
+
60
132
  def inside_loop?
61
133
  register.array? || bit_field.sequential?
62
134
  end
63
135
 
64
136
  def loop_size
65
- (bit_field.sequential? || nil) &&
66
- { index_name => bit_field.sequence_size }
137
+ (loop_variable = local_index_name) &&
138
+ { loop_variable => bit_field.sequence_size }
139
+ end
140
+
141
+ def parameters
142
+ bit_field.declarations[:parameter]
67
143
  end
68
144
 
69
145
  def variables
70
- bit_field.declarations(:bit_field, :variable)
146
+ bit_field.declarations[:variable]
71
147
  end
72
148
 
73
149
  def body_code(code)
74
- bit_field.generate_code(:bit_field, :top_down, code)
150
+ bit_field.generate_code(code, :bit_field, :top_down)
75
151
  end
76
152
 
77
153
  def bit_field_if_connection
@@ -30,7 +30,8 @@ RgGen.define_list_feature(:bit_field, :type) do
30
30
  end
31
31
 
32
32
  def initial_value
33
- hex(bit_field.initial_value, bit_field.width)
33
+ index = bit_field.initial_value_array? && bit_field.local_index || nil
34
+ bit_field.initial_value[index]
34
35
  end
35
36
 
36
37
  def mask
@@ -42,11 +43,7 @@ RgGen.define_list_feature(:bit_field, :type) do
42
43
  bit_field.reference? &&
43
44
  bit_field
44
45
  .find_reference(register_block.bit_fields)
45
- .value(
46
- register.local_index,
47
- bit_field.local_index,
48
- bit_field.reference_width
49
- )
46
+ .value(bit_field.local_indices, bit_field.reference_width)
50
47
  end
51
48
 
52
49
  def bit_field_if
@@ -59,8 +56,8 @@ RgGen.define_list_feature(:bit_field, :type) do
59
56
  end
60
57
 
61
58
  factory do
62
- def select_feature(_configuration, bit_field)
63
- target_features[bit_field.type] || (
59
+ def target_feature_key(_configuration, bit_field)
60
+ target_features.key?(bit_field.type) && bit_field.type || (
64
61
  error "code generator for #{bit_field.type} " \
65
62
  'bit field type is not implemented'
66
63
  )
@@ -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 :register_block, :set, {
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 :register_block, :value_out, {
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 :register_block, :value_unmasked, {
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 :register_block, :value_in, {
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 :register_block, :clear, {
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 :register_block, :value_out, {
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
  }
@@ -1,6 +1,8 @@
1
- rggen_bit_field_<%= bit_field.type %> #(
1
+ rggen_bit_field_rw_wo #(
2
2
  .WIDTH (<%= width %>),
3
- .INITIAL_VALUE (<%= initial_value %>)
3
+ .INITIAL_VALUE (<%= initial_value %>),
4
+ .WRITE_ONLY (<%= write_only %>),
5
+ .WRITE_ONCE (<%= write_once %>)
4
6
  ) u_bit_field (
5
7
  .i_clk (<%= clock %>),
6
8
  .i_rst_n (<%= reset %>),
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:rw, :w1, :wo, :wo1]) do
4
+ sv_rtl do
5
+ build do
6
+ output :value_out, {
7
+ name: "o_#{full_name}", data_type: :logic, width: width,
8
+ array_size: array_size, array_format: array_port_format
9
+ }
10
+ end
11
+
12
+ main_code :bit_field, from_template: true
13
+
14
+ private
15
+
16
+ def write_only
17
+ bit_field.write_only? && 1 || 0
18
+ end
19
+
20
+ def write_once
21
+ [:w1, :wo1].include?(bit_field.type) && 1 || 0
22
+ end
23
+ end
24
+ end
@@ -4,12 +4,12 @@ RgGen.define_list_item_feature(:bit_field, :type, :rwc) do
4
4
  sv_rtl do
5
5
  build do
6
6
  unless bit_field.reference?
7
- input :register_block, :clear, {
7
+ input :clear, {
8
8
  name: "i_#{full_name}_clear", data_type: :logic, width: 1,
9
9
  array_size: array_size, array_format: array_port_format
10
10
  }
11
11
  end
12
- output :register_block, :value_out, {
12
+ output :value_out, {
13
13
  name: "o_#{full_name}", data_type: :logic, width: width,
14
14
  array_size: array_size, array_format: array_port_format
15
15
  }
@@ -4,12 +4,12 @@ RgGen.define_list_item_feature(:bit_field, :type, :rwe) do
4
4
  sv_rtl do
5
5
  build do
6
6
  unless bit_field.reference?
7
- input :register_block, :enable, {
7
+ input :enable, {
8
8
  name: "i_#{full_name}_enable", data_type: :logic, width: 1,
9
9
  array_size: array_size, array_format: array_port_format
10
10
  }
11
11
  end
12
- output :register_block, :value_out, {
12
+ output :value_out, {
13
13
  name: "o_#{full_name}", data_type: :logic, width: width,
14
14
  array_size: array_size, array_format: array_port_format
15
15
  }
@@ -4,12 +4,12 @@ RgGen.define_list_item_feature(:bit_field, :type, :rwl) do
4
4
  sv_rtl do
5
5
  build do
6
6
  unless bit_field.reference?
7
- input :register_block, :lock, {
7
+ input :lock, {
8
8
  name: "i_#{full_name}_lock", data_type: :logic, width: 1,
9
9
  array_size: array_size, array_format: array_port_format
10
10
  }
11
11
  end
12
- output :register_block, :value_out, {
12
+ output :value_out, {
13
13
  name: "o_#{full_name}", data_type: :logic, width: width,
14
14
  array_size: array_size, array_format: array_port_format
15
15
  }
@@ -4,16 +4,16 @@ RgGen.define_list_item_feature(:bit_field, :type, :rws) do
4
4
  sv_rtl do
5
5
  build do
6
6
  unless bit_field.reference?
7
- input :register_block, :set, {
7
+ input :set, {
8
8
  name: "i_#{full_name}_set", data_type: :logic, width: 1,
9
9
  array_size: array_size, array_format: array_port_format
10
10
  }
11
11
  end
12
- input :register_block, :value_in, {
12
+ input :value_in, {
13
13
  name: "i_#{full_name}", data_type: :logic, width: width,
14
14
  array_size: array_size, array_format: array_port_format
15
15
  }
16
- output :register_block, :value_out, {
16
+ output :value_out, {
17
17
  name: "o_#{full_name}", data_type: :logic, width: width,
18
18
  array_size: array_size, array_format: array_port_format
19
19
  }
@@ -3,7 +3,7 @@
3
3
  RgGen.define_list_item_feature(:bit_field, :type, [:w0crs, :w1crs]) do
4
4
  sv_rtl do
5
5
  build do
6
- output :register_block, :value_out, {
6
+ output :value_out, {
7
7
  name: "o_#{full_name}", data_type: :logic, width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
@@ -3,7 +3,7 @@
3
3
  RgGen.define_list_item_feature(:bit_field, :type, [:w0src, :w1src]) do
4
4
  sv_rtl do
5
5
  build do
6
- output :register_block, :value_out, {
6
+ output :value_out, {
7
7
  name: "o_#{full_name}", data_type: :logic, width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
@@ -3,7 +3,7 @@
3
3
  RgGen.define_list_item_feature(:bit_field, :type, [:w0trg, :w1trg]) do
4
4
  sv_rtl do
5
5
  build do
6
- output :register_block, :trigger, {
6
+ output :trigger, {
7
7
  name: "o_#{full_name}_trigger", data_type: :logic, width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
@@ -6,42 +6,39 @@ module RgGen
6
6
  class Feature < Common::Feature
7
7
  private
8
8
 
9
- def create_variable(data_type, attributes, block)
9
+ def create_variable(data_type, attributes, &block)
10
10
  DataObject.new(
11
11
  :variable, attributes.merge(data_type: data_type), &block
12
12
  )
13
13
  end
14
14
 
15
- def create_interface(_, attributes, block)
15
+ def create_if_instance(_, attributes, &block)
16
16
  InterfaceInstance.new(attributes, &block)
17
17
  end
18
18
 
19
- def create_argument(direction, attributes, block)
19
+ def create_argument(direction, attributes, &block)
20
20
  DataObject.new(
21
21
  :argument, attributes.merge(direction: direction), &block
22
22
  )
23
23
  end
24
24
 
25
- def create_interface_port(_, attributes, block)
25
+ def create_if_port(_, attributes, &block)
26
26
  InterfacePort.new(attributes, &block)
27
27
  end
28
28
 
29
- def create_parameter(_, attributes, block)
29
+ def create_parameter(parameter_type, attributes, &block)
30
30
  DataObject.new(
31
- :parameter, attributes.merge(parameter_type: :parameter), &block
31
+ :parameter, attributes.merge(parameter_type: parameter_type), &block
32
32
  )
33
33
  end
34
34
 
35
- [
36
- [:logic, :create_variable, :variable],
37
- [:interface, :create_interface, :variable],
38
- [:input, :create_argument, :port],
39
- [:output, :create_argument, :port],
40
- [:interface_port, :create_interface_port, :port],
41
- [:parameter, :create_parameter, :parameter]
42
- ].each do |entity, creation_method, declaration_type|
43
- define_entity(entity, creation_method, declaration_type)
44
- end
35
+ define_entity :logic, :create_variable, :variable, -> { component }
36
+ define_entity :interface, :create_if_instance, :variable, -> { component }
37
+ define_entity :input, :create_argument, :port, -> { register_block }
38
+ define_entity :output, :create_argument, :port, -> { register_block }
39
+ define_entity :interface_port, :create_if_port, :port, -> { register_block }
40
+ define_entity :parameter, :create_parameter, :parameter, -> { register_block }
41
+ define_entity :localparam, :create_parameter, :parameter, -> { component }
45
42
  end
46
43
  end
47
44
  end
@@ -15,5 +15,7 @@ RgGen.define_simple_feature(:global, :array_port_format) do
15
15
  error "illegal input value for array port format: #{value.inspect}"
16
16
  end
17
17
  end
18
+
19
+ printable :array_port_format
18
20
  end
19
21
  end
@@ -20,5 +20,9 @@ RgGen.define_simple_feature(:global, :fold_sv_interface_port) do
20
20
  error "cannot convert #{value.inspect} into boolean"
21
21
  end
22
22
  end
23
+
24
+ printable :fold_sv_interface_port do
25
+ fold_sv_interface_port?
26
+ end
23
27
  end
24
28
  end