rggen-systemverilog 0.21.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) 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 +0 -22
  5. data/lib/rggen/systemverilog/common/feature.rb +2 -2
  6. data/lib/rggen/systemverilog/common/utility.rb +4 -0
  7. data/lib/rggen/systemverilog/common/utility/identifier.rb +19 -15
  8. data/lib/rggen/systemverilog/ral.rb +20 -26
  9. data/lib/rggen/systemverilog/ral/bit_field/type.rb +1 -1
  10. data/lib/rggen/systemverilog/ral/setup.rb +1 -1
  11. data/lib/rggen/systemverilog/rtl.rb +39 -41
  12. data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +10 -46
  13. data/lib/rggen/systemverilog/rtl/bit_field/type.rb +1 -2
  14. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.erb +19 -0
  15. data/lib/rggen/systemverilog/rtl/bit_field/type/{rc_w0c_w1c.rb → rc_w0c_w1c_wc_woc.rb} +22 -11
  16. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.erb +17 -2
  17. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.erb +15 -4
  18. data/lib/rggen/systemverilog/rtl/bit_field/type/rof.erb +15 -4
  19. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.erb +19 -0
  20. data/lib/rggen/systemverilog/rtl/bit_field/type/{rs_w0s_w1s.rb → rs_w0s_w1s_ws_wos.rb} +21 -9
  21. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.erb +15 -7
  22. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.rb +2 -2
  23. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.erb +15 -7
  24. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.erb +16 -8
  25. data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.erb +16 -8
  26. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.erb +13 -7
  27. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.erb +19 -0
  28. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb +37 -0
  29. data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.erb +18 -0
  30. data/lib/rggen/systemverilog/rtl/bit_field/type/{w0src_w1src.rb → w0t_w1t.rb} +6 -4
  31. data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.erb +18 -0
  32. data/lib/rggen/systemverilog/rtl/bit_field/type/{w0crs_w1crs.rb → wrc_wrs.rb} +6 -4
  33. data/lib/rggen/systemverilog/rtl/bit_field_index.rb +53 -0
  34. data/lib/rggen/systemverilog/rtl/indirect_index.rb +35 -0
  35. data/lib/rggen/systemverilog/rtl/register/type.rb +1 -56
  36. data/lib/rggen/systemverilog/rtl/register/type/external.rb +0 -4
  37. data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +2 -26
  38. data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +14 -8
  39. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.erb +1 -0
  40. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +55 -28
  41. data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +1 -1
  42. data/lib/rggen/systemverilog/rtl/register_index.rb +4 -4
  43. data/lib/rggen/systemverilog/rtl/register_type.rb +68 -0
  44. data/lib/rggen/systemverilog/rtl/setup.rb +1 -1
  45. data/lib/rggen/systemverilog/version.rb +1 -1
  46. metadata +17 -26
  47. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.erb +0 -15
  48. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.erb +0 -13
  49. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w1crs.erb +0 -10
  50. data/lib/rggen/systemverilog/rtl/bit_field/type/w0src_w1src.erb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b642c6748857ea3e78bcca5eeda544387fca31bdb85de17c51182e0da0f0c7f
4
- data.tar.gz: e6152bbed9134750811957f1d46aeba5769e12bf39196b440d3c4362c22bdd6a
3
+ metadata.gz: 2cfff9e2a346d5c02dc5a6401e8b36fdd15d20b9d4d4030b5fcc56880521ccd4
4
+ data.tar.gz: 75bd4c611fa964f30df059fe39d547daf688322ed1076654744381dc38a67068
5
5
  SHA512:
6
- metadata.gz: 254ad7f6a05832eb99e6863fa82fab47edc1701d6e348dd5049ab9f9b3d16fe72ab29e82ba0611e8c9c0243675d21d4437d1a74e229eee383c199cb467c950f4
7
- data.tar.gz: 7d3b17ff333fe06f68d1e802afd2cbcca411ef3bc4c34c54bc79487d821643772cf98be55eef61a1b826f506bfe816e6420caa3c4c63632aaf0f0fcc6374d8c3
6
+ metadata.gz: 3c5e0b0b5c3352532161411d2ce6e8ca8728231377c7453953a1c1804b8c08bd134ba487264d7a63c192744278184de7923f598dfbde80096a41b6040467af45
7
+ data.tar.gz: 37a27563ccee405d16d2778728e186331bdb9a7711b73d017eb1bf3fd4479000c2bf54621dbab43b903897755a05026a3c7ae25cb68b1624cef63a250bf3eda0
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2019-2020 Taichi Ishitani
3
+ Copyright (c) 2019-2021 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
@@ -7,7 +7,7 @@
7
7
 
