rggen-systemverilog 0.21.0 → 0.24.0

Sign up to get free protection for your applications and to get access to all the features.
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