rggen-systemverilog 0.16.0 → 0.17.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62ec6f5cb3ee1c7f88c2b46fa979376823e7d5f5098acf1cc41dd3b10a89de9b
4
- data.tar.gz: 5c8976e639c443eb330be03e2c0487c261c50e46ef2fbac6e70adfb514023638
3
+ metadata.gz: 222ace28ccb5d96354eaf040d8c560e9c87ac73affba7bf5a3cac3a545898080
4
+ data.tar.gz: 7b652f0b27638800264f3bbfcd26d70ed0e89ad76f5e5ac7aeb8dc7023b8f09f
5
5
  SHA512:
6
- metadata.gz: 1f8e2778fd4771395143a01cc84e59077e097f33b50b4083d7209e32a81a1988f36d7af140661b07e6a975df35a5e266e8d82272fa6134ac0bd7ae2929aa0d04
7
- data.tar.gz: ea482e0d904d91faf76b9575a4807ab92e55056c2ecb16fe4078cf03012314ba9d374088ca34570adbc9d64edec6fa21b647d7476b4c32e365c25946563afe36
6
+ metadata.gz: 7f7c5046c3f60c3fe7b4114fa97b9b4029422b7a2eae52b3cdadd2919c83ed4378c900692eea1e1317d6dfbbc5846609a09fe86500060a0d6ba3c6376b2a9475
7
+ data.tar.gz: 423aaf6583e719a1d3923de06651545e07fe5784fda7e469954975e36b3b5590019924caa5ef27bfdbc1f7ae25cbfc999e94ec43d504f3d08ded87acc8e68678
@@ -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)
@@ -6,6 +6,7 @@ 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
 
@@ -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
@@ -30,11 +30,8 @@ RgGen.define_list_feature(:bit_field, :type) do
30
30
  end
31
31
 
32
32
  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
33
+ name = helper.model_name
34
+ name&.is_a?(Proc) && instance_eval(&name) || name || :rggen_ral_field
38
35
  end
39
36
 
40
37
  def constructors
@@ -54,7 +51,7 @@ RgGen.define_list_feature(:bit_field, :type) do
54
51
  def arguments(index)
55
52
  [
56
53
  ral_model[index], bit_field.lsb(index), bit_field.width,
57
- access, volatile, reset_value, valid_reset
54
+ access, volatile, reset_value(index), valid_reset
58
55
  ]
59
56
  end
60
57
 
@@ -62,8 +59,10 @@ RgGen.define_list_feature(:bit_field, :type) do
62
59
  bit_field.volatile? && 1 || 0
63
60
  end
64
61
 
65
- def reset_value
66
- hex(bit_field.initial_value, bit_field.width)
62
+ def reset_value(index)
63
+ value =
64
+ bit_field.initial_values&.at(index) || bit_field.initial_value || 0
65
+ hex(value, bit_field.width)
67
66
  end
68
67
 
69
68
  def valid_reset
@@ -8,6 +8,19 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
8
8
  export :value
9
9
 
10
10
  build do
