rggen-systemverilog 0.22.0 → 0.25.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +2 -2
  4. data/lib/rggen/systemverilog/common.rb +0 -24
  5. data/lib/rggen/systemverilog/common/factories.rb +1 -1
  6. data/lib/rggen/systemverilog/common/feature.rb +3 -3
  7. data/lib/rggen/systemverilog/common/utility.rb +5 -1
  8. data/lib/rggen/systemverilog/common/utility/class_definition.rb +12 -4
  9. data/lib/rggen/systemverilog/common/utility/data_object.rb +1 -2
  10. data/lib/rggen/systemverilog/common/utility/function_definition.rb +16 -4
  11. data/lib/rggen/systemverilog/common/utility/identifier.rb +32 -23
  12. data/lib/rggen/systemverilog/common/utility/local_scope.rb +9 -7
  13. data/lib/rggen/systemverilog/common/utility/module_definition.rb +12 -4
  14. data/lib/rggen/systemverilog/common/utility/package_definition.rb +4 -4
  15. data/lib/rggen/systemverilog/ral.rb +20 -28
  16. data/lib/rggen/systemverilog/ral/bit_field/type.rb +2 -2
  17. data/lib/rggen/systemverilog/ral/bit_field/type/rof.rb +5 -0
  18. data/lib/rggen/systemverilog/ral/setup.rb +1 -1
  19. data/lib/rggen/systemverilog/rtl.rb +37 -44
  20. data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +11 -47
  21. data/lib/rggen/systemverilog/rtl/bit_field/type.rb +1 -2
  22. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.erb +19 -0
  23. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.rb +54 -0
  24. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.erb +15 -4
  25. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +1 -1
  26. data/lib/rggen/systemverilog/rtl/bit_field/type/rof.erb +15 -4
  27. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.erb +19 -0
  28. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.rb +44 -0
  29. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.erb +15 -7
  30. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.rb +3 -3
  31. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.erb +15 -7
  32. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -2
  33. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.erb +18 -0
  34. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.rb +34 -0
  35. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.erb +13 -7
  36. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +3 -3
  37. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.erb +19 -0
  38. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb +37 -0
  39. data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.erb +16 -8
  40. data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.rb +6 -3
  41. data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -1
  42. data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.erb +18 -0
  43. data/lib/rggen/systemverilog/rtl/bit_field/type/{w0src_w1src.rb → wrc_wrs.rb} +7 -5
  44. data/lib/rggen/systemverilog/rtl/bit_field_index.rb +52 -0
  45. data/lib/rggen/systemverilog/rtl/feature.rb +8 -6
  46. data/lib/rggen/systemverilog/rtl/indirect_index.rb +35 -0
  47. data/lib/rggen/systemverilog/rtl/partial_sum.rb +5 -6
  48. data/lib/rggen/systemverilog/rtl/register/type.rb +1 -56
  49. data/lib/rggen/systemverilog/rtl/register/type/external.rb +8 -20
  50. data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +2 -26
  51. data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +14 -8
  52. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +10 -10
  53. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +52 -50
  54. data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +3 -7
  55. data/lib/rggen/systemverilog/rtl/register_index.rb +17 -15
  56. data/lib/rggen/systemverilog/rtl/register_type.rb +69 -0
  57. data/lib/rggen/systemverilog/rtl/setup.rb +1 -1
  58. data/lib/rggen/systemverilog/version.rb +1 -1
  59. metadata +19 -48
  60. data/lib/rggen/systemverilog/ral/bit_field/type/reserved_rof.rb +0 -5
  61. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.erb +0 -15
  62. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.rb +0 -43
  63. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.erb +0 -3
  64. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.rb +0 -7
  65. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.erb +0 -13
  66. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.rb +0 -32
  67. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.erb +0 -10
  68. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.rb +0 -26
  69. data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.erb +0 -10
  70. data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.rb +0 -26
  71. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w1crs.erb +0 -10
  72. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w1crs.rb +0 -21
  73. data/lib/rggen/systemverilog/rtl/bit_field/type/w0src_w1src.erb +0 -10
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module SystemVerilog
5
+ module RTL
6
+ module IndirectIndex
7
+ private
8
+
9
+ def index_fields
10
+ @index_fields ||=
11
+ register.collect_index_fields(register_block.bit_fields)
12
+ end
13
+
14
+ def index_width
15
+ @index_width ||= index_fields.sum(&:width)
16
+ end
17
+
18
+ def index_values
19
+ loop_variables = register.local_loop_variables
20
+ register.index_entries.zip(index_fields).map do |entry, field|
21
+ if entry.array_index?
22
+ loop_variables.shift[0, field.width]
23
+ else
24
+ hex(entry.value, field.width)
25
+ end
26
+ end
27
+ end
28
+
29
+ def indirect_index_assignment
30
+ assign(indirect_index, concat(index_fields.map(&:value)))
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -7,12 +7,11 @@ module RgGen
7
7
  private
