rggen-systemverilog 0.28.0 → 0.30.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60c25d990cd209fcfe988002dee2325f1ec8d319295f9014cfe59715b87d44e7
4
- data.tar.gz: db8957f134063c33fdd6efbfe3596e5871ac6f166359bb4f7b013f883ab9f3bd
3
+ metadata.gz: 3485ee878c14865b7457588e96b43fb62e07e7a699204fe5b5f2e4082b143296
4
+ data.tar.gz: e4b82e5b367666fe0f1d9f62dd4d647348363bcee8f6749032010cc1ee20bd53
5
5
  SHA512:
6
- metadata.gz: 759a5c90f3311b34f016b4fbade25d14785349f9ae88e1244596baa9b44abb80453eb3609ad2534d0b9d78a390aa8f39c747257c0a9ababa209b669cbb52b331
7
- data.tar.gz: d0923aa115d8251966cad5ee14846b6037d1187e5c889ff288af6c0a26b132dcd7823916dd8d7214317dccbc849f85482fc1b2d947b6cf465cc218d8d704fef2
6
+ metadata.gz: 960d4b3469f87ab1d75c74790a56ded92dfc4e12d38a9dadd6a97cb01ea5c4a003cdf9fd347ab998aa9d72d631fc039cfb9a7aa34e76e6445ad11a80e768f231
7
+ data.tar.gz: b27c8a3e1a6ae7c3e10f4031cf486b57654c6d62df379908cb0e72c9d6a2c069ab66009e6f8dc649be9e3f0119ddab79ad26d7993a621c44271548eccf7265bb
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2019-2022 Taichi Ishitani
3
+ Copyright (c) 2019-2023 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
@@ -35,7 +35,7 @@ Feedbacks, bug reports, questions and etc. are wellcome! You can post them by us
35
35
 
36
36
  ## Copyright & License
37
37
 
38
- Copyright © 2019-2022 Taichi Ishitani. RgGen::SystemVerilog is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
38
+ Copyright © 2019-2023 Taichi Ishitani. RgGen::SystemVerilog is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
39
39
 
40
40
  ## Code of Conduct
41
41
 
@@ -8,6 +8,7 @@ module RgGen
8
8
  define_attribute :name
9
9
  define_attribute :package_imports
10
10
  define_attribute :include_files
11
+ define_attribute :parameters
11
12
 
12
13
  def package_imports(packages)
13
14
  @package_imports ||= []
@@ -36,21 +37,28 @@ module RgGen
36
37
  def pre_body_code(code)
37
38
  package_import_declaration(code)
38
39
  file_include_directives(code)
40
+ parameter_declarations(code)
39
41
  end
40
42
 
41
43
  def package_import_declaration(code)
42
44
  declarations =
43
- Array(@package_imports)
44
- .map { |package| ['import', space, package, '::*'] }
45
- add_declarations_to_body(code, declarations)
45
+ @package_imports
46
+ &.map { |package| ['import', space, package, '::*'] }
47
+ declarations &&
48
+ add_declarations_to_body(code, declarations)
46
49
  end
47
50
 
48
51
  def file_include_directives(code)
49
- Array(@include_files).each do |file|
52
+ @include_files&.each do |file|
50
53
  code << ['`include', space, string(file), nl]
51
54
  end
52
55
  end
53
56
 
57
+ def parameter_declarations(code)
58
+ parameters &&
59
+ add_declarations_to_body(code, parameters)
60
+ end
61
+
54
62
  def footer_code
55
63
  'endpackage'
56
64
  end
@@ -26,7 +26,7 @@ module RgGen
26
26
  end
27
27
 
28
28
  def default_offset_address(index)
29
- component.offset_address + component.byte_size(false) * index
29
+ component.offset_address + component.entry_byte_size * index
30
30
  end
31
31
 
32
32
  def hdl_path(array_index)
@@ -10,7 +10,7 @@ module RgGen
10
10
  operands
11
11
  .chunk(&method(:integer?))
12
12
  .flat_map(&method(:calc_partial_sum))
13
- .reject { |value| integer?(value) && value.zero? }
13
+ .reject(&method(:integer_zero?))
14
14
  .tap { |sums| sums.empty? && (sums << 0) }
15
15
  end
16
16
 
@@ -22,6 +22,10 @@ module RgGen
22
22
  def integer?(value)
23
23
  value.is_a?(Integer)
24
24
  end
25
+
26
+ def integer_zero?(value)
27
+ integer?(value) && value.zero?
28
+ end
25
29
  end
26
30
  end
27
31
  end
@@ -4,8 +4,7 @@ rggen_default_register #(
4
4
  .ADDRESS_WIDTH (<%= address_width %>),
