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.
- checksums.yaml +4 -4
- data/README.md +2 -8
- data/lib/rggen/systemverilog.rb +3 -47
- data/lib/rggen/systemverilog/common.rb +44 -0
- data/lib/rggen/systemverilog/common/component.rb +25 -0
- data/lib/rggen/systemverilog/common/factories.rb +13 -0
- data/lib/rggen/systemverilog/common/feature.rb +78 -0
- data/lib/rggen/systemverilog/common/utility.rb +95 -0
- data/lib/rggen/systemverilog/common/utility/class_definition.rb +45 -0
- data/lib/rggen/systemverilog/common/utility/data_object.rb +131 -0
- data/lib/rggen/systemverilog/common/utility/function_definition.rb +47 -0
- data/lib/rggen/systemverilog/common/utility/identifier.rb +114 -0
- data/lib/rggen/systemverilog/common/utility/interface_instance.rb +57 -0
- data/lib/rggen/systemverilog/common/utility/interface_port.rb +51 -0
- data/lib/rggen/systemverilog/common/utility/local_scope.rb +64 -0
- data/lib/rggen/systemverilog/common/utility/module_definition.rb +76 -0
- data/lib/rggen/systemverilog/common/utility/package_definition.rb +61 -0
- data/lib/rggen/systemverilog/common/utility/source_file.rb +16 -0
- data/lib/rggen/systemverilog/common/utility/structure_definition.rb +39 -0
- data/lib/rggen/systemverilog/ral.rb +38 -0
- data/lib/rggen/systemverilog/ral/bit_field/type.rb +83 -0
- data/lib/rggen/systemverilog/ral/bit_field/type/reserved_rof.rb +5 -0
- data/lib/rggen/systemverilog/ral/bit_field/type/rwc_rwe_rwl.rb +23 -0
- data/lib/rggen/systemverilog/ral/bit_field/type/w0trg_w1trg.rb +7 -0
- data/lib/rggen/systemverilog/ral/feature.rb +26 -0
- data/lib/rggen/systemverilog/ral/register/type.rb +154 -0
- data/lib/rggen/systemverilog/ral/register/type/default.erb +8 -0
- data/lib/rggen/systemverilog/ral/register/type/external.rb +27 -0
- data/lib/rggen/systemverilog/ral/register/type/indirect.erb +13 -0
- data/lib/rggen/systemverilog/ral/register/type/indirect.rb +35 -0
- data/lib/rggen/systemverilog/ral/register_block/sv_ral_block_model.erb +11 -0
- data/lib/rggen/systemverilog/ral/register_block/sv_ral_package.rb +65 -0
- data/lib/rggen/systemverilog/ral/setup.rb +7 -0
- data/lib/rggen/systemverilog/rtl.rb +50 -0
- data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +89 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type.rb +62 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.erb +15 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c.rb +59 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.erb +3 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.rb +7 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/ro.erb +6 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +22 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rof.erb +6 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rof.rb +7 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.erb +13 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s.rb +32 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rw_wo.erb +9 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rw_wo.rb +14 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwc_rwe_rwl.erb +16 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwc_rwe_rwl.rb +61 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.erb +9 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +20 -0
- data/lib/rggen/systemverilog/rtl/feature.rb +48 -0
- data/lib/rggen/systemverilog/rtl/global/array_port_format.rb +19 -0
- data/lib/rggen/systemverilog/rtl/global/fold_sv_interface_port.rb +24 -0
- data/lib/rggen/systemverilog/rtl/register/sv_rtl_top.rb +82 -0
- data/lib/rggen/systemverilog/rtl/register/type.rb +65 -0
- data/lib/rggen/systemverilog/rtl/register/type/default.erb +15 -0
- data/lib/rggen/systemverilog/rtl/register/type/external.erb +11 -0
- data/lib/rggen/systemverilog/rtl/register/type/external.rb +91 -0
- data/lib/rggen/systemverilog/rtl/register/type/indirect.erb +17 -0
- data/lib/rggen/systemverilog/rtl/register/type/indirect.rb +40 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol.rb +100 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.erb +10 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +89 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.erb +11 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +125 -0
- data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_macros.erb +9 -0
- data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +86 -0
- data/lib/rggen/systemverilog/rtl/setup.rb +13 -0
- data/lib/rggen/systemverilog/version.rb +1 -1
- metadata +70 -20
- data/lib/rggen/systemverilog/component.rb +0 -23
- data/lib/rggen/systemverilog/factories.rb +0 -11
- data/lib/rggen/systemverilog/feature.rb +0 -76
- data/lib/rggen/systemverilog/feature_ral.rb +0 -24
- data/lib/rggen/systemverilog/feature_rtl.rb +0 -46
- data/lib/rggen/systemverilog/utility.rb +0 -93
- data/lib/rggen/systemverilog/utility/class_definition.rb +0 -43
- data/lib/rggen/systemverilog/utility/data_object.rb +0 -129
- data/lib/rggen/systemverilog/utility/function_definition.rb +0 -45
- data/lib/rggen/systemverilog/utility/identifier.rb +0 -112
- data/lib/rggen/systemverilog/utility/interface_instance.rb +0 -55
- data/lib/rggen/systemverilog/utility/interface_port.rb +0 -49
- data/lib/rggen/systemverilog/utility/local_scope.rb +0 -62
- data/lib/rggen/systemverilog/utility/module_definition.rb +0 -74
- data/lib/rggen/systemverilog/utility/package_definition.rb +0 -59
- data/lib/rggen/systemverilog/utility/source_file.rb +0 -14
- 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
|