8
8
 
9
9
  def partial_sums(operands)
10
- sums =
11
- operands
12
- .chunk(&method(:integer?))
13
- .flat_map(&method(:calc_partial_sum))
14
- .reject { |value| integer?(value) && value.zero? }
15
- sums.empty? && [0] || sums
10
+ operands
11
+ .chunk(&method(:integer?))
12
+ .flat_map(&method(:calc_partial_sum))
13
+ .reject { |value| integer?(value) && value.zero? }
14
+ .tap { |sums| sums.empty? && (sums << 0) }
16
15
  end
17
16
 
18
17
  def calc_partial_sum(kind_ans_values)
@@ -3,65 +3,10 @@
3
3
  RgGen.define_list_feature(:register, :type) do
4
4
  sv_rtl do
5
5
  base_feature do
6
- include RgGen::SystemVerilog::RTL::PartialSum
6
+ include RgGen::SystemVerilog::RTL::RegisterType
7
7
 
8
8
  private
9
9
 
10
- def readable
11
- register.readable? && 1 || 0
12
- end
13
-
14
- def writable
15
- register.writable? && 1 || 0
16
- end
17
-
18
- def bus_width
19
- configuration.bus_width
20
- end
21
-
22
- def address_width
23
- register_block.local_address_width
24
- end
25
-
26
- def offset_address
27
- offsets = [*register_files, register].flat_map(&method(:collect_offsets))
28
- offsets = partial_sums(offsets)
29
- format_offsets(offsets)
30
- end
31
-
32
- def collect_offsets(component)
33
- if component.register_file? && component.array?
34
- [component.offset_address, byte_offset(component)]
35
- else
36
- component.offset_address
37
- end
38
- end
39
-
40
- def byte_offset(component)
41
- "#{component.byte_size(false)}*(#{component.local_index})"
42
- end
43
-
44
- def format_offsets(offsets)
45
- offsets.map(&method(:format_offset)).join('+')
46
- end
47
-
48
- def format_offset(offset)
49
- offset.is_a?(Integer) ? hex(offset, address_width) : offset
50
- end
51
-
52
- def width
53
- register.width
54
- end
55
-
56
- def valid_bits
57
- bits = register.bit_fields.map(&:bit_map).inject(:|)
58
- hex(bits, register.width)
59
- end
60
-
61
- def register_index
62
- register.local_index || 0
63
- end
64
-
65
10
  def register_if
66
11
  register_block.register_if[register.index]
67
12
  end
@@ -11,36 +11,28 @@ RgGen.define_list_item_feature(:register, :type, :external) do
11
11
  }
12
12
  else
13
13
  output :valid, {
14
- name: "o_#{register.name}_valid",
15
- data_type: :logic, width: 1
14
+ name: "o_#{register.name}_valid", width: 1
16
15
  }
17
16
  output :access, {
18
- name: "o_#{register.name}_access",
19
- data_type: :logic, width: '$bits(rggen_access)'
17
+ name: "o_#{register.name}_access", width: '$bits(rggen_access)'
20
18
  }
21
19
  output :address, {
22
- name: "o_#{register.name}_address",
23
- data_type: :logic, width: address_width
20
+ name: "o_#{register.name}_address", width: address_width
24
21
  }
25
22
  output :write_data, {
26
- name: "o_#{register.name}_data",
27
- data_type: :logic, width: bus_width
23
+ name: "o_#{register.name}_data", width: bus_width
28
24
  }
29
25
  output :strobe, {
30
- name: "o_#{register.name}_strobe",
31
- data_type: :logic, width: byte_width
26
+ name: "o_#{register.name}_strobe", width: byte_width
32
27
  }
