rggen-systemverilog 0.16.0 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) 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 +13 -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 +21 -17
  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 +10 -52
  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 +3 -6
  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/partial_sum.rb +29 -0
  46. data/lib/rggen/systemverilog/rtl/register/sv_rtl_top.rb +10 -47
  47. data/lib/rggen/systemverilog/rtl/register/type.rb +25 -1
  48. data/lib/rggen/systemverilog/rtl/register/type/external.rb +15 -15
  49. data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +3 -3
  50. data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +24 -4
  51. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.erb +9 -3
  52. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +14 -15
  53. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.erb +10 -4
  54. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +23 -25
  55. data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +11 -13
  56. data/lib/rggen/systemverilog/rtl/register_file/sv_rtl_top.rb +30 -0
  57. data/lib/rggen/systemverilog/rtl/register_index.rb +112 -0
  58. data/lib/rggen/systemverilog/rtl/setup.rb +1 -0
  59. data/lib/rggen/systemverilog/version.rb +1 -1
  60. metadata +16 -9
  61. data/lib/rggen/systemverilog/ral/register_block/sv_ral_block_model.erb +0 -11
  62. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_wo.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62ec6f5cb3ee1c7f88c2b46fa979376823e7d5f5098acf1cc41dd3b10a89de9b
4
- data.tar.gz: 5c8976e639c443eb330be03e2c0487c261c50e46ef2fbac6e70adfb514023638
3
+ metadata.gz: 9b642c6748857ea3e78bcca5eeda544387fca31bdb85de17c51182e0da0f0c7f
4
+ data.tar.gz: e6152bbed9134750811957f1d46aeba5769e12bf39196b440d3c4362c22bdd6a
5
5
  SHA512:
