rggen-systemverilog 0.24.0 → 0.26.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +1 -1
  4. data/lib/rggen/systemverilog/common/factories.rb +1 -1
  5. data/lib/rggen/systemverilog/common/feature.rb +1 -1
  6. data/lib/rggen/systemverilog/common/utility/class_definition.rb +12 -4
  7. data/lib/rggen/systemverilog/common/utility/data_object.rb +1 -2
  8. data/lib/rggen/systemverilog/common/utility/function_definition.rb +16 -4
  9. data/lib/rggen/systemverilog/common/utility/identifier.rb +16 -11
  10. data/lib/rggen/systemverilog/common/utility/local_scope.rb +9 -7
  11. data/lib/rggen/systemverilog/common/utility/module_definition.rb +12 -4
  12. data/lib/rggen/systemverilog/common/utility/package_definition.rb +4 -4
  13. data/lib/rggen/systemverilog/common/utility.rb +1 -1
  14. data/lib/rggen/systemverilog/common.rb +0 -2
  15. data/lib/rggen/systemverilog/ral/bit_field/type/rof.rb +5 -0
  16. data/lib/rggen/systemverilog/ral/bit_field/type/rotrg_rwtrg_wotrg.rb +9 -0
  17. data/lib/rggen/systemverilog/ral/bit_field/type/rowo_rowotrg.rb +8 -0
  18. data/lib/rggen/systemverilog/ral/bit_field/type.rb +20 -7
  19. data/lib/rggen/systemverilog/ral/register_common.rb +1 -1
  20. data/lib/rggen/systemverilog/ral.rb +3 -1
  21. data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +1 -1
  22. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.erb +2 -0
  23. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.rb +3 -3
  24. data/lib/rggen/systemverilog/rtl/bit_field/type/{ro.erb → ro_rotrg.erb} +8 -4
  25. data/lib/rggen/systemverilog/rtl/bit_field/type/ro_rotrg.rb +40 -0
  26. data/lib/rggen/systemverilog/rtl/bit_field/type/rof.erb +5 -2
  27. data/lib/rggen/systemverilog/rtl/bit_field/type/rowo_rowotrg.erb +21 -0
  28. data/lib/rggen/systemverilog/rtl/bit_field/type/rowo_rowotrg.rb +52 -0
  29. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.erb +2 -0
  30. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.rb +2 -2
  31. data/lib/rggen/systemverilog/rtl/bit_field/type/{rw_w1_wo_wo1.erb → rw_rwtrg_w1.erb} +4 -2
  32. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_rwtrg_w1.rb +46 -0
  33. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.erb +2 -0
  34. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -2
  35. data/lib/rggen/systemverilog/rtl/bit_field/type/{rwl.erb → rwe_rwl.erb} +4 -2
  36. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.rb +34 -0
  37. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.erb +2 -0
  38. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +3 -3
  39. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.erb +2 -0
  40. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb +1 -1
  41. data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.erb +2 -0
  42. data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.rb +1 -1
  43. data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -1
  44. data/lib/rggen/systemverilog/rtl/bit_field/type/{rwe.erb → wo_wo1_wotrg.erb} +8 -4
  45. data/lib/rggen/systemverilog/rtl/bit_field/type/wo_wo1_wotrg.rb +38 -0
  46. data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.erb +2 -0
  47. data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.rb +1 -1
  48. data/lib/rggen/systemverilog/rtl/bit_field_index.rb +1 -2
  49. data/lib/rggen/systemverilog/rtl/feature.rb +8 -6
  50. data/lib/rggen/systemverilog/rtl/partial_sum.rb +5 -6
  51. data/lib/rggen/systemverilog/rtl/register/type/external.rb +5 -62
  52. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +3 -60
  53. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +4 -118
  54. data/lib/rggen/systemverilog/rtl/register_block/protocol/wishbone.erb +17 -0
  55. data/lib/rggen/systemverilog/rtl/register_block/protocol/wishbone.rb +26 -0
  56. data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +2 -6
  57. data/lib/rggen/systemverilog/rtl/register_index.rb +13 -11
  58. data/lib/rggen/systemverilog/rtl/register_type.rb +4 -3
  59. data/lib/rggen/systemverilog/rtl/setup.rb +2 -4
  60. data/lib/rggen/systemverilog/rtl.rb +6 -6
  61. data/lib/rggen/systemverilog/version.rb +1 -1
  62. metadata +21 -31
  63. data/lib/rggen/systemverilog/ral/bit_field/type/reserved_rof.rb +0 -5
  64. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.erb +0 -18
  65. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.rb +0 -7
  66. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +0 -22
  67. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.rb +0 -24
  68. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.rb +0 -26
  69. data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.rb +0 -26
  70. data/lib/rggen/systemverilog/rtl/global/fold_sv_interface_port.rb +0 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2cfff9e2a346d5c02dc5a6401e8b36fdd15d20b9d4d4030b5fcc56880521ccd4