33
28
  input :ready, {
34
- name: "i_#{register.name}_ready",
35
- data_type: :logic, width: 1
29
+ name: "i_#{register.name}_ready", width: 1
36
30
  }
37
31
  input :status, {
38
- name: "i_#{register.name}_status",
39
- data_type: :logic, width: 2
32
+ name: "i_#{register.name}_status", width: 2
40
33
  }
41
34
  input :read_data, {
42
- name: "i_#{register.name}_data",
43
- data_type: :logic, width: bus_width
35
+ name: "i_#{register.name}_data", width: bus_width
44
36
  }
45
37
  interface :bus_if, {
46
38
  name: 'bus_if', interface_type: 'rggen_bus_if',
@@ -71,10 +63,6 @@ RgGen.define_list_item_feature(:register, :type, :external) do
71
63
 
72
64
  private
73
65
 
74
- def address_width
75
- register_block.local_address_width
76
- end
77
-
78
66
  def byte_width
79
67
  configuration.byte_width
80
68
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  RgGen.define_list_item_feature(:register, :type, :indirect) do
4
4
  sv_rtl do
5
+ include RgGen::SystemVerilog::RTL::IndirectIndex
6
+
5
7
  build do
6
8
  logic :indirect_index, { width: index_width }
7
9
  end
@@ -10,31 +12,5 @@ RgGen.define_list_item_feature(:register, :type, :indirect) do
10
12
  code << indirect_index_assignment << nl
11
13
  code << process_template
12
14
  end
13
-
14
- private
15
-
16
- def index_fields
17
- @index_fields ||=
18
- register.collect_index_fields(register_block.bit_fields)
19
- end
20
-
21
- def index_width
22
- @index_width ||= index_fields.map(&:width).sum
23
- end
24
-
25
- def index_values
26
- loop_variables = register.local_loop_variables
27
- register.index_entries.zip(index_fields).map do |entry, field|
28
- if entry.array_index?
29
- loop_variables.shift[0, field.width]
30
- else
31
- hex(entry.value, field.width)
32
- end
33
- end
34
- end
35
-
36
- def indirect_index_assignment
37
- assign(indirect_index, concat(index_fields.map(&:value)))
38
- end
39
15
  end
40
16
  end
@@ -2,19 +2,25 @@
2
2
 
3
3
  RgGen.define_list_feature(:register_block, :protocol) do
4
4
  shared_context do
5
- def feature_registry(registry = nil)
6
- @registry = registry if registry
7
- @registry
5
+ def feature_registry(registry)
6
+ feature_registries << registry
8
7
  end
9
8
 
10
9
  def available_protocols
11
- feature_registry
12
- .enabled_features(:protocol)
13
- .select(&method(:valid_protocol?))
10
+ feature_registries
11
+ .map(&method(:collect_available_protocols)).inject(:&)
14
12
  end
15
13
 
16
- def valid_protocol?(protocol)
17
- feature_registry.feature?(:protocol, protocol)
14
+ private
15
+
16
+ def feature_registries
17
+ @feature_registries ||= []
18
+ end
19
+
20
+ def collect_available_protocols(registry)
21
+ registry
22
+ .enabled_features(:protocol)
23
+ .select { |protocol| registry.feature?(:protocol, protocol) }
18
24
  end
19
25
  end
20
26
 
@@ -27,34 +27,34 @@ RgGen.define_list_item_feature(:register_block, :protocol, :apb) do
27
27
  }
28
28
  else
29
29
  input :psel, {
30
- name: 'i_psel', data_type: :logic, width: 1
30
+ name: 'i_psel', width: 1
31
31
  }
32
32
  input :penable, {
33
- name: 'i_penable', data_type: :logic, width: 1
33
+ name: 'i_penable', width: 1
34
34
  }
35
35
  input :paddr, {
36
- name: 'i_paddr', data_type: :logic, width: address_width
36
+ name: 'i_paddr', width: address_width
37
37
  }
38
38
  input :pprot, {
39
- name: 'i_pprot', data_type: :logic, width: 3
39
+ name: 'i_pprot', width: 3
40
40
  }
41
41
  input :pwrite, {
42
- name: 'i_pwrite', data_type: :logic, width: 1
42
+ name: 'i_pwrite', width: 1
43
43
  }