8
8
  # RgGen::SystemVerilog
9
9
 
10
- RgGen::SystemVerilog privides SystemVerilog RTL generator and UVM RAL model generator for RgGen.
10
+ RgGen::SystemVerilog provides SystemVerilog RTL and UVM register model (UVM RAL) generators for RgGen.
11
11
 
12
12
  ## Installation
13
13
 
@@ -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-2020 Taichi Ishitani. RgGen::SystemVerilog is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
37
+ Copyright © 2019-2021 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
 
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'docile'
4
3
  require 'facets/kernel/attr_singleton'
5
4
 
6
5
  require_relative 'version'
@@ -21,24 +20,3 @@ require_relative 'common/utility'
21
20
  require_relative 'common/component'
22
21
  require_relative 'common/feature'
23
22
  require_relative 'common/factories'
24
-
25
- module RgGen
26
- module SystemVerilog
27
- module Common
28
- def self.register_component(builder, name, feature_class)
29
- builder.output_component_registry(name) do
30
- register_component [
31
- :root, :register_block, :register_file, :register, :bit_field
32
- ] do |category|
33
- component Component, ComponentFactory
34
- feature feature_class, FeatureFactory if category != :root
35
- end
36
- end
37
- end
38
-
39
- def self.load_features(features, root)
40
- features.each { |feature| require File.join(root, feature) }
41
- end
42
- end
43
- end
44
- end
@@ -8,7 +8,7 @@ module RgGen
8
8
  template_engine Core::OutputBase::ERBEngine
9
9
 
10
10
  EntityContext =
11
- Struct.new(:entity_type, :method, :declaration_type, :default_layer)
11
+ Struct.new(:entity_type, :method_name, :declaration_type, :default_layer)
12
12
 
13
13
  class << self
14
14
  private
@@ -58,7 +58,7 @@ module RgGen
58
58
 
59
59
  def create_entity(context, name, attributes, &block)
60
60
  merged_attributes = { name: name }.merge(Hash(attributes))
61
- __send__(context.method, context.entity_type, merged_attributes, &block)
61
+ __send__(context.method_name, context.entity_type, merged_attributes, &block)
62
62
  end
63
63
 
64
64
  def add_entity(context, entity, name, layer)
@@ -45,6 +45,10 @@ module RgGen
45
45
  end
46
46
  end
47
47
 
48
+ def all_bits_1
49
+ "'1"
50
+ end
51
+
48
52
  def all_bits_0
49
53
  "'0"
50
54
  end
@@ -35,9 +35,9 @@ module RgGen
35
35
  @name.to_s
36
36
  end
37
37
 
38
- def [](array_index_or_lsb, width = nil)
38
+ def [](array_index_or_lsb, lsb_or_width = nil, width = nil)
39
39
  if array_index_or_lsb
40
- __create_new_identifier__(array_index_or_lsb, width)
40
+ __create_new_identifier__(array_index_or_lsb, lsb_or_width, width)
41
41
  else
42
42
  self
43
43
  end
@@ -45,35 +45,38 @@ module RgGen
45
45
 
46
46
  private
47
47
 
48
- def __create_new_identifier__(array_index_or_lsb, width)
49
- select = __create_select__(array_index_or_lsb, width)
48
+ def __create_new_identifier__(array_index_or_lsb, lsb_or_width, width)
49
+ select = __create_select__(array_index_or_lsb, lsb_or_width, width)
50
50
  Identifier.new("#{@name}#{select}") do |identifier|
51
51
  identifier.__sub_identifiers__(@sub_identifiers)
52
52
  end
53
53
  end
54
54
 
55
- def __create_select__(array_index_or_lsb, width)
55
+ def __create_select__(array_index_or_lsb, lsb_or_width, width)
56
56
  if array_index_or_lsb.is_a?(::Array)
