rggen-systemverilog 0.29.0 → 0.30.1

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: 7e5fc548cd3c93e80580efc9d2027ce309b9a6e8900078f3f5bf8bb157357e53
4
- data.tar.gz: 4fb5af7f5ad76f4938406a553fe425767e2fc363ce79b79b07213fd292535efb
3
+ metadata.gz: eabc1a7fe3c4b18369e5a28a4b7cf3be8f3c39535bc675ccb96852142d23ea9f
4
+ data.tar.gz: 9cd3d819ee42f7f91a920694f74c1cafcd78b3727c762947adcefa4899100721
5
5
  SHA512:
6
- metadata.gz: 34cc65c49e1510303e8ca8ed7d16b941bfd331d66188602ecdf41a61cc9b1b0a627f56d33c3ba6b44b0c2e56ca1c44a896893ad3d82070a72b5cfb913e5a28b5
7
- data.tar.gz: 55600c8bf365ffbbc2d8cc6b020e6cb13c33ebb91f49253d53cef0c5a7a5df86d639a61cc0a1eb2aa5d2a36d86530236e837735721da55def694c2a1c19c9d74
6
+ metadata.gz: 1798f396c34dedcba253e799ae1123c0e53c885b1a6378bff22a6cce9655dfd3793e119b532fbc8e97fbbf89405c5c6a5d5abaa2eed7881cb115361eb9424481
7
+ data.tar.gz: d8dc3fff2fd630f789a616ab3fb9880a8c8863d34ef21a0f6787ae0247db1ae451a161a7557957b33a51e9650ca7e47b2352ac4c3dcae1874b5a8b05dcd6ad7d
@@ -87,6 +87,10 @@ module RgGen
87
87
  [width, bit_length].max
88
88
  end
89
89
 
90
+ def width_cast(expression, width)
91
+ "#{width}'(#{expression})"
92
+ end
93
+
90
94
  def argument(name, attribute = {})
91
95
  DataObject.new(:argument, attribute.merge(name: name)).declaration
92
96
  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
@@ -5,7 +5,7 @@ rggen_default_register #(
5
5
  .OFFSET_ADDRESS (<%= offset_address %>),
6
6
  .BUS_WIDTH (<%= bus_width %>),
7
7
  .DATA_WIDTH (<%= width %>),
8
- .REGISTER_INDEX (<%= register_index %>)
8
+ .VALUE_WIDTH (<%= value_width %>)
9
9
  ) u_register (
10
10
  .i_clk (<%= register_block.clock %>),
11
11
  .i_rst_n (<%= register_block.reset %>),
@@ -1,8 +1,9 @@
1
1
  rggen_external_register #(
2
2
  .ADDRESS_WIDTH (<%= address_width %>),
3
3
  .BUS_WIDTH (<%= bus_width %>),
4
+ .VALUE_WIDTH (<%= value_width %>),
4
5
  .START_ADDRESS (<%= start_address %>),
5
- .END_ADDRESS (<%= end_address %>)
6
+ .BYTE_SIZE (<%= byte_size %>)
6
7
  ) u_register (
7
8
  .i_clk (<%= register_block.clock %>),
8
9
  .i_rst_n (<%= register_block.reset %>),
@@ -14,17 +14,12 @@ RgGen.define_list_item_feature(:register, :type, :external) do
14
14
 
15
15
  private
16
16
 
17
- def byte_width
18
- configuration.byte_width
19
- end
20
-
21
17
  def start_address
22
- hex(register.offset_address, address_width)
18
+ hex(register.address_range.begin, address_width)
23
19
  end
24
20
 
25
- def end_address
26
- address = register.offset_address + register.byte_size - 1
27
- hex(address, address_width)
21
+ def byte_size
22
+ register.total_byte_size
28
23
  end
29
24
  end
30
25
  end
@@ -5,6 +5,7 @@ rggen_indirect_register #(
5
5
  .OFFSET_ADDRESS (<%= offset_address %>),
6
6
  .BUS_WIDTH (<%= bus_width %>),
7
7
  .DATA_WIDTH (<%= width %>),
8
+ .VALUE_WIDTH (<%= value_width %>),
8
9
  .INDIRECT_INDEX_WIDTH (<%= index_width %>),
9
10
  .INDIRECT_INDEX_VALUE (<%= concat(index_values) %>)
10
11
  ) u_register (
@@ -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 %>),
@@ -26,11 +26,5 @@ RgGen.define_list_item_feature(:register_block, :protocol, :axi4lite) do
26
26
  end
27
27
 
28
28
  main_code :register_block, from_template: true
29
-
30
- private
31
-
32
- def id_port_width
33
- "((#{id_width}>0)?#{id_width}:1)"
34
- end
35
29
  end
36
30
  end
@@ -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 %>),
@@ -17,12 +17,6 @@ RgGen.define_list_feature(:register_block, :protocol) do
17
17
  def feature_registries
18
18
  @feature_registries ||= []
19
19
  end
20
-
21
- def collect_available_protocols(registry)
22
- registry
23
- .enabled_features(:protocol)
24
- .select { |protocol| registry.feature?(:protocol, protocol) }
25
- end
26
20
  end
27
21
 
28
22
  configuration do
@@ -89,6 +83,9 @@ RgGen.define_list_feature(:register_block, :protocol) do
89
83
  name: 'DEFAULT_READ_DATA', data_type: :bit, width: bus_width,
90
84
  default: all_bits_0
91
85
  }