6
- metadata.gz: 1f8e2778fd4771395143a01cc84e59077e097f33b50b4083d7209e32a81a1988f36d7af140661b07e6a975df35a5e266e8d82272fa6134ac0bd7ae2929aa0d04
7
- data.tar.gz: ea482e0d904d91faf76b9575a4807ab92e55056c2ecb16fe4078cf03012314ba9d374088ca34570adbc9d64edec6fa21b647d7476b4c32e365c25946563afe36
6
+ metadata.gz: 254ad7f6a05832eb99e6863fa82fab47edc1701d6e348dd5049ab9f9b3d16fe72ab29e82ba0611e8c9c0243675d21d4437d1a74e229eee383c199cb467c950f4
7
+ data.tar.gz: 7d3b17ff333fe06f68d1e802afd2cbcca411ef3bc4c34c54bc79487d821643772cf98be55eef61a1b826f506bfe816e6420caa3c4c63632aaf0f0fcc6374d8c3
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2019 Taichi Ishitani
3
+ Copyright (c) 2019-2020 Taichi Ishitani
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/rggen-systemverilog.svg)](https://badge.fury.io/rb/rggen-systemverilog)
2
- [![Build Status](https://travis-ci.com/rggen/rggen-systemverilog.svg?branch=master)](https://travis-ci.com/rggen/rggen-systemverilog)
2
+ [![CI](https://github.com/rggen/rggen-systemverilog/workflows/CI/badge.svg)](https://github.com/rggen/rggen-systemverilog/actions?query=workflow%3ACI)
3
3
  [![Maintainability](https://api.codeclimate.com/v1/badges/88086c5be538a1564a35/maintainability)](https://codeclimate.com/github/rggen/rggen-systemverilog/maintainability)
4
4
  [![codecov](https://codecov.io/gh/rggen/rggen-systemverilog/branch/master/graph/badge.svg)](https://codecov.io/gh/rggen/rggen-systemverilog)
5
5
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=rggen_rggen-systemverilog&metric=alert_status)](https://sonarcloud.io/dashboard?id=rggen_rggen-systemverilog)
@@ -34,7 +34,7 @@ Feedbacks, bug reports, questions and etc. are wellcome! You can post them by us
34
34
 
35
35
  ## Copyright & License
36
36
 
37
- Copyright © 2019 Taichi Ishitani. RgGen::SystemVerilog is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
37
+ Copyright © 2019-2020 Taichi Ishitani. RgGen::SystemVerilog is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
38
38
 
39
39
  ## Code of Conduct
40
40
 
@@ -28,10 +28,10 @@ module RgGen
28
28
  def self.register_component(builder, name, feature_class)
29
29
  builder.output_component_registry(name) do
30
30
  register_component [
31
- :register_map, :register_block, :register, :bit_field
31
+ :root, :register_block, :register_file, :register, :bit_field
32
32
  ] do |category|
33
33
  component Component, ComponentFactory
34
- feature feature_class, FeatureFactory if category != :register_map
34
+ feature feature_class, FeatureFactory if category != :root
35
35
  end
36
36
  end
37
37
  end
@@ -4,12 +4,8 @@ module RgGen
4
4
  module SystemVerilog
5
5
  module Common
6
6
  class Component < Core::OutputBase::Component
7
- def declarations(domain, type)
8
- body = ->(r) { r.declarations(domain, type) }
9
- [
10
- @features.each_value.map(&body),
11
- @children.map(&body)
12
- ].flatten
7
+ def declarations
8
+ @declarations ||= Hash.new { |h, k| h[k] = [] }
13
9
  end
14
10
 
15
11
  def package_imports(domain)
@@ -8,26 +8,25 @@ module RgGen
8
8
  template_engine Core::OutputBase::ERBEngine
9
9
 
10
10
  EntityContext =
11
- Struct.new(:entity_type, :creation_method, :declaration_type)
11
+ Struct.new(:entity_type, :method, :declaration_type, :default_layer)
12
12
 
13
13
  class << self
14
14
  private
15
15
 
16
- def define_entity(entity_type, creation_method, declaration_type)
16
+ def define_entity(entity_type, method, declaration_type, default_layer)
17
17
  context =
18
- EntityContext.new(entity_type, creation_method, declaration_type)
19
- define_method(entity_type) do |domain, name, **attributes, &block|
20
- entity =
21
- create_entity(context, { name: name }.merge(attributes), block)
22
- add_entity(entity, context, domain, name)
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)
23
26
  end
24
27
  end
25
28
  end
26
29
 
27
- def declarations(domain, type)
28
- @declarations[domain][type]
29
- end
30
-
31
30
  def package_imports(domain)
32
31
  @package_imports[domain]
33
32
  end
@@ -36,30 +35,44 @@ module RgGen
36
35
 
37
36
  def post_initialize
38
37
  super
39
- @declarations = Hash.new do |h0, k0|
40
- h0[k0] = Hash.new { |h1, k1| h1[k1] = [] }
41
- end
42
38
  @package_imports = Hash.new { |h, k| h[k] = [] }
43
39
  end
44
40
 
45
- def create_entity(context, attributes, block)
46
- creation_method = context.creation_method
47
- entity_type = context.entity_type
48
- __send__(creation_method, entity_type, attributes, block)
41
+ def define_entity(context, name, args, &block)
42
+ layer, attributes = parse_entity_arguments(args)
43
+ entity = create_entity(context, name, attributes, &block)
44
+ add_entity(context, entity, name, layer)
45
+ end
46
+
47
+ def parse_entity_arguments(args)
48
+ if args.empty?
49
+ [nil, nil]
50
+ elsif args.size == 1 && args.first.is_a?(Hash)
51
+ [nil, args.first]
52
+ elsif args.size == 1
53
+ [args.first, nil]
54
+ else
55
+ args[0..1]
56
+ end
57
+ end
58
+
59
+ def create_entity(context, name, attributes, &block)
60
+ merged_attributes = { name: name }.merge(Hash(attributes))
61
+ __send__(context.method, context.entity_type, merged_attributes, &block)
49
62
  end
50
63
 
51
- def add_entity(entity, context, domain, name)
52
- add_declaration(context, domain, entity.declaration)
53
- add_identifier(name, entity.identifier)
64
+ def add_entity(context, entity, name, layer)
65
+ add_declaration(context, entity, layer)
66
+ add_identifier(entity, name)
54
67
  end
55
68
 
56
- def add_declaration(context, domain, declaration)
57
- declaration_type = context.declaration_type
58
- @declarations[domain][declaration_type] << declaration
69
+ def add_declaration(context, entity, layer)
70
+ (layer || instance_exec(&context.default_layer))
71
+ .declarations[context.declaration_type] << entity.declaration
59
72
  end
60
73
 
61
- def add_identifier(name, identifier)
62
- instance_variable_set("@#{name}", identifier)
74
+ def add_identifier(entity, name)
75
+ instance_variable_set("@#{name}", entity.identifier)
63
76
  attr_singleton_reader(name)
64
77
  export(name)
65
78
  end
@@ -24,8 +24,13 @@ module RgGen
24
24
  "{#{Array(expressions).join(', ')}}"
25
25
  end
26
26
 
27
- def array(expressions)
28
- "'#{concat(expressions)}"
27
+ def repeat(count, expression)
28
+ "{#{count}{#{expression}}}"
29
+ end
30
+
31
+ def array(expressions = nil, default: nil)
32
+ default_item = default && "default: #{default}"
33
+ "'#{concat([*Array(expressions), default_item].compact)}"
29
34
  end
30
35
 
31
36
  def function_call(name, expressions = nil)
@@ -40,6 +45,10 @@ module RgGen
40
45
  end
41
46
  end
42
47
 
48
+ def all_bits_0
49
+ "'0"
50
+ end
51
+
43
52
  def bin(value, width = nil)
44
53
  if width
45
54
  width = bit_width(value, width)
@@ -74,7 +83,7 @@ module RgGen
74
83
  [width, bit_length].max
75
84
  end
76
85
 
77
- def argument(name, **attribute)
86
+ def argument(name, attribute = {})
78
87
  DataObject.new(:argument, attribute.merge(name: name)).declaration
79
88
  end
80
89
 
@@ -85,7 +94,7 @@ module RgGen
85
94
  module_definition: ModuleDefinition,
86
95
  package_definition: PackageDefinition
87
96
  }.each do |method_name, definition|
88
- define_method(method_name) do |name, **attributes, &block|
97
+ define_method(method_name) do |name, attributes = {}, &block|
89
98
  definition.new(attributes.merge(name: name), &block).to_code
90
99
  end
91
100
  end
@@ -7,9 +7,9 @@ module RgGen
7
7
  class DataObject
8
8
  include Core::Utility::AttributeSetter
9
9
 
10
- def initialize(object_type, **default_attributes)
10
+ def initialize(object_type, default_attributes = {})
11
11
  @object_type = object_type
12
- apply_attributes(default_attributes)
12
+ apply_attributes(**default_attributes)
13
13
  block_given? && yield(self)
14
14
  end
15
15
 
@@ -7,8 +7,8 @@ module RgGen
7
7
  class InterfaceInstance
8
8
  include Core::Utility::AttributeSetter
9
9
 
10
- def initialize(**default_attributes)
11
- apply_attributes(default_attributes)
10
+ def initialize(default_attributes = {})
11
+ apply_attributes(**default_attributes)
12
12
  block_given? && yield(self)
13
13
  end
14
14
 
@@ -7,8 +7,8 @@ module RgGen
7
7
  class InterfacePort
8
8
  include Core::Utility::AttributeSetter
9
9
 
10
- def initialize(**default_attributes)
11
- apply_attributes(default_attributes)
10
+ def initialize(default_attributes = {})
11
+ apply_attributes(**default_attributes)
12
12
  block_given? && yield(self)
13
13
  end
14
14
 
@@ -17,9 +17,13 @@ module RgGen
17
17
  define_attribute :modport
18
18
  define_attribute :array_size
19
19
 
20
- def modport(name, ports = nil)
21
- @modport_name = name
22
- @modport_ports = ports
20
+ def modport(name_and_ports, ports = nil)
21
+ @modport_name, @modport_ports =
22
+ if ports
23
+ [name_and_ports, ports]
24
+ else
25
+ Array(name_and_ports)[0..1]
26
+ end
23
27
  end
24
28
 
25
29
  def declaration
@@ -6,11 +6,12 @@ module RgGen
6
6
  module Utility
7
7
  class LocalScope < StructureDefinition
8
8
  define_attribute :name
9
+ define_attribute :parameters
9
10
  define_attribute :variables
10
11
  define_attribute :loop_size
11
12
 
12
- def top_scope
13
- @top_scope = true
13
+ def top_scope(value = true)
14
+ @top_scope = value
14
15
  end
15
16
 
16
17
  private
@@ -28,6 +29,7 @@ module RgGen
28
29
  def pre_body_code(code)
29
30
  genvar_declarations(code)
30
31
  generate_for_header(code)
32
+ parameter_declarations(code)
31
33
  variable_declarations(code)
32
34
  end
33
35
 
@@ -47,6 +49,10 @@ module RgGen
47
49
  "for (#{genvar} = 0;#{genvar} < #{size};++#{genvar}) begin : g"
48
50
  end
49
51
 
52
+ def parameter_declarations(code)
53
+ add_declarations_to_body(code, Array(parameters))
54
+ end
55
+
50
56
  def variable_declarations(code)
51
57
  add_declarations_to_body(code, Array(variables))
52
58
  end
@@ -4,13 +4,11 @@ module RgGen
4
4
  module SystemVerilog
5
5
  module Common
6
6
  module Utility
7
- class StructureDefinition <
8
- Core::Utility::CodeUtility::StructureDefinition
9
-
7
+ class StructureDefinition < Core::Utility::CodeUtility::StructureDefinition
10
8
  include Core::Utility::AttributeSetter
11
9
 
12
- def initialize(**default_attributes, &block)
13
- apply_attributes(default_attributes)
10
+ def initialize(default_attributes = {}, &block)
11
+ apply_attributes(**default_attributes)
14
12
  super(&block)
15
13
  end
16
14
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'common'
4
4
  require_relative 'ral/feature'
5
+ require_relative 'ral/register_common'
5
6
 
6
7
  module RgGen
7
8
  module SystemVerilog
@@ -15,7 +16,9 @@ module RgGen
15
16
  'ral/register/type',
16
17
  'ral/register/type/external',
17
18
  'ral/register/type/indirect',
18
- 'ral/register_block/sv_ral_package'
19
+ 'ral/register_block/sv_ral_model',
20
+ 'ral/register_block/sv_ral_package',
21
+ 'ral/register_file/sv_ral_model'
19
22
  ].freeze
20
23
 
21
24
  def self.version
@@ -17,11 +17,9 @@ RgGen.define_list_feature(:bit_field, :type) do
17
17
  export :constructors
18
18
 
19
19
  build do
20
- variable :register, :ral_model, {
21
- name: bit_field.name,
22
- data_type: model_name,
23
- array_size: array_size,
24
- random: true
20
+ variable :ral_model, {
21
+ name: bit_field.name, data_type: model_name,
22
+ array_size: array_size, random: true
25
23
  }
26
24
  end
27
25
 
@@ -30,18 +28,13 @@ RgGen.define_list_feature(:bit_field, :type) do
30
28
  end
31
29
 
32
30
  def model_name
33
- if helper.model_name&.is_a?(Proc)
34
- instance_eval(&helper.model_name)
35
- else
36
- helper.model_name || :rggen_ral_field
37
- end
31
+ name = helper.model_name
32
+ name&.is_a?(Proc) && instance_eval(&name) || name || :rggen_ral_field
38
33
  end
39
34
 
40
35
  def constructors
41
36
  (bit_field.sequence_size&.times || [nil]).map do |index|
42
- macro_call(
43
- :rggen_ral_create_field_model, arguments(index)
44
- )
37
+ macro_call(:rggen_ral_create_field, arguments(index))
45
38
  end
46
39
  end
47
40
 
@@ -53,8 +46,8 @@ RgGen.define_list_feature(:bit_field, :type) do
53
46
 
54
47
  def arguments(index)
55
48
  [
56
- ral_model[index], bit_field.lsb(index), bit_field.width,
57
- access, volatile, reset_value, valid_reset
49
+ ral_model[index], bit_field.lsb(index), bit_field.width, string(access),
50
+ volatile, reset_value(index), valid_reset, index || -1, string(reference)
58
51
  ]
59
52
  end
60
53
 
@@ -62,13 +55,24 @@ RgGen.define_list_feature(:bit_field, :type) do
62
55
  bit_field.volatile? && 1 || 0
63
56
  end
64
57
 
65
- def reset_value
66
- hex(bit_field.initial_value, bit_field.width)
58
+ def reset_value(index)
59
+ value =
60
+ bit_field.initial_values&.at(index) || bit_field.initial_value || 0
61
+ hex(value, bit_field.width)
67
62
  end
68
63
 
69
64
  def valid_reset
70
65
  bit_field.initial_value? && 1 || 0
71
66
  end
67
+
68
+ def reference
69
+ if bit_field.reference?
70
+ reference_field = bit_field.reference
71
+ [reference_field.register.full_name('.'), reference_field.name].join('.')
72
+ else
73
+ ''
74
+ end
75
+ end
72
76
  end
73
77
 
74
78
  default_feature do
@@ -3,17 +3,7 @@
3
3
  RgGen.define_list_item_feature(:bit_field, :type, [:rwe, :rwl]) do
4
4
  sv_ral do
5
5
  model_name do
6
- "rggen_ral_#{bit_field.type}_field #(#{reference_names})"
7
- end
8
-
9
- private
10
-
11
- def reference_names
12
- reference = bit_field.reference
13
- register = reference&.register
14
- [register&.name, reference&.name]
15
- .map { |name| string(name) }
16
- .join(', ')
6
+ "rggen_ral_#{bit_field.type}_field"
17
7
  end
18
8
  end
19
9
  end
@@ -6,20 +6,18 @@ module RgGen
6
6
  class Feature < Common::Feature
7
7
  private
8
8
 
9
- def create_variable(_, attributes, block)
9
+ def create_variable(_, attributes, &block)
10
10
  DataObject.new(
11
11
  :variable, attributes.merge(array_format: :unpacked), &block
12
12
  )
13
13
  end
14
14
 
15
- def create_parameter(_, attributes, block)
16
- DataObject.new(
17
- :parameter, attributes, &block
18
- )
15
+ def create_parameter(_, attributes, &block)
16
+ DataObject.new(:parameter, attributes, &block)
19
17
  end
20
18
 
21
- define_entity :variable, :create_variable, :variable
22
- define_entity :parameter, :create_parameter, :parameter
19
+ define_entity :variable, :create_variable, :variable, -> { component.parent }
20
+ define_entity :parameter, :create_parameter, :parameter, -> { component.parent }
23
21
  end
24
22
  end
25
23
  end