5
5
  .OFFSET_ADDRESS (<%= offset_address %>),
6
6
  .BUS_WIDTH (<%= bus_width %>),
7
- .DATA_WIDTH (<%= width %>),
8
- .REGISTER_INDEX (<%= register_index %>)
7
+ .DATA_WIDTH (<%= width %>)
9
8
  ) u_register (
10
9
  .i_clk (<%= register_block.clock %>),
11
10
  .i_rst_n (<%= register_block.reset %>),
@@ -19,12 +19,11 @@ RgGen.define_list_item_feature(:register, :type, :external) do
19
19
  end
20
20
 
21
21
  def start_address
22
- hex(register.offset_address, address_width)
22
+ hex(register.address_range.begin, address_width)
23
23
  end
24
24
 
25
25
  def end_address
26
- address = register.offset_address + register.byte_size - 1
27
- hex(address, address_width)
26
+ hex(register.address_range.last, address_width)
28
27
  end
29
28
  end
30
29
  end
@@ -7,7 +7,8 @@ rggen_apb_adapter #(
7
7
  .BASE_ADDRESS (<%= base_address %>),
8
8
  .BYTE_SIZE (<%= byte_size %>),
9
9
  .ERROR_STATUS (<%= error_status %>),
10
- .DEFAULT_READ_DATA (<%= default_read_data %>)
10
+ .DEFAULT_READ_DATA (<%= default_read_data %>),
11
+ .INSERT_SLICER (<%= insert_slicer %>)
11
12
  ) u_adapter (
12
13
  .i_clk (<%= clock %>),
13
14
  .i_rst_n (<%= reset %>),
@@ -9,6 +9,7 @@ rggen_axi4lite_adapter #(
9
9
  .BYTE_SIZE (<%= byte_size %>),
10
10
  .ERROR_STATUS (<%= error_status %>),
11
11
  .DEFAULT_READ_DATA (<%= default_read_data %>),
12
+ .INSERT_SLICER (<%= insert_slicer %>),
12
13
  .WRITE_FIRST (<%= write_first %>)
13
14
  ) u_adapter (
14
15
  .i_clk (<%= clock %>),
@@ -8,6 +8,7 @@ rggen_wishbone_adapter #(
8
8
  .BYTE_SIZE (<%= byte_size %>),
9
9
  .ERROR_STATUS (<%= error_status %>),
10
10
  .DEFAULT_READ_DATA (<%= default_read_data %>),
11
+ .INSERT_SLICER (<%= insert_slicer %>),
11
12
  .USE_STALL (<%= use_stall %>)
12
13
  ) u_adapter (
13
14
  .i_clk (<%= clock %>),
@@ -89,6 +89,9 @@ RgGen.define_list_feature(:register_block, :protocol) do
89
89
  name: 'DEFAULT_READ_DATA', data_type: :bit, width: bus_width,
90
90
  default: all_bits_0
91
91
  }
92
+ parameter :insert_slicer, {
93
+ name: 'INSERT_SLICER', data_type: :bit, width: 1, default: 0
94
+ }
92
95
  end
93
96
 
94
97
  private
@@ -102,7 +102,13 @@ module RgGen
102
102
  operands.reduce(:*)
103
103
  elsif operands.first == 1
104
104
  operands.last
105
- elsif need_bracket
105
+ else
106
+ product_expression(operands, need_bracket)
107
+ end
108
+ end
109
+
110
+ def product_expression(operands, need_bracket)
111
+ if need_bracket && /[+\-*\/]/ =~ operands.last
106
112
  "#{operands.first}*(#{operands.last})"
107
113
  else
108
114
  operands.join('*')
@@ -32,15 +32,29 @@ module RgGen
32
32
  end
33
33
 
34
34
  def collect_offsets(component)
35
- if component.register_file? && component.array?
35
+ if need_byte_offset?(component)
36
36
  [component.offset_address, byte_offset(component)]
37
37
  else
38
38
  component.offset_address
39
39
  end
40
40
  end
41
41
 
42
+ def need_byte_offset?(component)
43
+ if component.register_file?
44
+ component.array?
45
+ else
46
+ component.array? && !component.settings[:support_shared_address]
47
+ end
48
+ end
49
+
42
50
  def byte_offset(component)
43
- "#{component.byte_size(false)}*(#{component.local_index})"
51
+ byte_size = component.entry_byte_size
52
+ local_index = component.local_index
53
+ if /[+\-*\/]/ =~ local_index
54
+ "#{byte_size}*(#{local_index})"
55
+ else
56
+ "#{byte_size}*#{local_index}"
57
+ end
44
58
  end