4
- data.tar.gz: 75bd4c611fa964f30df059fe39d547daf688322ed1076654744381dc38a67068
3
+ metadata.gz: 6093eea4b475c6dddb948d2b0bb5053705cc64f38a5603c925d0ab04029e0978
4
+ data.tar.gz: e2c07ce7eb68f15c9e4d2dbd0f83d7a74dbcb92ba292ba1fae8830c4ca147cb0
5
5
  SHA512:
6
- metadata.gz: 3c5e0b0b5c3352532161411d2ce6e8ca8728231377c7453953a1c1804b8c08bd134ba487264d7a63c192744278184de7923f598dfbde80096a41b6040467af45
7
- data.tar.gz: 37a27563ccee405d16d2778728e186331bdb9a7711b73d017eb1bf3fd4479000c2bf54621dbab43b903897755a05026a3c7ae25cb68b1624cef63a250bf3eda0
6
+ metadata.gz: 2d460b5eecdc50fbae20514b7f814fd98774b6dcb05ab72df2936301a9218870609eb1236b13f9a305d1882f001360eb84537b083c5323d2fde475fe170ffaed
7
+ data.tar.gz: 4ea6fb47189ec224f30701198d9a51de4ab68cbc2a601b048ad23b1edcda1308214218fd456550c2e8d085c3575ab2aeec7e58c43d6337dba81111c0e8f0b07f
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2019-2021 Taichi Ishitani
3
+ Copyright (c) 2019-2022 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
@@ -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-2021 Taichi Ishitani. RgGen::SystemVerilog is licensed under the [MIT License](https://opensource.org/licenses/MIT), see [LICENSE](LICENSE) for futher details.
37
+ 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
38
 
39
39
  ## Code of Conduct
40
40
 
@@ -3,7 +3,7 @@
3
3
  module RgGen
4
4
  module SystemVerilog
5
5
  module Common
6
- class ComponentFactory < Core::OutputBase::ComponentFactory
6
+ class ComponentFactory < Core::OutputBase::SourceFileComponentFactory
7
7
  end
8
8
 
9
9
  class FeatureFactory < Core::OutputBase::FeatureFactory
@@ -73,7 +73,7 @@ module RgGen
73
73
 
74
74
  def add_identifier(entity, name)
75
75
  instance_variable_set("@#{name}", entity.identifier)
76
- attr_singleton_reader(name)
76
+ singleton_exec { attr_reader name }
77
77
  export(name)
78
78
  end
79
79
 
@@ -13,10 +13,14 @@ module RgGen
13
13
  private
14
14
 
15
15
  def header_code(code)
16
- code << [:class, space, name]
16
+ class_header_begin(code)
17
17
  parameter_declarations(code)
18
18
  class_inheritance(code)
19
- code << semicolon
19
+ class_header_end(code)
20
+ end
21
+
22
+ def class_header_begin(code)
23
+ code << ['class', space, name]
20
24
  end
21
25
 
22
26
  def parameter_declarations(code)
@@ -28,7 +32,11 @@ module RgGen
28
32
 
29
33
  def class_inheritance(code)
30
34
  return unless base
31
- code << [space, :extends, space, base]
35
+ code << [space, 'extends', space, base]
36
+ end
37
+
38
+ def class_header_end(code)
39
+ code << semicolon
32
40
  end
33
41
 
34
42
  def pre_body_code(code)
@@ -36,7 +44,7 @@ module RgGen
36
44
  end
37
45
 
38
46
  def footer_code
39
- :endclass
47
+ 'endclass'
40
48
  end
41
49
  end
42
50
  end
@@ -25,8 +25,7 @@ module RgGen
25
25
 
26
26
  def declaration
27
27
  declaration_snippets
28
- .select(&:itself)
29
- .reject(&:empty?)
28
+ .select { |snippet| snippet && !snippet.empty? }
30
29
  .join(' ')
31
30
  end
32
31
 
@@ -19,11 +19,15 @@ module RgGen
19
19
  private
20
20
 
21
21
  def header_code(code)
22
- code << :function
22
+ function_header_begin(code)
23
23
  return_type_declaration(code)
24
- code << [space, name]
24
+ function_name(code)
25
25
  argument_declarations(code)
26
- code << semicolon
26
+ function_header_end(code)
27
+ end
28
+
29
+ def function_header_begin(code)
30
+ code << 'function'
27
31
  end
28
32
 
29
33
  def return_type_declaration(code)
@@ -31,14 +35,22 @@ module RgGen
31
35
  code << [space, return_type.declaration]
32
36
  end
33
37
 
38
+ def function_name(code)
39
+ code << space << name
40
+ end
41
+
34
42
  def argument_declarations(code)
35
43
  wrap(code, '(', ')') do
36
44
  add_declarations_to_header(code, Array(arguments))
37
45
  end
38
46
  end
39
47
 
48
+ def function_header_end(code)
49
+ code << semicolon
50
+ end
51
+
40
52
  def footer_code
41
- :endfunction
53
+ 'endfunction'
42
54
  end
43
55
  end
44
56
  end
@@ -47,7 +47,7 @@ module RgGen
47
47
 
48
48
  def __create_new_identifier__(array_index_or_lsb, lsb_or_width, width)
49
49
  select = __create_select__(array_index_or_lsb, lsb_or_width, width)
50
- Identifier.new("#{@name}#{select}") do |identifier|
50
+ self.class.new("#{@name}#{select}") do |identifier|
51
51
  identifier.__sub_identifiers__(@sub_identifiers)
52
52
  end
53
53
  end
@@ -74,24 +74,29 @@ module RgGen
74
74
  end
75
75
 
76
76
  def __serialized_lsb__(array_index, lsb)
77
- serialized_index = __serialized_index__(array_index)
78
- array_lsb = __reduce_array__([@width, serialized_index], :*, 1)
77
+ index =
78
+ array_index
79
+ .yield_self(&method(:__serialized_index__))
80
+ .yield_self(&method(:__enclose_index_in_parenthesis))
81
+ array_lsb = __reduce_array__([@width, index], :*, 1)
79
82
  __reduce_array__([array_lsb, lsb], :+, 0)
80
83
  end
81
84
 
82
85
  def __serialized_index__(array_index)
83
- index_values =
84
- array_index
85
- .reverse
86
- .zip(__index_factors__)
87
- .map { |i, f| __calc_index_value__(i, f) }
88
- index = __reduce_array__(index_values.reverse, :+, 0)
89
- integer?(index) ? index : "(#{index})"
86
+ array_index
87
+ .reverse
88
+ .zip(__index_factors__)
89
+ .map { |i, f| __calc_index_value__(i, f) }
90
+ .yield_self { |values| __reduce_array__(values.reverse, :+, 0) }
91
+ end
92
+
93
+ def __enclose_index_in_parenthesis(index)
94
+ integer?(index) && index || "(#{index})"
90
95
  end
91
96
 
92
97
  def __index_factors__
93
98
  Array.new(@array_size.size) do |i|
94
- i.zero? ? nil : __reduce_array__(@array_size[-i..-1], :*, 1)
99
+ i.zero? ? nil : __reduce_array__(@array_size[-i..], :*, 1)
95
100
  end
96
101
  end
97
102
 
@@ -17,13 +17,13 @@ module RgGen
17
17
  private
18
18
 
19
19
  def header_code(code)
20
- code << [:generate, space] if @top_scope
20
+ code << ['generate', space] if @top_scope
21
21
  code << "if (1) begin : #{name}" << nl
22
22
  end
23
23
 
24
24
  def footer_code(code)
25
- code << :end
26
- code << [space, :endgenerate] if @top_scope
25
+ code << 'end'
26
+ code << [space, 'endgenerate'] if @top_scope
27
27
  end
28
28
 
29
29
  def pre_body_code(code)
@@ -58,10 +58,12 @@ module RgGen
58
58
  end
59
59
 
60
60
  def post_body_code(code)
61
- (loop_size&.size || 0).times do
62
- code.indent -= 2
63
- code << :end << nl
64
- end
61
+ loop_size&.size&.times { generate_for_end(code) }
62
+ end
63
+
64
+ def generate_for_end(code)
65
+ code.indent -= 2
66
+ code << 'end' << nl
65
67
  end
66
68
  end
67
69
  end
@@ -23,11 +23,15 @@ module RgGen
23
23
  private
24
24
 
25
25
  def header_code(code)
26
- code << [:module, space, name]
26
+ module_header_begin(code)
27
27
  package_import_declaration(code)
28
28
  parameter_declarations(code)
29
29
  port_declarations(code)
30
- code << semicolon
30
+ module_header_end(code)
31
+ end
32
+
33
+ def module_header_begin(code)
34
+ code << 'module' << space << name
31
35
  end
32
36
 
33
37
  def package_import_declaration(code)
@@ -41,7 +45,7 @@ module RgGen
41
45
  def pacakge_import_items
42
46
  Array(@package_imports).map.with_index do |package, i|
43
47
  if i.zero?
44
- [:import, "#{package}::*"].join(space)
48
+ ['import', "#{package}::*"].join(space)
45
49
  else
46
50
  [space(6), "#{package}::*"].join(space)
47
51
  end
@@ -62,12 +66,16 @@ module RgGen
62
66
  end
63
67
  end
64
68
 
69
+ def module_header_end(code)
70
+ code << semicolon
71
+ end
72
+
65
73
  def pre_body_code(code)
66
74
  add_declarations_to_body(code, Array(variables))
67
75
  end
68
76
 
69
77
  def footer_code
70
- :endmodule
78
+ 'endmodule'
71
79
  end
72
80
  end
73
81
  end
@@ -30,7 +30,7 @@ module RgGen
30
30
  private
31
31
 
32
32
  def header_code(code)
33
- code << [:package, space, name, semicolon]
33
+ code << ['package', space, name, semicolon]
34
34
  end
35
35
 
36
36
  def pre_body_code(code)
@@ -41,18 +41,18 @@ module RgGen
41
41
  def package_import_declaration(code)
42
42
  declarations =
43
43
  Array(@package_imports)
44
- .map { |package| [:import, space, package, '::*'] }
44
+ .map { |package| ['import', space, package, '::*'] }
45
45
  add_declarations_to_body(code, declarations)
46
46
  end
47
47
 
48
48
  def file_include_directives(code)
49
49
  Array(@include_files).each do |file|
50
- code << [:'`include', space, string(file), nl]
50
+ code << ['`include', space, string(file), nl]
51
51
  end
52
52
  end
53
53
 
54
54
  def footer_code
55
- :endpackage
55
+ 'endpackage'
56
56
  end
57
57
  end
58
58
  end
@@ -13,7 +13,7 @@ module RgGen
13
13
  private
14
14
 
15
15
  def create_identifier(name)
16
- Identifier.new(name)
16
+ name && Identifier.new(name)
17
17
  end
18
18
 
19
19
  def assign(lhs, rhs)
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'facets/kernel/attr_singleton'
4
-
5
3
  require_relative 'version'
6
4
 
7
5
  require_relative 'common/utility/identifier'
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rof) do
4
+ sv_ral { access 'RO' }
5
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:rotrg, :rwtrg, :wotrg]) do
4
+ sv_ral do
5
+ access do
6
+ { rotrg: :ro, rwtrg: :rw, wotrg: :wo }[bit_field.type]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:rowo, :rowotrg]) do
4
+ sv_ral do
5
+ access 'rowo'
6
+ model_name { 'rggen_ral_rowo_field' }
7
+ end
8
+ end
@@ -4,11 +4,20 @@ RgGen.define_list_feature(:bit_field, :type) do
4
4
  sv_ral do