44
44
  input :pstrb, {
45
- name: 'i_pstrb', data_type: :logic, width: byte_width
45
+ name: 'i_pstrb', width: byte_width
46
46
  }
47
47
  input :pwdata, {
48
- name: 'i_pwdata', data_type: :logic, width: bus_width
48
+ name: 'i_pwdata', width: bus_width
49
49
  }
50
50
  output :pready, {
51
- name: 'o_pready', data_type: :logic, width: 1
51
+ name: 'o_pready', width: 1
52
52
  }
53
53
  output :prdata, {
54
- name: 'o_prdata', data_type: :logic, width: bus_width
54
+ name: 'o_prdata', width: bus_width
55
55
  }
56
56
  output :pslverr, {
57
- name: 'o_pslverr', data_type: :logic, width: 1
57
+ name: 'o_pslverr', width: 1
58
58
  }
59
59
  interface :apb_if, {
60
60
  name: 'apb_if', interface_type: 'rggen_apb_if',
@@ -26,73 +26,73 @@ RgGen.define_list_item_feature(:register_block, :protocol, :axi4lite) do
26
26
  }
27
27
  else
28
28
  input :awvalid, {
29
- name: 'i_awvalid', data_type: :logic, width: 1
29
+ name: 'i_awvalid', width: 1
30
30
  }
31
31
  output :awready, {
32
- name: 'o_awready', data_type: :logic, width: 1
32
+ name: 'o_awready', width: 1
33
33
  }
34
34
  input :awid, {
35
- name: 'i_awid', data_type: :logic, width: id_port_width
35
+ name: 'i_awid', width: id_port_width
36
36
  }
37
37
  input :awaddr, {
38
- name: 'i_awaddr', data_type: :logic, width: address_width
38
+ name: 'i_awaddr', width: address_width
39
39
  }
40
40
  input :awprot, {
41
- name: 'i_awprot', data_type: :logic, width: 3
41
+ name: 'i_awprot', width: 3
42
42
  }
43
43
  input :wvalid, {
44
- name: 'i_wvalid', data_type: :logic, width: 1
44
+ name: 'i_wvalid', width: 1
45
45
  }
46
46
  output :wready, {
47
- name: 'o_wready', data_type: :logic, width: 1
47
+ name: 'o_wready', width: 1
48
48
  }
49
49
  input :wdata, {
50
- name: 'i_wdata', data_type: :logic, width: bus_width
50
+ name: 'i_wdata', width: bus_width
51
51
  }
52
52
  input :wstrb, {
53
- name: 'i_wstrb', data_type: :logic, width: byte_width
53
+ name: 'i_wstrb', width: byte_width
54
54
  }
55
55
  output :bvalid, {
56
- name: 'o_bvalid', data_type: :logic, width: 1
56
+ name: 'o_bvalid', width: 1
57
57
  }
58
58
  output :bid, {
59
- name: 'o_bid', data_type: :logic, width: id_port_width
59
+ name: 'o_bid', width: id_port_width
60
60
  }
61
61
  input :bready, {
62
- name: 'i_bready', data_type: :logic, width: 1
62
+ name: 'i_bready', width: 1
63
63
  }
64
64
  output :bresp, {
65
- name: 'o_bresp', data_type: :logic, width: 2
65
+ name: 'o_bresp', width: 2
66
66
  }
67
67
  input :arvalid, {
68
- name: 'i_arvalid', data_type: :logic, width: 1
68
+ name: 'i_arvalid', width: 1
69
69
  }
70
70
  output :arready, {
71
- name: 'o_arready', data_type: :logic, width: 1
71
+ name: 'o_arready', width: 1
72
72
  }
73
73
  input :arid, {
74
- name: 'i_arid', data_type: :logic, width: id_port_width
74
+ name: 'i_arid', width: id_port_width
75
75
  }
76
76
  input :araddr, {
77
- name: 'i_araddr', data_type: :logic, width: address_width
77
+ name: 'i_araddr', width: address_width
78
78
  }
79
79
  input :arprot, {
80
- name: 'i_arprot', data_type: :logic, width: 3
80
+ name: 'i_arprot', width: 3
81
81
  }
82
82
  output :rvalid, {
83
- name: 'o_rvalid', data_type: :logic, width: 1
83
+ name: 'o_rvalid', width: 1
84
84
  }