45
59
 
46
60
  def format_offsets(offsets)
@@ -59,10 +73,6 @@ module RgGen
59
73
  bits = register.bit_fields.map(&:bit_map).inject(:|)
60
74
  hex(bits, register.width)
61
75
  end
62
-
63
- def register_index
64
- register.local_index || 0
65
- end
66
76
  end
67
77
  end
68
78
  end
@@ -7,6 +7,7 @@ require_relative 'rtl/register_index'
7
7
  require_relative 'rtl/register_type'
8
8
  require_relative 'rtl/indirect_index'
9
9
  require_relative 'rtl/bit_field_index'
10
+ require_relative 'rtl_package/feature'
10
11
 
11
12
  RgGen.setup_plugin :'rggen-sv-rtl' do |plugin|
12
13
  plugin.version RgGen::SystemVerilog::VERSION
@@ -50,4 +51,17 @@ RgGen.setup_plugin :'rggen-sv-rtl' do |plugin|
50
51
  'rtl/bit_field/type/wo_wo1_wotrg',
51
52
  'rtl/bit_field/type/wrc_wrs'
52
53
  ]
54
+
55
+ plugin.register_component :sv_rtl_package do
56
+ component RgGen::SystemVerilog::Common::Component,
57
+ RgGen::SystemVerilog::Common::ComponentFactory
58
+ feature RgGen::SystemVerilog::RTLPackage::Feature,
59
+ RgGen::SystemVerilog::Common::FeatureFactory
60
+ end
61
+
62
+ plugin.files [
63
+ 'rtl_package/bit_field/sv_rtl_package',
64
+ 'rtl_package/register/sv_rtl_package',
65
+ 'rtl_package/register_block/sv_rtl_package'
66
+ ]
53
67
  end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_simple_feature(:bit_field, :sv_rtl_package) do