5
5
  base_feature do
6
6
  define_helpers do
7
- attr_setter :access
7
+ def access(access_type = nil, &block)
8
+ attribute_accessor('@access', access_type, &block)
9
+ end
8
10
 
9
11
  def model_name(name = nil, &block)
10
- @model_name = name || block || @model_name
11
- @model_name
12
+ attribute_accessor('@model_name', name, &block)
13
+ end
14
+
15
+ private
16
+
17
+ def attribute_accessor(variable_name, value, &block)
18
+ (new_value = value || block) &&
19
+ instance_variable_set(variable_name, new_value)
20
+ instance_variable_get(variable_name)
12
21
  end
13
22
  end
14
23
 
@@ -24,17 +33,16 @@ RgGen.define_list_feature(:bit_field, :type) do
24
33
  end
25
34
 
26
35
  def access
27
- (helper.access || bit_field.type).to_s.upcase
36
+ eval_attribute(:access, bit_field.type).to_s.upcase
28
37
  end
29
38
 
30
39
  def model_name
31
- name = helper.model_name
32
- name.is_a?(Proc) && instance_eval(&name) || name || :rggen_ral_field
40
+ eval_attribute(:model_name, 'rggen_ral_field')
33
41
  end
34
42
 
35
43
  def constructors
36
44
  (bit_field.sequence_size&.times || [nil]).map do |index|
