rggen-systemverilog 0.11.1 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -8
  3. data/lib/rggen/systemverilog.rb +3 -47
  4. data/lib/rggen/systemverilog/common.rb +44 -0
  5. data/lib/rggen/systemverilog/common/component.rb +25 -0
  6. data/lib/rggen/systemverilog/common/factories.rb +13 -0
  7. data/lib/rggen/systemverilog/common/feature.rb +78 -0
  8. data/lib/rggen/systemverilog/common/utility.rb +95 -0
  9. data/lib/rggen/systemverilog/common/utility/class_definition.rb +45 -0
  10. data/lib/rggen/systemverilog/common/utility/data_object.rb +131 -0
  11. data/lib/rggen/systemverilog/common/utility/function_definition.rb +47 -0
  12. data/lib/rggen/systemverilog/common/utility/identifier.rb +114 -0
  13. data/lib/rggen/systemverilog/common/utility/interface_instance.rb +57 -0
  14. data/lib/rggen/systemverilog/common/utility/interface_port.rb +51 -0
  15. data/lib/rggen/systemverilog/common/utility/local_scope.rb +64 -0
  16. data/lib/rggen/systemverilog/common/utility/module_definition.rb +76 -0
  17. data/lib/rggen/systemverilog/common/utility/package_definition.rb +61 -0
  18. data/lib/rggen/systemverilog/common/utility/source_file.rb +16 -0
  19. data/lib/rggen/systemverilog/common/utility/structure_definition.rb +39 -0
  20. data/lib/rggen/systemverilog/ral.rb +38 -0
  21. data/lib/rggen/systemverilog/ral/bit_field/type.rb +83 -0
  22. data/lib/rggen/systemverilog/ral/bit_field/type/reserved_rof.rb +5 -0
  23. data/lib/rggen/systemverilog/ral/bit_field/type/rwc_rwe_rwl.rb +23 -0
  24. data/lib/rggen/systemverilog/ral/bit_field/type/w0trg_w1trg.rb +7 -0
  25. data/lib/rggen/systemverilog/ral/feature.rb +26 -0
  26. data/lib/rggen/systemverilog/ral/register/type.rb +154 -0
  27. data/lib/rggen/systemverilog/ral/register/type/default.erb +8 -0
  28. data/lib/rggen/systemverilog/ral/register/type/external.rb +27 -0
  29. data/lib/rggen/systemverilog/ral/register/type/indirect.erb +13 -0
  30. data/lib/rggen/systemverilog/ral/register/type/indirect.rb +35 -0
  31. data/lib/rggen/systemverilog/ral/register_block/sv_ral_block_model.erb +11 -0
  32. data/lib/rggen/systemverilog/ral/register_block/sv_ral_package.rb +65 -0
  33. data/lib/rggen/systemverilog/ral/setup.rb +7 -0
  34. data/lib/rggen/systemverilog/rtl.rb +50 -0
  35. data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +89 -0
  36. data/lib/rggen/systemverilog/rtl/bit_field/type.rb +62 -0
  37. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.erb +15 -0
  38. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.rb +59 -0
  39. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.erb +3 -0
  40. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.rb +7 -0
  41. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.erb +6 -0
  42. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +22 -0
  43. data/lib/rggen/systemverilog/rtl/bit_field/type/rof.erb +6 -0
  44. data/lib/rggen/systemverilog/rtl/bit_field/type/rof.rb +7 -0
  45. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.erb +13 -0
  46. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.rb +32 -0
  47. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_wo.erb +9 -0
  48. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_wo.rb +14 -0
  49. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc_rwe_rwl.erb +16 -0
  50. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc_rwe_rwl.rb +61 -0
  51. data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.erb +9 -0
  52. data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +20 -0
  53. data/lib/rggen/systemverilog/rtl/feature.rb +48 -0
  54. data/lib/rggen/systemverilog/rtl/global/array_port_format.rb +19 -0
  55. data/lib/rggen/systemverilog/rtl/global/fold_sv_interface_port.rb +24 -0
  56. data/lib/rggen/systemverilog/rtl/register/sv_rtl_top.rb +82 -0
  57. data/lib/rggen/systemverilog/rtl/register/type.rb +65 -0
  58. data/lib/rggen/systemverilog/rtl/register/type/default.erb +15 -0
  59. data/lib/rggen/systemverilog/rtl/register/type/external.erb +11 -0
  60. data/lib/rggen/systemverilog/rtl/register/type/external.rb +91 -0
  61. data/lib/rggen/systemverilog/rtl/register/type/indirect.erb +17 -0
  62. data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +40 -0
  63. data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +100 -0
  64. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.erb +10 -0
  65. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +89 -0
  66. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.erb +11 -0
  67. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +125 -0
  68. data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_macros.erb +9 -0
  69. data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +86 -0
  70. data/lib/rggen/systemverilog/rtl/setup.rb +13 -0
  71. data/lib/rggen/systemverilog/version.rb +1 -1
  72. metadata +70 -20
  73. data/lib/rggen/systemverilog/component.rb +0 -23
  74. data/lib/rggen/systemverilog/factories.rb +0 -11
  75. data/lib/rggen/systemverilog/feature.rb +0 -76
  76. data/lib/rggen/systemverilog/feature_ral.rb +0 -24
  77. data/lib/rggen/systemverilog/feature_rtl.rb +0 -46
  78. data/lib/rggen/systemverilog/utility.rb +0 -93
  79. data/lib/rggen/systemverilog/utility/class_definition.rb +0 -43
  80. data/lib/rggen/systemverilog/utility/data_object.rb +0 -129
  81. data/lib/rggen/systemverilog/utility/function_definition.rb +0 -45
  82. data/lib/rggen/systemverilog/utility/identifier.rb +0 -112
  83. data/lib/rggen/systemverilog/utility/interface_instance.rb +0 -55
  84. data/lib/rggen/systemverilog/utility/interface_port.rb +0 -49
  85. data/lib/rggen/systemverilog/utility/local_scope.rb +0 -62
  86. data/lib/rggen/systemverilog/utility/module_definition.rb +0 -74
  87. data/lib/rggen/systemverilog/utility/package_definition.rb +0 -59
  88. data/lib/rggen/systemverilog/utility/source_file.rb +0 -14
  89. data/lib/rggen/systemverilog/utility/structure_definition.rb +0 -37