86
+ parameter :insert_slicer, {
87
+ name: 'INSERT_SLICER', data_type: :bit, width: 1, default: 0
88
+ }
92
89
  end
93
90
 
94
91
  private
@@ -97,10 +94,6 @@ RgGen.define_list_feature(:register_block, :protocol) do
97
94
  configuration.bus_width
98
95
  end
99
96
 
100
- def byte_width
101
- configuration.byte_width
102
- end
103
-
104
97
  def local_address_width
105
98
  register_block.local_address_width
106
99
  end
@@ -12,7 +12,7 @@
12
12
  if (1) begin : __g_tie_off \
13
13
  genvar __i; \
14
14
  for (__i = 0;__i < WIDTH;++__i) begin : g \
15
- if (!(((VALID_BITS) >> __i) & 1'b1)) begin : g \
15
+ if ((((VALID_BITS) >> __i) % 2) == 0) begin : g \
16
16
  assign RIF.read_data[__i] = 1'b0; \
17
17
  assign RIF.value[__i] = 1'b0; \
18
18
  end \
@@ -3,6 +3,7 @@
3
3
  RgGen.define_simple_feature(:register_block, :sv_rtl_top) do
4
4
  sv_rtl do
5
5
  export :total_registers
6
+ export :value_width
6
7
 
7
8
  build do
8
9
  input :clock, { name: 'i_clk', width: 1 }
@@ -19,7 +20,11 @@ RgGen.define_simple_feature(:register_block, :sv_rtl_top) do
19
20
  end
20
21
 
21
22
  def total_registers
22
- register_block.files_and_registers.sum(&:count)
23
+ @total_registers ||= register_block.files_and_registers.sum(&:count)
24
+ end
25
+
26
+ def value_width
27
+ @value_width ||= register_block.registers.map(&:width).max
23
28
  end
24
29
 
25
30
  private
@@ -32,10 +37,6 @@ RgGen.define_simple_feature(:register_block, :sv_rtl_top) do
32
37
  configuration.bus_width
33
38
  end
34
39
 
35
- def value_width
36
- register_block.registers.map(&:width).max
37
- end
38
-
39
40
  def body_code(code)
40
41
  macro_definition(code)
41
42
  sv_module_definition(code)
@@ -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('*')
@@ -16,10 +16,18 @@ module RgGen
16
16
  register.writable? && 1 || 0
17
17
  end
18
18
 
19
+ def width
20
+ register.width
21
+ end
22
+
19
23
  def bus_width
20
24
  configuration.bus_width
21
25
  end
22
26
 
27
+ def value_width
28
+ register_block.value_width
29
+ end
30
+
23
31
  def address_width
24
32
  register_block.local_address_width
25
33
  end
@@ -32,15 +40,29 @@ module RgGen
32
40
  end
33
41
 
34
42
  def collect_offsets(component)
35
- if component.register_file? && component.array?
43
+ if need_byte_offset?(component)
36
44
  [component.offset_address, byte_offset(component)]
37
45
  else
38
46
  component.offset_address
39
47
  end
40
48
  end
41
49
 
50
+ def need_byte_offset?(component)
51
+ if component.register_file?
52
+ component.array?
53
+ else
54
+ component.array? && !component.settings[:support_shared_address]
55
+ end
56
+ end
57
+
42
58
  def byte_offset(component)
43
- "#{component.byte_size(false)}*(#{component.local_index})"
59
+ byte_size = component.entry_byte_size
60
+ local_index = component.local_index
61
+ if /[+\-*\/]/ =~ local_index
62
+ "#{byte_size}*(#{local_index})"
63
+ else
64
+ "#{byte_size}*#{local_index}"
65
+ end
44
66
  end
45
67
 
46
68
  def format_offsets(offsets)
@@ -48,20 +70,15 @@ module RgGen
48
70
  end
49
71
 
50
72
  def format_offset(offset)
51
- offset.is_a?(Integer) ? hex(offset, address_width) : offset
52
- end
53
-
54
- def width
55
- register.width
73
+ case offset
74
+ when Integer then hex(offset, address_width)
75
+ else width_cast(offset, address_width)
76
+ end
56
77
  end
57
78
 
58
79
  def valid_bits
59
80
  bits = register.bit_fields.map(&:bit_map).inject(:|)
60
- hex(bits, register.width)
61
- end
62
-
63
- def register_index
64
- register.local_index || 0
81
+ hex(bits, width)
65
82
  end
66
83
  end
67
84
  end
@@ -9,7 +9,7 @@ RgGen.define_simple_feature(:register, :sv_rtl_package) do
9
9
  }
10
10
  localparam :__byte_size, {
11
11
  name: "#{full_name}_byte_size",
12
- data_type: :int, default: register.byte_size(hierarchical: true)
12
+ data_type: :int, default: register.total_byte_size(hierarchical: true)
13
13
  }
14
14
  define_array_size_localparam
15
15
  define_offset_localparams
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RgGen
4
4
  module SystemVerilog
5
- VERSION = '0.29.0'
5
+ VERSION = '0.30.1'
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.29.0
4
+ version: 0.30.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taichi Ishitani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-02 00:00:00.000000000 Z
11
+ date: 2023-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -164,8 +164,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
164
  - !ruby/object:Gem::Version
165
165
  version: '0'
166
166
  requirements: []
167
- rubygems_version: 3.4.1
167
+ rubygems_version: 3.4.10
168
168
  signing_key:
169
169
  specification_version: 4
170
- summary: rggen-systemverilog-0.29.0
170
+ summary: rggen-systemverilog-0.30.1
171
171
  test_files: []