11
+ if fixed_initial_value?
12
+ localparam :bit_field, :initial_value, {
13
+ name: initial_value_name, data_type: :bit, width: bit_field.width,
14
+ array_size: initial_value_size, array_format: initial_value_format,
15
+ default: initial_value_lhs
16
+ }
17
+ elsif initial_value?
18
+ parameter :register_block, :initial_value, {
19
+ name: initial_value_name, data_type: :bit, width: bit_field.width,
20
+ array_size: initial_value_size, array_format: initial_value_format,
21
+ default: initial_value_lhs
22
+ }
23
+ end
11
24
  interface :bit_field, :bit_field_sub_if, {
12
25
  name: 'bit_field_sub_if',
13
26
  interface_type: 'rggen_bit_field_if',
@@ -18,6 +31,7 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
18
31
  main_code :register do
19
32
  local_scope("g_#{bit_field.name}") do |scope|
20
33
  scope.loop_size loop_size
34
+ scope.parameters parameters
21
35
  scope.variables variables
22
36
  scope.body(&method(:body_code))
23
37
  end
@@ -57,6 +71,49 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
57
71
 
58
72
  private
59
73
 
74
+ [:fixed_initial_value?, :initial_value_array?, :initial_value?].each do |m|
75
+ define_method(m) { bit_field.__send__(__method__) }
76
+ end
77
+
78
+ def initial_value_name
79
+ identifiers = []
80
+ identifiers << bit_field.full_name('_') unless fixed_initial_value?
81
+ identifiers << 'initial_value'
82
+ identifiers.join('_').upcase
83
+ end
84
+
85
+ def initial_value_size
86
+ initial_value_array? && [bit_field.sequence_size] || nil
87
+ end
88
+
89
+ def initial_value_format
90
+ fixed_initial_value? && :unpacked ||
91
+ configuration.array_port_format
92
+ end
93
+
94
+ def initial_value_lhs
95
+ initial_value_array? && initial_value_array_lhs || sized_initial_value
96
+ end
97
+
98
+ def initial_value_array_lhs
99
+ if fixed_initial_value?
100
+ array(sized_initial_values)
101
+ elsif initial_value_format == :unpacked
102
+ array(default: sized_initial_value)
103
+ else
104
+ repeat(bit_field.sequence_size, sized_initial_value)
105
+ end
106
+ end
107
+
108
+ def sized_initial_value
109
+ bit_field.initial_value &&
110
+ hex(bit_field.initial_value, bit_field.width)
111
+ end
112
+
113
+ def sized_initial_values
114
+ bit_field.initial_values&.map { |v| hex(v, bit_field.width) }
115
+ end
116
+
60
117
  def inside_loop?
61
118
  register.array? || bit_field.sequential?
62
119
  end
@@ -66,6 +123,10 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
66
123
  { index_name => bit_field.sequence_size }
67
124
  end
68
125
 
126
+ def parameters
127
+ bit_field.declarations(:bit_field, :parameter)
128
+ end
129
+
69
130
  def variables
70
131
  bit_field.declarations(:bit_field, :variable)
71
132
  end
@@ -30,7 +30,8 @@ RgGen.define_list_feature(:bit_field, :type) do
30
30
  end
31
31
 
32
32
  def initial_value
33
- hex(bit_field.initial_value, bit_field.width)
33
+ index = bit_field.initial_value_array? && bit_field.local_index || nil
34
+ bit_field.initial_value[index]
34
35
  end
35
36
 
36
37
  def mask
@@ -26,9 +26,9 @@ module RgGen
26
26
  InterfacePort.new(attributes, &block)
27
27
  end
28
28
 
29
- def create_parameter(_, attributes, block)
29
+ def create_parameter(parameter_type, attributes, block)
30
30
  DataObject.new(
31
- :parameter, attributes.merge(parameter_type: :parameter), &block
31
+ :parameter, attributes.merge(parameter_type: parameter_type), &block
32
32
  )
33
33
  end
34
34
 
@@ -38,7 +38,8 @@ module RgGen
38
38
  [:input, :create_argument, :port],
39
39
  [:output, :create_argument, :port],
40
40
  [:interface_port, :create_interface_port, :port],
41
- [:parameter, :create_parameter, :parameter]
41
+ [:parameter, :create_parameter, :parameter],
42
+ [:localparam, :create_parameter, :parameter]
42
43
  ].each do |entity, creation_method, declaration_type|
43
44
  define_entity(entity, creation_method, declaration_type)
44
45
  end
@@ -64,6 +64,16 @@ RgGen.define_list_feature(:register_block, :protocol) do
64
64
  shared_context.feature_registry(registry)
65
65
 
66
66
  base_feature do
67
+ build do
68
+ parameter :register_block, :error_status, {
69
+ name: 'ERROR_STATUS', data_type: :bit, width: 1, default: 0
70
+ }
71
+ parameter :register_block, :default_read_data, {
72
+ name: 'DEFAULT_READ_DATA', data_type: :bit, width: bus_width,
73
+ default: hex(0, bus_width)
74
+ }
75
+ end
76
+
67
77
  private
68
78
 
69
79
  def address_width
@@ -1,7 +1,9 @@
1
1
  rggen_apb_adapter #(
2
- .ADDRESS_WIDTH (<%= local_address_width %>),
3
- .BUS_WIDTH (<%= bus_width %>),
4
- .REGISTERS (<%= total_registers %>)
2
+ .ADDRESS_WIDTH (<%= local_address_width %>),
3
+ .BUS_WIDTH (<%= bus_width %>),
4
+ .REGISTERS (<%= total_registers %>),
5
+ .ERROR_STATUS (<%= error_status %>),
6
+ .DEFAULT_READ_DATA (<%= default_read_data %>)
5
7
  ) u_adapter (
6
8
  .i_clk (<%= clock %>),
7
9
  .i_rst_n (<%= reset %>),
@@ -1,8 +1,10 @@
1
1
  rggen_axi4lite_adapter #(
2
- .ADDRESS_WIDTH (<%= local_address_width %>),
3
- .BUS_WIDTH (<%= bus_width %>),
4
- .REGISTERS (<%= total_registers %>),
5
- .WRITE_FIRST (<%= write_first %>)
2
+ .ADDRESS_WIDTH (<%= local_address_width %>),
3
+ .BUS_WIDTH (<%= bus_width %>),
4
+ .REGISTERS (<%= total_registers %>),
5
+ .ERROR_STATUS (<%= error_status %>),
6
+ .DEFAULT_READ_DATA (<%= default_read_data %>),
7
+ .WRITE_FIRST (<%= write_first %>)
6
8
  ) u_adapter (
7
9
  .i_clk (<%= clock %>),
8
10
  .i_rst_n (<%= reset %>),
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RgGen
4
4
  module SystemVerilog
5
- VERSION = '0.16.0'
5
+ VERSION = '0.17.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.16.0
4
+ version: 0.17.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: 2019-10-01 00:00:00.000000000 Z
11
+ date: 2019-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docile
@@ -170,5 +170,5 @@ requirements: []
170
170
  rubygems_version: 3.0.3
171
171
  signing_key:
172
172
  specification_version: 4
173
- summary: rggen-systemverilog-0.16.0
173
+ summary: rggen-systemverilog-0.17.0
174
174
  test_files: []