@@ -0,0 +1,15 @@
1
+ rggen_default_register #(
2
+ .READABLE (<%= readable %>),
3
+ .WRITABLE (<%= writable %>),
4
+ .ADDRESS_WIDTH (<%= address_width %>),
5
+ .OFFSET_ADDRESS (<%= offset_address %>),
6
+ .BUS_WIDTH (<%= bus_width %>),
7
+ .DATA_WIDTH (<%= width %>),
8
+ .VALID_BITS (<%= valid_bits %>),
9
+ .REGISTER_INDEX (<%= register_index %>)
10
+ ) u_register (
11
+ .i_clk (<%= register_block.clock %>),
12
+ .i_rst_n (<%= register_block.reset %>),
13
+ .register_if (<%= register_if %>),
14
+ .bit_field_if (<%= bit_field_if %>)
15
+ );
@@ -0,0 +1,11 @@
1
+ rggen_external_register #(
2
+ .ADDRESS_WIDTH (<%= address_width %>),
3
+ .BUS_WIDTH (<%= bus_width %>),
4
+ .START_ADDRESS (<%= start_address %>),
5
+ .END_ADDRESS (<%= end_address %>)
6
+ ) u_register (
7
+ .i_clk (<%= register_block.clock %>),
8
+ .i_rst_n (<%= register_block.reset %>),
9
+ .register_if (<%= register_if %>),
10
+ .bus_if (<%= bus_if %>)
11
+ );
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:register, :type, :external) do
4
+ sv_rtl do
5
+ build do
6
+ if configuration.fold_sv_interface_port?
7
+ interface_port :register_block, :bus_if, {
8
+ name: "#{register.name}_bus_if",
9
+ interface_type: 'rggen_bus_if',
10
+ modport: 'master'
11
+ }
12
+ else
13
+ output :register_block, :valid, {
14
+ name: "o_#{register.name}_valid",
15
+ data_type: :logic, width: 1
16
+ }
17
+ output :register_block, :address, {
18
+ name: "o_#{register.name}_address",
19
+ data_type: :logic, width: address_width
20
+ }
21
+ output :register_block, :write, {
22
+ name: "o_#{register.name}_write",
23
+ data_type: :logic, width: 1
24
+ }
25
+ output :register_block, :write_data, {
26
+ name: "o_#{register.name}_data",
27
+ data_type: :logic, width: bus_width
28
+ }
29
+ output :register_block, :strobe, {
30
+ name: "o_#{register.name}_strobe",
31
+ data_type: :logic, width: byte_width
32
+ }
33
+ input :register_block, :ready, {
34
+ name: "i_#{register.name}_ready",
35
+ data_type: :logic, width: 1
36
+ }
37
+ input :register_block, :status, {
38
+ name: "i_#{register.name}_status",
39
+ data_type: :logic, width: 2
40
+ }
41
+ input :register_block, :read_data, {
42
+ name: "i_#{register.name}_data",
43
+ data_type: :logic, width: bus_width
44
+ }
45
+ interface :register, :bus_if, {
46
+ name: 'bus_if', interface_type: 'rggen_bus_if',
47
+ parameter_values: [address_width, bus_width],
48
+ variables: [
49
+ 'valid', 'address', 'write', 'write_data', 'strobe',
50
+ 'ready', 'status', 'read_data'
51
+ ]
52
+ }
53
+ end
54
+ end
55
+
56
+ main_code :register, from_template: true
57
+ main_code :register do |code|
58
+ unless configuration.fold_sv_interface_port?
59
+ [
60
+ [valid, bus_if.valid],
61
+ [address, bus_if.address],
62
+ [write, bus_if.write],
63
+ [write_data, bus_if.write_data],
64
+ [strobe, bus_if.strobe],
65
+ [bus_if.ready, ready],
66
+ [bus_if.status, "rggen_status'(#{status})"],
67
+ [bus_if.read_data, read_data]
68
+ ].map { |lhs, rhs| code << assign(lhs, rhs) << nl }
69
+ end
70
+ end
71
+
72
+ private
73
+
74
+ def address_width
75
+ register_block.local_address_width
76
+ end
77
+
78
+ def byte_width
79
+ configuration.byte_width
80
+ end
81
+
82
+ def start_address
83
+ hex(register.offset_address, address_width)
84
+ end
85
+
86
+ def end_address
87
+ address = register.offset_address + register.byte_size - 1
88
+ hex(address, address_width)
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,17 @@
1
+ rggen_indirect_register #(
2
+ .READABLE (<%= readable %>),
3
+ .WRITABLE (<%= writable %>),
4
+ .ADDRESS_WIDTH (<%= address_width %>),
5
+ .OFFSET_ADDRESS (<%= offset_address %>),
6
+ .BUS_WIDTH (<%= bus_width %>),
7
+ .DATA_WIDTH (<%= width %>),
8
+ .VALID_BITS (<%= valid_bits %>),
9
+ .INDIRECT_INDEX_WIDTH (<%= index_width %>),
10
+ .INDIRECT_INDEX_VALUE (<%= concat(index_values) %>)
11
+ ) u_register (
12
+ .i_clk (<%= register_block.clock %>),
13
+ .i_rst_n (<%= register_block.reset %>),
14
+ .register_if (<%= register_if %>),
15
+ .i_indirect_index (<%= indirect_index %>),
16
+ .bit_field_if (<%= bit_field_if %>)
17
+ );
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:register, :type, :indirect) do
4
+ sv_rtl do
5
+ build do
6
+ logic :register, :indirect_index, { width: index_width }
7
+ end
8
+
9
+ main_code :register do |code|
10
+ code << indirect_index_assignment << nl
11
+ code << process_template
12
+ 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).inject(:+)
23
+ end
24
+
25
+ def index_values
26
+ loop_variables = register.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
+ end
40
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_feature(:register_block, :protocol) do
4
+ shared_context do
5
+ def feature_registry(registry = nil)
6
+ @registry = registry if registry
7
+ @registry
8
+ end
9
+
10
+ def available_protocols
11
+ feature_registry
12
+ .enabled_features(:protocol)
13
+ .select(&method(:valid_protocol?))
14
+ end
15
+
16
+ def valid_protocol?(protocol)
17
+ feature_registry.feature?(:protocol, protocol)
18
+ end
19
+ end
20
+
21
+ configuration do
22
+ base_feature do
23
+ property :protocol
24
+ build { |protocol| @protocol = protocol }
25
+ printable :protocol
26
+ end
27
+
28
+ default_feature do
29
+ end
30
+
31
+ factory do
32
+ convert_value do |value, position|
33
+ protocol = find_protocol(value)
34
+ protocol ||
35
+ (error "unknown protocol: #{value.inspect}", position)
36
+ end
37
+
38
+ default_value do |position|
39
+ default_protocol ||
40
+ (error 'no protocols are available', position)
41
+ end
42
+
43
+ def select_feature(data)
44
+ target_features[data.value]
45
+ end
46
+
47
+ private
48
+
49
+ def find_protocol(value)
50
+ available_protocols.find(&value.to_sym.method(:casecmp?))
51
+ end
52
+
53
+ def default_protocol
54
+ available_protocols.first
55
+ end
56
+
57
+ def available_protocols
58
+ @available_protocols ||= shared_context.available_protocols
59
+ end
60
+ end
61
+ end
62
+
63
+ sv_rtl do
64
+ shared_context.feature_registry(registry)
65
+
66
+ base_feature do
67
+ private
68
+
69
+ def address_width
70
+ configuration.address_width
71
+ end
72
+
73
+ def bus_width
74
+ configuration.bus_width
75
+ end
76
+
77
+ def byte_width
78
+ configuration.byte_width
79
+ end
80
+
81
+ def local_address_width
82
+ register_block.local_address_width
83
+ end
84
+
85
+ def total_registers
86
+ register_block.total_registers
87
+ end
88
+
89
+ def register_if
90
+ register_block.register_if
91
+ end
92
+ end
93
+
94
+ factory do
95
+ def select_feature(configuration, _register_block)
96
+ target_features[configuration.protocol]
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,10 @@
1
+ rggen_apb_adapter #(
2
+ .ADDRESS_WIDTH (<%= local_address_width %>),
3
+ .BUS_WIDTH (<%= bus_width %>),
4
+ .REGISTERS (<%= total_registers %>)
5
+ ) u_adapter (
6
+ .i_clk (<%= register_block.clock %>),
7
+ .i_rst_n (<%= register_block.reset %>),
8
+ .apb_if (<%= apb_if %>),
9
+ .register_if (<%= register_if %>)
10
+ );
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:register_block, :protocol, :apb) do
4
+ configuration do
5
+ verify(:component) do
6
+ error_condition { configuration.bus_width > 32 }
7
+ message do
8
+ 'bus width over 32 bit is not supported: ' \
9
+ "#{configuration.bus_width}"
10
+ end
11
+ end
12
+
13
+ verify(:component) do
14
+ error_condition { configuration.address_width > 32 }
15
+ message do
16
+ 'address width over 32 bit is not supported: ' \
17
+ "#{configuration.address_width}"
18
+ end
19
+ end
20
+ end
21
+
22
+ sv_rtl do
23
+ build do
24
+ if configuration.fold_sv_interface_port?
25
+ interface_port :register_block, :apb_if, {
26
+ name: 'apb_if', interface_type: 'rggen_apb_if', modport: 'slave'
27
+ }
28
+ else
29
+ input :register_block, :psel, {
30
+ name: 'i_psel', data_type: :logic, width: 1
31
+ }
32
+ input :register_block, :penable, {
33
+ name: 'i_penable', data_type: :logic, width: 1
34
+ }
35
+ input :register_block, :paddr, {
36
+ name: 'i_paddr', data_type: :logic, width: address_width
37
+ }
38
+ input :register_block, :pprot, {
39
+ name: 'i_pprot', data_type: :logic, width: 3
40
+ }
41
+ input :register_block, :pwrite, {
42
+ name: 'i_pwrite', data_type: :logic, width: 1
43
+ }
44
+ input :register_block, :pstrb, {
45
+ name: 'i_pstrb', data_type: :logic,
46
+ width: byte_width
47
+ }
48
+ input :register_block, :pwdata, {
49
+ name: 'i_pwdata', data_type: :logic, width: bus_width
50
+ }
51
+ output :register_block, :pready, {
52
+ name: 'o_pready', data_type: :logic, width: 1
53
+ }
54
+ output :register_block, :prdata, {
55
+ name: 'o_prdata', data_type: :logic, width: bus_width
56
+ }
57
+ output :register_block, :pslverr, {
58
+ name: 'o_pslverr', data_type: :logic, width: 1
59
+ }
60
+ interface :register_block, :apb_if, {
61
+ name: 'apb_if', interface_type: 'rggen_apb_if',
62
+ parameter_values: [address_width, bus_width],
63
+ variables: [
64
+ 'psel', 'penable', 'paddr', 'pprot', 'pwrite', 'pstrb', 'pwdata',
65
+ 'pready', 'prdata', 'pslverr'
66
+ ]
67
+ }
68
+ end
69
+ end
70
+
71
+ main_code :register_block, from_template: true
72
+ main_code :register_block do |code|
73
+ unless configuration.fold_sv_interface_port?
74
+ [
75
+ [apb_if.psel, psel],
76
+ [apb_if.penable, penable],
77
+ [apb_if.paddr, paddr],
78
+ [apb_if.pprot, pprot],
79
+ [apb_if.pwrite, pwrite],
80
+ [apb_if.pstrb, pstrb],
81
+ [apb_if.pwdata, pwdata],
82
+ [pready, apb_if.pready],
83
+ [prdata, apb_if.prdata],
84
+ [pslverr, apb_if.pslverr]
85
+ ].map { |lhs, rhs| code << assign(lhs, rhs) << nl }
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,11 @@
1
+ rggen_axi4lite_adapter #(
2
+ .ADDRESS_WIDTH (<%= local_address_width %>),
3
+ .BUS_WIDTH (<%= bus_width %>),
4
+ .REGISTERS (<%= total_registers %>),
5
+ .WRITE_FIRST (<%= write_first %>)
6
+ ) u_adapter (
7
+ .i_clk (<%= register_block.clock %>),
8
+ .i_rst_n (<%= register_block.reset %>),
9
+ .axi4lite_if (<%= axi4lite_if %>),
10
+ .register_if (<%= register_if %>)
11
+ );
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:register_block, :protocol, :axi4lite) do
4
+ configuration do
5
+ verify(:component) do
6
+ error_condition { ![32, 64].include?(configuration.bus_width) }
7
+ message do
8
+ 'bus width eigher 32 bit or 64 bit is only supported: ' \
9
+ "#{configuration.bus_width}"
10
+ end
11
+ end
12
+ end
13
+
14
+ sv_rtl do
15
+ build do
16
+ parameter :register_block, :write_first, {
17
+ name: 'WRITE_FIRST',
18
+ data_type: :bit,
19
+ default: 1
20
+ }
21
+ if configuration.fold_sv_interface_port?
22
+ interface_port :register_block, :axi4lite_if, {
23
+ name: 'axi4lite_if',
24
+ interface_type: 'rggen_axi4lite_if', modport: 'slave'
25
+ }
26
+ else
27
+ input :register_block, :awvalid, {
28
+ name: 'i_awvalid', data_type: :logic, width: 1
29
+ }
30
+ output :register_block, :awready, {
31
+ name: 'o_awready', data_type: :logic, width: 1
32
+ }
33
+ input :register_block, :awaddr, {
34
+ name: 'i_awaddr', data_type: :logic, width: address_width
35
+ }
36
+ input :register_block, :awprot, {
37
+ name: 'i_awprot', data_type: :logic, width: 3
38
+ }
39
+ input :register_block, :wvalid, {
40
+ name: 'i_wvalid', data_type: :logic, width: 1
41
+ }
42
+ output :register_block, :wready, {
43
+ name: 'o_wready', data_type: :logic, width: 1
44
+ }
45
+ input :register_block, :wdata, {
46
+ name: 'i_wdata', data_type: :logic, width: bus_width
47
+ }
48
+ input :register_block, :wstrb, {
49
+ name: 'i_wstrb', data_type: :logic, width: byte_width
50
+ }
51
+ output :register_block, :bvalid, {
52
+ name: 'o_bvalid', data_type: :logic, width: 1
53
+ }
54
+ input :register_block, :bready, {
55
+ name: 'i_bready', data_type: :logic, width: 1
56
+ }
57
+ output :register_block, :bresp, {
58
+ name: 'o_bresp', data_type: :logic, width: 2
59
+ }
60
+ input :register_block, :arvalid, {
61
+ name: 'i_arvalid', data_type: :logic, width: 1
62
+ }
63
+ output :register_block, :arready, {
64
+ name: 'o_arready', data_type: :logic, width: 1
65
+ }
66
+ input :register_block, :araddr, {
67
+ name: 'i_araddr', data_type: :logic, width: address_width
68
+ }
69
+ input :register_block, :arprot, {
70
+ name: 'i_arprot', data_type: :logic, width: 3
71
+ }
72
+ output :register_block, :rvalid, {
73
+ name: 'o_rvalid', data_type: :logic, width: 1
74
+ }
75
+ input :register_block, :rready, {
76
+ name: 'i_rready', data_type: :logic, width: 1
77
+ }
78
+ output :register_block, :rdata, {
79
+ name: 'o_rdata', data_type: :logic, width: bus_width
80
+ }
81
+ output :register_block, :rresp, {
82
+ name: 'o_rresp', data_type: :logic, width: 2
83
+ }
84
+ interface :register_block, :axi4lite_if, {
85
+ name: 'axi4lite_if', interface_type: 'rggen_axi4lite_if',
86
+ parameter_values: [address_width, bus_width],
87
+ variables: [
88
+ 'awvalid', 'awready', 'awaddr', 'awprot',
89
+ 'wvalid', 'wready', 'wdata', 'wstrb',
90
+ 'bvalid', 'bready', 'bresp',
91
+ 'arvalid', 'arready', 'araddr', 'arprot',
92
+ 'rvalid', 'rready', 'rdata', 'rresp'
93
+ ]
94
+ }
95
+ end
96
+ end
97
+
98
+ main_code :register_block, from_template: true
99
+ main_code :register_block do |code|
100
+ unless configuration.fold_sv_interface_port?
101
+ [
102
+ [axi4lite_if.awvalid, awvalid],
103
+ [awready, axi4lite_if.awready],
104
+ [axi4lite_if.awaddr, awaddr],
105
+ [axi4lite_if.awprot, awprot],
106
+ [axi4lite_if.wvalid, wvalid],
107
+ [wready, axi4lite_if.wready],
108
+ [axi4lite_if.wdata, wdata],
109
+ [axi4lite_if.wstrb, wstrb],
110
+ [bvalid, axi4lite_if.bvalid],
111
+ [axi4lite_if.bready, bready],
112
+ [bresp, axi4lite_if.bresp],
113
+ [axi4lite_if.arvalid, arvalid],
114
+ [arready, axi4lite_if.arready],
115
+ [axi4lite_if.araddr, araddr],
116
+ [axi4lite_if.arprot, arprot],
117
+ [rvalid, axi4lite_if.rvalid],
118
+ [axi4lite_if.rready, rready],
119
+ [rdata, axi4lite_if.rdata],
120
+ [rresp, axi4lite_if.rresp]
121
+ ].each { |lhs, rhs| code << assign(lhs, rhs) << nl }
122
+ end
123
+ end
124
+ end
125
+ end