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,6 +3,8 @@
3
3
  RgGen.define_list_feature(:register, :type) do
4
4
  sv_ral do
5
5
  base_feature do
6
+ include RgGen::SystemVerilog::RAL::RegisterCommon
7
+
6
8
  define_helpers do
7
9
  def model_name(&body)
8
10
  @model_name = body if block_given?
@@ -14,14 +16,6 @@ RgGen.define_list_feature(:register, :type) do
14
16
  @offset_address
15
17
  end
16
18
 
17
- def unmapped
18
- @unmapped = true
19
- end
20
-
21
- def unmapped?
22
- !@unmapped.nil?
23
- end
24
-
25
19
  def constructor(&body)
26
20
  @constructor = body if block_given?
27
21
  @constructor
@@ -31,18 +25,14 @@ RgGen.define_list_feature(:register, :type) do
31
25
  export :constructors
32
26
 
33
27
  build do
34
- variable :register_block, :ral_model, {
35
- name: register.name,
36
- data_type: model_name,
37
- array_size: register.array_size,
38
- random: true
28
+ variable :ral_model, {
29
+ name: register.name, data_type: model_name,
30
+ array_size: register.array_size, random: true
39
31
  }
40
32
  end
41
33
 
42
34
  def constructors
43
- (array_index_list || [nil]).map.with_index do |array_index, i|
44
- constructor_code(array_index, i)
45
- end
35
+ array_indices.map.with_index(&method(:constructor_code))
46
36
  end
47
37
 
48
38
  private
@@ -51,45 +41,25 @@ RgGen.define_list_feature(:register, :type) do
51
41
  if helper.model_name
52
42
  instance_eval(&helper.model_name)
53
43
  else
54
- "#{register.name}_reg_model"
44
+ "#{register.full_name('_')}_reg_model"
55
45
  end
56
46
  end
57
47
 
58
- def array_index_list
59
- (register.array? || nil) &&
60
- begin
61
- index_table = register.array_size.map { |size| (0...size).to_a }
62
- index_table[0].product(*index_table[1..-1])
63
- end
64
- end
65
-
66
48
  def constructor_code(array_index, index)
67
49
  if helper.constructor
68
50
  instance_exec(array_index, index, &helper.constructor)
69
51
  else
70
- macro_call(
71
- :rggen_ral_create_reg_model, arguments(array_index, index)
72
- )
52
+ macro_call(:rggen_ral_create_reg, arguments(array_index, index))
73
53
  end
74
54
  end
75
55
 
76
56
  def arguments(array_index, index)
77
57
  [
78
58
  ral_model[array_index], array(array_index), offset_address(index),
79
- access_rights, unmapped, hdl_path(array_index)
59
+ string(access_rights), string(hdl_path(array_index))
80
60
  ]
81
61
  end
82
62
 
83
- def offset_address(index = 0)
84
- address =
85
- if helper.offset_address
86
- instance_exec(index, &helper.offset_address)
87
- else
88
- register.offset_address + register.byte_width * index
89
- end
90
- hex(address, register_block.local_address_width)
91
- end
92
-
93
63
  def access_rights
94
64
  if read_only?
95
65
  'RO'
@@ -108,20 +78,8 @@ RgGen.define_list_feature(:register, :type) do
108
78
  register.writable? && !register.readable?
109
79
  end
110
80
 
111
- def unmapped
112
- helper.unmapped? && 1 || 0
113
- end
114
-
115
- def hdl_path(array_index)
116
- [
117
- "g_#{register.name}",
118
- *Array(array_index).map { |i| "g[#{i}]" },
119
- 'u_register'
120
- ].join('.')
121
- end
122
-
123
81
  def variables
124
- register.declarations(:register, :variable)
82
+ register.declarations[:variable]
125
83
  end
126
84
 
127
85
  def field_model_constructors
@@ -146,8 +104,8 @@ RgGen.define_list_feature(:register, :type) do
146
104
  end
147
105
 
148
106
  factory do
149
- def select_feature(_configuration, register)
150
- target_features[register.type]
107
+ def target_feature_key(_configuration, register)
108
+ register.type
151
109
  end
152
110
  end
153
111
  end
@@ -4,5 +4,5 @@ endfunction
4
4
  function void build();
5
5
  <% field_model_constructors.each do |constructor| %>
6
6
  <%= constructor %>
7
- <% end%>
7
+ <% end %>
8
8
  endfunction
@@ -3,15 +3,11 @@
3
3
  RgGen.define_list_item_feature(:register, :type, :external) do
4
4
  sv_ral do
5
5
  build do
6
- parameter :register_block, :model_type, {
7
- name: model_name,
8
- data_type: 'type',
9
- default: 'rggen_ral_block'
6
+ parameter :model_type, {
7
+ name: model_name, data_type: 'type', default: 'rggen_ral_block'
10
8
  }
11
- parameter :register_block, :integrate_model, {
12
- name: "INTEGRATE_#{model_name}",
13
- data_type: 'bit',
14
- default: 1
9
+ parameter :integrate_model, {
10
+ name: "INTEGRATE_#{model_name}", data_type: 'bit', default: 1
15
11
  }
16
12
  end
17
13
 
@@ -19,8 +15,8 @@ RgGen.define_list_item_feature(:register, :type, :external) do
19
15
 
20
16
  constructor do
21
17
  macro_call(
22
- 'rggen_ral_create_block_model',
23
- [ral_model, offset_address, 'this', integrate_model]
18
+ 'rggen_ral_create_block',
19
+ [ral_model, offset_address(0), 'this', integrate_model]
24
20
  )
25
21
  end
26
22
  end
@@ -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 |reg_name, field_name, value| %>
11
- setup_index_field("<%= reg_name %>", "<%= field_name%>", <%= value %>);
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.register.name, field.name, value]
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,8 @@
1
+ function new(string name);
2
+ super.new(name, <%= byte_width %>, 0);
3
+ endfunction
4
+ function void build();
5
+ <% child_model_constructors.each do |constructor| %>
6
+ <%= constructor %>
7
+ <% end %>
8
+ endfunction
@@ -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, code)
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,8 @@
1
+ function new(string name);
2
+ super.new(name, <%= byte_width %>, 0);
3
+ endfunction
4
+ function void build();
5
+ <% child_model_constructors.each do |constructor| %>
6
+ <%= constructor %>
7
+ <% end %>
8
+ endfunction
@@ -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
@@ -14,7 +16,7 @@ module RgGen
14
16
  'rtl/bit_field/type/ro',
15
17
  'rtl/bit_field/type/rof',
16
18
  'rtl/bit_field/type/rs_w0s_w1s',
17
- 'rtl/bit_field/type/rw_wo',
19
+ 'rtl/bit_field/type/rw_w1_wo_wo1',
18
20
  'rtl/bit_field/type/rwc',
19
21
  'rtl/bit_field/type/rwe',
20
22
  'rtl/bit_field/type/rwl',
@@ -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