rggen-systemverilog 0.16.0 → 0.17.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: 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: []