57
- __array_select__(array_index_or_lsb)
58
- elsif width
59
- "[#{array_index_or_lsb}+:#{width}]"
57
+ __array_select__(array_index_or_lsb, lsb_or_width, width)
58
+ elsif lsb_or_width
59
+ "[#{array_index_or_lsb}+:#{lsb_or_width}]"
60
60
  else
61
61
  "[#{array_index_or_lsb}]"
62
62
  end
63
63
  end
64
64
 
65
- def __array_select__(array_index)
65
+ def __array_select__(array_index, lsb, width)
66
66
  if @array_format == :serialized
67
- "[#{__serialized_lsb__(array_index)}+:#{@width}]"
67
+ "[#{__serialized_lsb__(array_index, lsb)}+:#{width || @width}]"
68
68
  else
69
- array_index
70
- .map { |index| "[#{index}]" }
71
- .join
69
+ [
70
+ *array_index.map { |index| "[#{index}]" },
71
+ lsb && __create_select__(lsb, width, nil)
72
+ ].compact.join
72
73
  end
73
74
  end
74
75
 
75
- def __serialized_lsb__(array_index)
76
- __reduce_array__([@width, __serialized_index__(array_index)], :*, 1)
76
+ def __serialized_lsb__(array_index, lsb)
77
+ serialized_index = __serialized_index__(array_index)
78
+ array_lsb = __reduce_array__([@width, serialized_index], :*, 1)
79
+ __reduce_array__([array_lsb, lsb], :+, 0)
77
80
  end
78
81
 
79
82
  def __serialized_index__(array_index)
@@ -97,6 +100,7 @@ module RgGen
97
100
  end
98
101
 
99
102
  def __reduce_array__(array, operator, initial_value)
103
+ array = array.compact
100
104
  if array.all?(&method(:integer?))
101
105
  array.reduce(initial_value, &operator)
102
106
  else
@@ -7,35 +7,29 @@ require_relative 'ral/register_common'
7
7
  module RgGen
8
8
  module SystemVerilog
9
9
  module RAL
10
- FEATURES = [
11
- 'ral/bit_field/type',
12
- 'ral/bit_field/type/reserved_rof',
13
- 'ral/bit_field/type/rwc_rws',
14
- 'ral/bit_field/type/rwe_rwl',
15
- 'ral/bit_field/type/w0trg_w1trg',
16
- 'ral/register/type',
17
- 'ral/register/type/external',
18
- 'ral/register/type/indirect',
19
- 'ral/register_block/sv_ral_model',
20
- 'ral/register_block/sv_ral_package',
21
- 'ral/register_file/sv_ral_model'
22
- ].freeze
10
+ extend Core::Plugin
23
11
 
24
- def self.version
25
- SystemVerilog::VERSION
26
- end
27
-
28
- def self.register_component(builder)
29
- Common.register_component(builder, :sv_ral, Feature)
30
- end
12
+ setup_plugin :'rggen-sv-ral' do |plugin|
13
+ plugin.version SystemVerilog::VERSION
31
14
 
32
- def self.load_features
33
- Common.load_features(FEATURES, __dir__)
34
- end
15
+ plugin.register_component :sv_ral do
16
+ component Common::Component, Common::ComponentFactory
17
+ feature Feature, Common::FeatureFactory
18
+ end
35
19
 
36
- def self.default_setup(builder)
37
- register_component(builder)
38
- load_features
20
+ plugin.files [
21
+ 'ral/bit_field/type',
22
+ 'ral/bit_field/type/reserved_rof',
23
+ 'ral/bit_field/type/rwc_rws',
24
+ 'ral/bit_field/type/rwe_rwl',
25
+ 'ral/bit_field/type/w0trg_w1trg',
26
+ 'ral/register/type',
27
+ 'ral/register/type/external',
28
+ 'ral/register/type/indirect',
29
+ 'ral/register_block/sv_ral_model',
30
+ 'ral/register_block/sv_ral_package',
31
+ 'ral/register_file/sv_ral_model'
32
+ ]
39
33
  end
40
34
  end
41
35
  end
@@ -29,7 +29,7 @@ RgGen.define_list_feature(:bit_field, :type) do
29
29
 
30
30
  def model_name
31
31
  name = helper.model_name