4
+ sv_rtl_package do
5
+ build do
6
+ localparam :__width, {
7
+ name: "#{full_name}_bit_width",
8
+ data_type: :int, default: bit_field.width
9
+ }
10
+ localparam :__mask, {
11
+ name: "#{full_name}_bit_mask",
12
+ data_type: :bit, width: bit_field.width, default: mask_value
13
+ }
14
+ define_offset_localparam
15
+ define_label_localparams
16
+ end
17
+
18
+ private
19
+
20
+ def mask_value
21
+ hex((1 << bit_field.width) - 1, bit_field.width)
22
+ end
23
+
24
+ def define_offset_localparam
25
+ if bit_field.sequential?
26
+ define_sequential_offset_localparam
27
+ else
28
+ define_single_offset_localparam
29
+ end
30
+ end
31
+
32
+ def define_sequential_offset_localparam
33
+ size = bit_field.sequence_size
34
+ localparam :__offset, {
35
+ name: "#{full_name}_bit_offset",
36
+ data_type: :int, array_size: [size], default: offset_value(size)
37
+ }
38
+ end
39
+
40
+ def offset_value(size)
41
+ array(Array.new(size, &bit_field.method(:lsb)))
42
+ end
43
+
44
+ def define_single_offset_localparam
45
+ localparam :__offset, {
46
+ name: "#{full_name}_bit_offset",
47
+ data_type: :int, default: bit_field.lsb
48
+ }
49
+ end
50
+
51
+ def define_label_localparams
52
+ bit_field.labels
53
+ .each { |label| define_label_localparam(label) }
54
+ end
55
+
56
+ def define_label_localparam(label)
57
+ identifier = "label_#{label.name}".downcase.to_sym
58
+ value = hex(label.value, bit_field.width)
59
+ localparam identifier, {
60
+ name: "#{full_name}_#{label.name}",
61
+ data_type: :bit, width: bit_field.width, default: value
62
+ }
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module SystemVerilog
5
+ module RTLPackage
6
+ class Feature < Common::Feature
7
+ private
8
+
9
+ def full_name(separator = '_')
10
+ component.full_name(separator)
11
+ end
12
+
13
+ def create_parameter(parameter_type, attributes, &block)
14
+ attributes =
15
+ attributes.merge(
16
+ parameter_type: parameter_type, array_format: :unpacked,
17
+ name: attributes[:name].upcase
18
+ )
19
+ DataObject.new(
20
+ :parameter, attributes, &block
21
+ )
22
+ end
23
+
24
+ define_entity :localparam, :create_parameter, :parameter, -> { register_block }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_simple_feature(:register, :sv_rtl_package) do
4
+ sv_rtl_package do
5
+ build do
6
+ localparam :__byte_width, {
7
+ name: "#{full_name}_byte_width",
8
+ data_type: :int, default: register.byte_width
9
+ }
10
+ localparam :__byte_size, {
11
+ name: "#{full_name}_byte_size",
12
+ data_type: :int, default: register.total_byte_size(hierarchical: true)
13
+ }
14
+ define_array_size_localparam
15
+ define_offset_localparams
16
+ end
17
+
18
+ private
19
+
20
+ def define_array_size_localparam
21
+ return unless array?
22
+
23
+ list = array_size_list
24
+ localparam :__array_size, {
25
+ name: "#{full_name}_array_size",
26
+ data_type: :int, array_size: [list.size], default: array(list)
27
+ }
28
+ end
29
+
30
+ def define_offset_localparams
31
+ if array?
32
+ define_array_offset_localparams
33
+ else
34
+ define_single_offset_localparam
35
+ end
36
+ end
37
+
38
+ def define_array_offset_localparams
39
+ width = register_block.local_address_width
40
+ size_list = array_size_list
41
+ value_list = group_address_list(address_list, size_list).first
42
+ localparam :__offset, {
43
+ name: "#{full_name}_byte_offset",
44
+ data_type: :bit, width: width, array_size: size_list, default: value_list
45
+ }
46
+ end
47
+
48
+ def address_list
49
+ register
50
+ .expanded_offset_addresses
51
+ .map { |address| hex(address, register_block.local_address_width) }
52
+ end
53
+
54
+ def group_address_list(address_list, size_list)
55
+ list =
56
+ if size_list.size > 1
57
+ group_address_list(address_list, size_list[1..])
58
+ else
59
+ address_list
60
+ end
61
+ list
62
+ .each_slice(size_list.first)
63
+ .map(&method(:array))
64
+ end
65
+
66
+ def define_single_offset_localparam
67
+ width = register_block.local_address_width
68
+ value = address_list.first
69
+ localparam :__offset, {
70
+ name: "#{full_name}_byte_offset",
71
+ data_type: :bit, width: width, default: value
72
+ }
73
+ end
74
+
75
+ def array?
76
+ register.array?(hierarchical: true)
77
+ end
78
+
79
+ def array_size_list
80
+ register.array_size(hierarchical: true)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_simple_feature(:register_block, :sv_rtl_package) do
4
+ sv_rtl_package do
5
+ write_file '<%= package_name %>.sv' do |file|
6
+ file.body { sv_rtl_package_definition }
7
+ end
8
+
9
+ private
10
+
11
+ def sv_rtl_package_definition
12
+ package_definition(package_name) do |package|
13
+ package.parameters parameters
14
+ end
15
+ end
16
+
17
+ def package_name
18
+ "#{register_block.name}_rtl_pkg"
19
+ end
20
+
21
+ def parameters
22
+ register_block.declarations[:parameter]
23
+ end
24
+ end
25
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RgGen
4
4
  module SystemVerilog
5
- VERSION = '0.28.0'
5
+ VERSION = '0.30.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rggen-systemverilog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.28.0
4
+ version: 0.30.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taichi Ishitani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-10 00:00:00.000000000 Z
11
+ date: 2023-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -135,6 +135,10 @@ files:
135
135
  - lib/rggen/systemverilog/rtl/register_file/sv_rtl_top.rb
136
136
  - lib/rggen/systemverilog/rtl/register_index.rb
137
137
  - lib/rggen/systemverilog/rtl/register_type.rb
138
+ - lib/rggen/systemverilog/rtl_package/bit_field/sv_rtl_package.rb
139
+ - lib/rggen/systemverilog/rtl_package/feature.rb
140
+ - lib/rggen/systemverilog/rtl_package/register/sv_rtl_package.rb
141
+ - lib/rggen/systemverilog/rtl_package/register_block/sv_rtl_package.rb
138
142
  - lib/rggen/systemverilog/version.rb
139
143
  homepage: https://github.com/rggen/rggen-systemverilog
140
144
  licenses:
@@ -153,15 +157,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
153
157
  requirements:
154
158
  - - ">="
155
159
  - !ruby/object:Gem::Version
156
- version: '2.6'
160
+ version: '2.7'
157
161
  required_rubygems_version: !ruby/object:Gem::Requirement
158
162
  requirements:
159
163
  - - ">="
160
164
  - !ruby/object:Gem::Version
161
165
  version: '0'
162
166
  requirements: []
163
- rubygems_version: 3.3.7
167
+ rubygems_version: 3.4.10
164
168
  signing_key:
165
169
  specification_version: 4
166
- summary: rggen-systemverilog-0.28.0
170
+ summary: rggen-systemverilog-0.30.0
167
171
  test_files: []