37
- macro_call(:rggen_ral_create_field, arguments(index))
45
+ macro_call('rggen_ral_create_field', arguments(index))
38
46
  end
39
47
  end
40
48
 
@@ -73,6 +81,11 @@ RgGen.define_list_feature(:bit_field, :type) do
73
81
  ''
74
82
  end
75
83
  end
84
+
85
+ def eval_attribute(attribute, default_value)
86
+ value = helper.__send__(attribute)
87
+ value.is_a?(Proc) && instance_eval(&value) || value || default_value
88
+ end
76
89
  end
77
90
 
78
91
  default_feature do
@@ -9,7 +9,7 @@ module RgGen
9
9
  def array_indices
10
10
  if component.array?
11
11
  index_table = component.array_size.map { |size| (0...size).to_a }
12
- index_table[0].product(*index_table[1..-1])
12
+ index_table[0].product(*index_table[1..])
13
13
  else
14
14
  [nil]
15
15
  end
@@ -19,7 +19,9 @@ module RgGen
19
19
 
20
20
  plugin.files [
21
21
  'ral/bit_field/type',
22
- 'ral/bit_field/type/reserved_rof',
22
+ 'ral/bit_field/type/rof',
23
+ 'ral/bit_field/type/rotrg_rwtrg_wotrg',
24
+ 'ral/bit_field/type/rowo_rowotrg',
23
25
  'ral/bit_field/type/rwc_rws',
24
26
  'ral/bit_field/type/rwe_rwl',
25
27
  'ral/bit_field/type/w0trg_w1trg',
@@ -116,7 +116,7 @@ RgGen.define_simple_feature(:bit_field, :sv_rtl_top) do
116
116
 
117
117
  def bit_field_if_connection
118
118
  macro_call(
119
- :rggen_connect_bit_field_if,
119
+ 'rggen_connect_bit_field_if',
120
120
  [
121
121
  register.bit_field_if,
122
122
  bit_field.bit_field_sub_if,
@@ -7,6 +7,8 @@ rggen_bit_field #(
7
7
  .i_clk (<%= clock %>),
8
8
  .i_rst_n (<%= reset %>),
9
9
  .bit_field_if (<%= bit_field_if %>),
10
+ .o_write_trigger (),
11
+ .o_read_trigger (),
10
12
  .i_sw_write_enable (<%= write_enable %>),
11
13
  .i_hw_write_enable ('0),
12
14
  .i_hw_write_data ('0),
@@ -4,16 +4,16 @@ RgGen.define_list_item_feature(:bit_field, :type, [:rc, :w0c, :w1c, :wc, :woc])
4
4
  sv_rtl do
5
5
  build do
6
6
  input :set, {
7
- name: "i_#{full_name}_set", data_type: :logic, width: width,
7
+ name: "i_#{full_name}_set", width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
10
10
  output :value_out, {
11
- name: "o_#{full_name}", data_type: :logic, width: width,
11
+ name: "o_#{full_name}", width: width,
12
12
  array_size: array_size, array_format: array_port_format
13
13
  }
14
14
  if bit_field.reference?
15
15
  output :value_unmasked, {
16
- name: "o_#{full_name}_unmasked", data_type: :logic, width: width,
16
+ name: "o_#{full_name}_unmasked", width: width,
17
17
  array_size: array_size, array_format: array_port_format
18
18
  }
19
19
  end
@@ -1,10 +1,14 @@
1
1
  rggen_bit_field #(
2
- .WIDTH (<%= width %>),
3
- .STORAGE (0)
2
+ .WIDTH (<%= width %>),
3
+ .STORAGE (0),
4
+ .EXTERNAL_READ_DATA (1),
5
+ .TRIGGER (<%= trigger %>)
4
6
  ) u_bit_field (
5
- .i_clk ('0),
6
- .i_rst_n ('0),
7
+ .i_clk (<%= clock %>),
8
+ .i_rst_n (<%= reset %>),
7
9
  .bit_field_if (<%= bit_field_if %>),
10
+ .o_write_trigger (),
11
+ .o_read_trigger (<%= read_trigger_signal %>),
8
12
  .i_sw_write_enable ('0),
9
13
  .i_hw_write_enable ('0),
10
14
  .i_hw_write_data ('0),
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:ro, :rotrg]) do
4
+ sv_rtl do
5
+ build do
6
+ unless bit_field.reference?
7
+ input :value_in, {
8
+ name: "i_#{full_name}", width: width,
9
+ array_size: array_size, array_format: array_port_format
10
+ }
11
+ end
12
+ if rotrg?
13
+ output :read_trigger, {
14
+ name: "o_#{full_name}_read_trigger", width: 1,
15
+ array_size: array_size, array_format: array_port_format
16
+ }
17
+ end
18
+ end
19
+
20
+ main_code :bit_field, from_template: true
21
+
22
+ private
23
+
24
+ def rotrg?
25
+ bit_field.type == :rotrg
26
+ end
27
+
28
+ def trigger
29
+ rotrg? && 1 || 0
30
+ end
31
+
32
+ def read_trigger_signal
33
+ rotrg? && read_trigger[loop_variables] || nil
34
+ end
35
+
36
+ def reference_or_value_in
37
+ reference_bit_field || value_in[loop_variables]
38
+ end
39
+ end
40
+ end
@@ -1,10 +1,13 @@
1
1
  rggen_bit_field #(
2
- .WIDTH (<%= width %>),
3
- .STORAGE (0)
2
+ .WIDTH (<%= width %>),
3
+ .STORAGE (0),
4
+ .EXTERNAL_READ_DATA (1)
4
5
  ) u_bit_field (
5
6
  .i_clk ('0),
6
7
  .i_rst_n ('0),
7
8
  .bit_field_if (<%= bit_field_if %>),
9
+ .o_write_trigger (),
10
+ .o_read_trigger (),
8
11
  .i_sw_write_enable ('0),
9
12
  .i_hw_write_enable ('0),
10
13
  .i_hw_write_data ('0),
@@ -0,0 +1,21 @@
1
+ rggen_bit_field #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>),
4
+ .EXTERNAL_READ_DATA (1),
5
+ .TRIGGER (<%= trigger %>)
6
+ ) u_bit_field (
7
+ .i_clk (<%= clock %>),
8
+ .i_rst_n (<%= reset %>),
9
+ .bit_field_if (<%= bit_field_if %>),
10
+ .o_write_trigger (<%= write_trigger_signal %>),
11
+ .o_read_trigger (<%= read_trigger_signal %>),
12
+ .i_sw_write_enable ('1),
13
+ .i_hw_write_enable ('0),
14
+ .i_hw_write_data ('0),
15
+ .i_hw_set ('0),
16
+ .i_hw_clear ('0),
17
+ .i_value (<%= reference_or_value_in %>),
18
+ .i_mask ('1),
19
+ .o_value (<%= value_out[loop_variables] %>),
20
+ .o_value_unmasked ()
21
+ );
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:rowo, :rowotrg]) do
4
+ sv_rtl do
5
+ build do
6
+ output :value_out, {
7
+ name: "o_#{full_name}", width: width,
8
+ array_size: array_size, array_format: array_port_format
9
+ }
10
+ unless bit_field.reference?
11
+ input :value_in, {
12
+ name: "i_#{full_name}", width: width,
13
+ array_size: array_size, array_format: array_port_format
14
+ }
15
+ end
16
+ if rowotrg?
17
+ output :write_trigger, {
18
+ name: "o_#{full_name}_write_trigger", width: 1,
19
+ array_size: array_size, array_format: array_port_format
20
+ }
21
+ output :read_trigger, {
22
+ name: "o_#{full_name}_read_trigger", width: 1,
23
+ array_size: array_size, array_format: array_port_format
24
+ }
25
+ end
26
+ end
27
+
28
+ main_code :bit_field, from_template: true
29
+
30
+ private
31
+
32
+ def rowotrg?
33
+ bit_field.type == :rowotrg
34
+ end
35
+
36
+ def trigger
37
+ rowotrg? && 1 || 0
38
+ end
39
+
40
+ def write_trigger_signal
41
+ rowotrg? && write_trigger[loop_variables] || nil
42
+ end
43
+
44
+ def read_trigger_signal
45
+ rowotrg? && read_trigger[loop_variables] || nil
46
+ end
47
+
48
+ def reference_or_value_in
49
+ reference_bit_field || value_in[loop_variables]
50
+ end
51
+ end
52
+ end
@@ -7,6 +7,8 @@ rggen_bit_field #(
7
7
  .i_clk (<%= clock %>),
8
8
  .i_rst_n (<%= reset %>),
9
9
  .bit_field_if (<%= bit_field_if %>),
10
+ .o_write_trigger (),
11
+ .o_read_trigger (),
10
12
  .i_sw_write_enable (<%= write_enable %>),
11
13
  .i_hw_write_enable ('0),
12
14
  .i_hw_write_data ('0),
@@ -4,11 +4,11 @@ RgGen.define_list_item_feature(:bit_field, :type, [:rs, :w0s, :w1s, :ws, :wos])
4
4
  sv_rtl do
5
5
  build do
6
6
  input :clear, {
7
- name: "i_#{full_name}_clear", data_type: :logic, width: width,
7
+ name: "i_#{full_name}_clear", width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
10
10
  output :value_out, {
11
- name: "o_#{full_name}", data_type: :logic, width: width,
11
+ name: "o_#{full_name}", width: width,
12
12
  array_size: array_size, array_format: array_port_format
13
13
  }
14
14
  end