32
- name&.is_a?(Proc) && instance_eval(&name) || name || :rggen_ral_field
32
+ name.is_a?(Proc) && instance_eval(&name) || name || :rggen_ral_field
33
33
  end
34
34
 
35
35
  def constructors
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'rggen/systemverilog/ral'
4
4
 
5
- RgGen.setup :'rggen-sv-ral', RgGen::SystemVerilog::RAL do |builder|
5
+ RgGen.register_plugin RgGen::SystemVerilog::RAL do |builder|
6
6
  builder.enable :register_block, [:sv_ral_model, :sv_ral_package]
7
7
  builder.enable :register_file, [:sv_ral_model]
8
8
  end
@@ -4,54 +4,52 @@ require_relative 'common'
4
4
  require_relative 'rtl/feature'
5
5
  require_relative 'rtl/partial_sum'
6
6
  require_relative 'rtl/register_index'
7
+ require_relative 'rtl/register_type'
8
+ require_relative 'rtl/indirect_index'
9
+ require_relative 'rtl/bit_field_index'
7
10
 
8
11
  module RgGen
9
12
  module SystemVerilog
10
13
  module RTL
11
- FEATURES = [
12
- 'rtl/bit_field/sv_rtl_top',
13
- 'rtl/bit_field/type',
14
- 'rtl/bit_field/type/rc_w0c_w1c',
15
- 'rtl/bit_field/type/reserved',
16
- 'rtl/bit_field/type/ro',
17
- 'rtl/bit_field/type/rof',
18
- 'rtl/bit_field/type/rs_w0s_w1s',
19
- 'rtl/bit_field/type/rw_w1_wo_wo1',
20
- 'rtl/bit_field/type/rwc',
21
- 'rtl/bit_field/type/rwe',
22
- 'rtl/bit_field/type/rwl',
23
- 'rtl/bit_field/type/rws',
24
- 'rtl/bit_field/type/w0crs_w1crs',
25
- 'rtl/bit_field/type/w0src_w1src',
26
- 'rtl/bit_field/type/w0trg_w1trg',
27
- 'rtl/global/array_port_format',
28
- 'rtl/global/fold_sv_interface_port',
29
- 'rtl/register/sv_rtl_top',
30
- 'rtl/register/type',
31
- 'rtl/register/type/external',
32
- 'rtl/register/type/indirect',
33
- 'rtl/register_block/protocol',
34
- 'rtl/register_block/protocol/apb',
35
- 'rtl/register_block/protocol/axi4lite',
36
- 'rtl/register_block/sv_rtl_top',
37
- 'rtl/register_file/sv_rtl_top'
38
- ].freeze
14
+ extend Core::Plugin
39
15
 
40
- def self.version
41
- SystemVerilog::VERSION
42
- end
43
-
44
- def self.register_component(builder)
45
- Common.register_component(builder, :sv_rtl, Feature)
46
- end
16
+ setup_plugin :'rggen-sv-rtl' do |plugin|
17
+ plugin.version SystemVerilog::VERSION
47
18
 
48
- def self.load_features
49
- Common.load_features(FEATURES, __dir__)
50
- end
19
+ plugin.register_component :sv_rtl do
20
+ component Common::Component, Common::ComponentFactory
21
+ feature Feature, Common::FeatureFactory
22
+ end
51
23
 
52
- def self.default_setup(builder)
53
- register_component(builder)
54
- load_features
24
+ plugin.files [
25
+ 'rtl/bit_field/sv_rtl_top',
26
+ 'rtl/bit_field/type',
27
+ 'rtl/bit_field/type/rc_w0c_w1c_wc_woc',
28
+ 'rtl/bit_field/type/reserved',
29
+ 'rtl/bit_field/type/ro',
30
+ 'rtl/bit_field/type/rof',
31
+ 'rtl/bit_field/type/rs_w0s_w1s_ws_wos',
32
+ 'rtl/bit_field/type/rw_w1_wo_wo1',
33
+ 'rtl/bit_field/type/rwc',
34
+ 'rtl/bit_field/type/rwe',
35
+ 'rtl/bit_field/type/rwl',
36
+ 'rtl/bit_field/type/rws',
37
+ 'rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc',
38
+ 'rtl/bit_field/type/w0t_w1t',
39
+ 'rtl/bit_field/type/w0trg_w1trg',
40
+ 'rtl/bit_field/type/wrc_wrs',
41
+ 'rtl/global/array_port_format',
42
+ 'rtl/global/fold_sv_interface_port',
43
+ 'rtl/register/sv_rtl_top',
44
+ 'rtl/register/type',
45
+ 'rtl/register/type/external',
46
+ 'rtl/register/type/indirect',
47
+ 'rtl/register_block/protocol',
48
+ 'rtl/register_block/protocol/apb',
49
+ 'rtl/register_block/protocol/axi4lite',
50
+ 'rtl/register_block/sv_rtl_top',
51
+ 'rtl/register_file/sv_rtl_top'
52
+ ]
55
53
  end