85
85
  input :rready, {
86
- name: 'i_rready', data_type: :logic, width: 1
86
+ name: 'i_rready', width: 1
87
87
  }
88
88
  output :rid, {
89
- name: 'o_rid', data_type: :logic, width: id_port_width
89
+ name: 'o_rid', width: id_port_width
90
90
  }
91
91
  output :rdata, {
92
- name: 'o_rdata', data_type: :logic, width: bus_width
92
+ name: 'o_rdata', width: bus_width
93
93
  }
94
94
  output :rresp, {
95
- name: 'o_rresp', data_type: :logic, width: 2
95
+ name: 'o_rresp', width: 2
96
96
  }
97
97
  interface :axi4lite_if, {
98
98
  name: 'axi4lite_if', interface_type: 'rggen_axi4lite_if',
@@ -110,33 +110,7 @@ RgGen.define_list_item_feature(:register_block, :protocol, :axi4lite) do
110
110
 
111
111
  main_code :register_block, from_template: true
112
112
  main_code :register_block do |code|
113
- unless configuration.fold_sv_interface_port?
114
- [
115
- [axi4lite_if.awvalid, awvalid],
116
- [awready, axi4lite_if.awready],
117
- [axi4lite_if.awid, awid],
118
- [axi4lite_if.awaddr, awaddr],
119
- [axi4lite_if.awprot, awprot],
120
- [axi4lite_if.wvalid, wvalid],
121
- [wready, axi4lite_if.wready],
122
- [axi4lite_if.wdata, wdata],
123
- [axi4lite_if.wstrb, wstrb],
124
- [bvalid, axi4lite_if.bvalid],
125
- [axi4lite_if.bready, bready],
126
- [bid, axi4lite_if.bid],
127
- [bresp, axi4lite_if.bresp],
128
- [axi4lite_if.arvalid, arvalid],
129
- [arready, axi4lite_if.arready],
130
- [axi4lite_if.arid, arid],
131
- [axi4lite_if.araddr, araddr],
132
- [axi4lite_if.arprot, arprot],
133
- [rvalid, axi4lite_if.rvalid],
134
- [axi4lite_if.rready, rready],
135
- [rid, axi4lite_if.rid],
136
- [rdata, axi4lite_if.rdata],
137
- [rresp, axi4lite_if.rresp]
138
- ].each { |lhs, rhs| code << assign(lhs, rhs) << nl }
139
- end
113
+ configuration.fold_sv_interface_port? || assign_axi4lite_signals(code)
140
114
  end
141
115
 
142
116
  private
@@ -144,5 +118,33 @@ RgGen.define_list_item_feature(:register_block, :protocol, :axi4lite) do
144
118
  def id_port_width
145
119
  "((#{id_width}>0)?#{id_width}:1)"
146
120
  end
121
+
122
+ def assign_axi4lite_signals(code)
123
+ [
124
+ [axi4lite_if.awvalid, awvalid],
125
+ [awready, axi4lite_if.awready],
126
+ [axi4lite_if.awid, awid],
127
+ [axi4lite_if.awaddr, awaddr],
128
+ [axi4lite_if.awprot, awprot],
129
+ [axi4lite_if.wvalid, wvalid],
130
+ [wready, axi4lite_if.wready],
131
+ [axi4lite_if.wdata, wdata],
132
+ [axi4lite_if.wstrb, wstrb],
133
+ [bvalid, axi4lite_if.bvalid],
134
+ [axi4lite_if.bready, bready],
135
+ [bid, axi4lite_if.bid],
136
+ [bresp, axi4lite_if.bresp],
137
+ [axi4lite_if.arvalid, arvalid],
138
+ [arready, axi4lite_if.arready],
139
+ [axi4lite_if.arid, arid],
140
+ [axi4lite_if.araddr, araddr],
141
+ [axi4lite_if.arprot, arprot],
142
+ [rvalid, axi4lite_if.rvalid],
143
+ [axi4lite_if.rready, rready],
144
+ [rid, axi4lite_if.rid],
145
+ [rdata, axi4lite_if.rdata],
146
+ [rresp, axi4lite_if.rresp]
147
+ ].each { |lhs, rhs| code << assign(lhs, rhs) << nl }
148
+ end
147
149
  end
148
150
  end