56
54
  end
57
55
  end
@@ -2,10 +2,8 @@
2
2
 
3
3
  RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
4
4
  sv_rtl do
5
- export :local_index
6
- export :local_indices
7
- export :loop_variables
8
- export :array_size
5
+ include RgGen::SystemVerilog::RTL::BitFieldIndex
6
+
9
7
  export :value
10
8
 
11
9
  build do
@@ -13,13 +11,13 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
13
11
  localparam :initial_value, {
14
12
  name: initial_value_name, data_type: :bit, width: bit_field.width,
15
13
  array_size: initial_value_size, array_format: initial_value_format,
16
- default: initial_value_lhs
14
+ default: initial_value_rhs
17
15
  }
18
16
  elsif initial_value?
19
17
  parameter :initial_value, {
20
18
  name: initial_value_name, data_type: :bit, width: bit_field.width,
21
19
  array_size: initial_value_size, array_format: initial_value_format,
22
- default: initial_value_lhs
20
+ default: initial_value_rhs
23
21
  }
24
22
  end
25
23
  interface :bit_field_sub_if, {
@@ -42,31 +40,8 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
42
40
  code << bit_field_if_connection << nl
43
41
  end
44
42
 
45
- def local_index
46
- (index_name = local_index_name) &&
47
- create_identifier(index_name)
48
- end
49
-
50
- def local_indices
51
- [*register.local_indices, local_index_name]
52
- end
53
-
54
- def loop_variables
55
- (inside_loop? || nil) &&
56
- [*register.loop_variables, local_index].compact
57
- end
58
-
59
- def array_size
60
- (inside_loop? || nil) &&
61
- [
62
- *register_files.flat_map(&:array_size),
63
- *register.array_size,
64
- *bit_field.sequence_size
65
- ].compact
66
- end
67
-
68
43
  def value(offsets = nil, width = nil)
69
- value_lsb = bit_field.lsb(offsets&.last || local_index_name)
44
+ value_lsb = bit_field.lsb(offsets&.last || local_index)
70
45
  value_width = width || bit_field.width
71
46
  register_if(offsets&.slice(0..-2)).value[value_lsb, value_width]
72
47
  end
@@ -77,14 +52,6 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
77
52
  define_method(m) { bit_field.__send__(__method__) }
78
53
  end
79
54
 
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
55
  def register_if(offsets)
89
56
  index = register.index(offsets || register.local_indices)
90
57
  register_block.register_if[index]
@@ -106,11 +73,11 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
106
73
  configuration.array_port_format
107
74
  end
108
75
 
109
- def initial_value_lhs
110
- initial_value_array? && initial_value_array_lhs || sized_initial_value
76
+ def initial_value_rhs
77
+ initial_value_array? && initial_value_array_rhs || sized_initial_value
111
78
  end
112
79
 
113
- def initial_value_array_lhs
80
+ def initial_value_array_rhs
114
81
  if fixed_initial_value?
115
82
  array(sized_initial_values)
116
83
  elsif initial_value_format == :unpacked
@@ -129,12 +96,9 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
129
96
  bit_field.initial_values&.map { |v| hex(v, bit_field.width) }
130
97
  end
131
98
 
132
- def inside_loop?
133
- register.array? || bit_field.sequential?
134
- end
135
-
136
99
  def loop_size
137
- (loop_variable = local_index_name) &&
100
+ loop_variable = local_index
101
+ loop_variable &&
138
102
  { loop_variable => bit_field.sequence_size }
139
103
  end
140
104