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.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/lib/rggen/systemverilog/common/factories.rb +1 -1
- data/lib/rggen/systemverilog/common/feature.rb +1 -1
- data/lib/rggen/systemverilog/common/utility/class_definition.rb +12 -4
- data/lib/rggen/systemverilog/common/utility/data_object.rb +1 -2
- data/lib/rggen/systemverilog/common/utility/function_definition.rb +16 -4
- data/lib/rggen/systemverilog/common/utility/identifier.rb +16 -11
- data/lib/rggen/systemverilog/common/utility/local_scope.rb +9 -7
- data/lib/rggen/systemverilog/common/utility/module_definition.rb +12 -4
- data/lib/rggen/systemverilog/common/utility/package_definition.rb +4 -4
- data/lib/rggen/systemverilog/common/utility.rb +1 -1
- data/lib/rggen/systemverilog/common.rb +0 -2
- data/lib/rggen/systemverilog/ral/bit_field/type/rof.rb +5 -0
- data/lib/rggen/systemverilog/ral/bit_field/type/rotrg_rwtrg_wotrg.rb +9 -0
- data/lib/rggen/systemverilog/ral/bit_field/type/rowo_rowotrg.rb +8 -0
- data/lib/rggen/systemverilog/ral/bit_field/type.rb +20 -7
- data/lib/rggen/systemverilog/ral/register_common.rb +1 -1
- data/lib/rggen/systemverilog/ral.rb +3 -1
- data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.erb +2 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.rb +3 -3
- data/lib/rggen/systemverilog/rtl/bit_field/type/{ro.erb → ro_rotrg.erb} +8 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/ro_rotrg.rb +40 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rof.erb +5 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/rowo_rowotrg.erb +21 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rowo_rowotrg.rb +52 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.erb +2 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.rb +2 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/{rw_w1_wo_wo1.erb → rw_rwtrg_w1.erb} +4 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/rw_rwtrg_w1.rb +46 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.erb +2 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/{rwl.erb → rwe_rwl.erb} +4 -2
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.rb +34 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rws.erb +2 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +3 -3
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.erb +2 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.erb +2 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field/type/{rwe.erb → wo_wo1_wotrg.erb} +8 -4
- data/lib/rggen/systemverilog/rtl/bit_field/type/wo_wo1_wotrg.rb +38 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.erb +2 -0
- data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.rb +1 -1
- data/lib/rggen/systemverilog/rtl/bit_field_index.rb +1 -2
- data/lib/rggen/systemverilog/rtl/feature.rb +8 -6
- data/lib/rggen/systemverilog/rtl/partial_sum.rb +5 -6
- data/lib/rggen/systemverilog/rtl/register/type/external.rb +5 -62
- data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +3 -60
- data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +4 -118
- data/lib/rggen/systemverilog/rtl/register_block/protocol/wishbone.erb +17 -0
- data/lib/rggen/systemverilog/rtl/register_block/protocol/wishbone.rb +26 -0
- data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +2 -6
- data/lib/rggen/systemverilog/rtl/register_index.rb +13 -11
- data/lib/rggen/systemverilog/rtl/register_type.rb +4 -3
- data/lib/rggen/systemverilog/rtl/setup.rb +2 -4
- data/lib/rggen/systemverilog/rtl.rb +6 -6
- data/lib/rggen/systemverilog/version.rb +1 -1
- metadata +21 -31
- data/lib/rggen/systemverilog/ral/bit_field/type/reserved_rof.rb +0 -5
- data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.erb +0 -18
- data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.rb +0 -7
- data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +0 -22
- data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.rb +0 -24
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.rb +0 -26
- data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.rb +0 -26
- data/lib/rggen/systemverilog/rtl/global/fold_sv_interface_port.rb +0 -28
@@ -1,12 +1,14 @@
|
|
1
1
|
rggen_bit_field #(
|
2
2
|
.WIDTH (<%= width %>),
|
3
3
|
.INITIAL_VALUE (<%= initial_value %>),
|
4
|
-
.
|
5
|
-
.
|
4
|
+
.SW_WRITE_ONCE (<%= write_once %>),
|
5
|
+
.TRIGGER (<%= trigger %>)
|
6
6
|
) u_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 (<%= write_trigger_signal %>),
|
11
|
+
.o_read_trigger (<%= read_trigger_signal %>),
|
10
12
|
.i_sw_write_enable ('1),
|
11
13
|
.i_hw_write_enable ('0),
|
12
14
|
.i_hw_write_data ('0),
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:rw, :rwtrg, :w1]) 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
|
+
if rwtrg?
|
11
|
+
output :write_trigger, {
|
12
|
+
name: "o_#{full_name}_write_trigger", width: 1,
|
13
|
+
array_size: array_size, array_format: array_port_format
|
14
|
+
}
|
15
|
+
output :read_trigger, {
|
16
|
+
name: "o_#{full_name}_read_trigger", width: 1,
|
17
|
+
array_size: array_size, array_format: array_port_format
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
main_code :bit_field, from_template: true
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def rwtrg?
|
27
|
+
bit_field.type == :rwtrg
|
28
|
+
end
|
29
|
+
|
30
|
+
def trigger
|
31
|
+
rwtrg? && 1 || 0
|
32
|
+
end
|
33
|
+
|
34
|
+
def write_trigger_signal
|
35
|
+
rwtrg? && write_trigger[loop_variables] || nil
|
36
|
+
end
|
37
|
+
|
38
|
+
def read_trigger_signal
|
39
|
+
rwtrg? && read_trigger[loop_variables] || nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def write_once
|
43
|
+
bit_field.type == :w1 && 1 || 0
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -5,12 +5,12 @@ RgGen.define_list_item_feature(:bit_field, :type, :rwc) do
|
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
7
|
input :clear, {
|
8
|
-
name: "i_#{full_name}_clear",
|
8
|
+
name: "i_#{full_name}_clear", width: 1,
|
9
9
|
array_size: array_size, array_format: array_port_format
|
10
10
|
}
|
11
11
|
end
|
12
12
|
output :value_out, {
|
13
|
-
name: "o_#{full_name}",
|
13
|
+
name: "o_#{full_name}", width: width,
|
14
14
|
array_size: array_size, array_format: array_port_format
|
15
15
|
}
|
16
16
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
rggen_bit_field #(
|
2
2
|
.WIDTH (<%= width %>),
|
3
3
|
.INITIAL_VALUE (<%= initial_value %>),
|
4
|
-
.SW_WRITE_ENABLE_POLARITY (
|
4
|
+
.SW_WRITE_ENABLE_POLARITY (<%= polarity %>)
|
5
5
|
) u_bit_field (
|
6
6
|
.i_clk (<%= clock %>),
|
7
7
|
.i_rst_n (<%= reset %>),
|
8
8
|
.bit_field_if (<%= bit_field_if %>),
|
9
|
-
.
|
9
|
+
.o_write_trigger (),
|
10
|
+
.o_read_trigger (),
|
11
|
+
.i_sw_write_enable (<%= control_signal %>),
|
10
12
|
.i_hw_write_enable ('0),
|
11
13
|
.i_hw_write_data ('0),
|
12
14
|
.i_hw_set ('0),
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:rwe, :rwl]) do
|
4
|
+
sv_rtl do
|
5
|
+
build do
|
6
|
+
unless bit_field.reference?
|
7
|
+
input :control, {
|
8
|
+
name: "i_#{full_name}_#{enable_or_lock}", width: 1,
|
9
|
+
array_size: array_size, array_format: array_port_format
|
10
|
+
}
|
11
|
+
end
|
12
|
+
output :value_out, {
|
13
|
+
name: "o_#{full_name}", width: width,
|
14
|
+
array_size: array_size, array_format: array_port_format
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
main_code :bit_field, from_template: true
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def enable_or_lock
|
23
|
+
{ rwe: :enable, rwl: :lock }[bit_field.type]
|
24
|
+
end
|
25
|
+
|
26
|
+
def control_signal
|
27
|
+
reference_bit_field || control[loop_variables]
|
28
|
+
end
|
29
|
+
|
30
|
+
def polarity
|
31
|
+
{ rwe: 'RGGEN_ACTIVE_HIGH', rwl: 'RGGEN_ACTIVE_LOW' }[bit_field.type]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -5,6 +5,8 @@ rggen_bit_field #(
|
|
5
5
|
.i_clk (<%= clock %>),
|
6
6
|
.i_rst_n (<%= reset %>),
|
7
7
|
.bit_field_if (<%= bit_field_if %>),
|
8
|
+
.o_write_trigger (),
|
9
|
+
.o_read_trigger (),
|
8
10
|
.i_sw_write_enable ('1),
|
9
11
|
.i_hw_write_enable (<%= set_signal %>),
|
10
12
|
.i_hw_write_data (<%= value_in[loop_variables] %>),
|
@@ -5,16 +5,16 @@ RgGen.define_list_item_feature(:bit_field, :type, :rws) do
|
|
5
5
|
build do
|
6
6
|
unless bit_field.reference?
|
7
7
|
input :set, {
|
8
|
-
name: "i_#{full_name}_set",
|
8
|
+
name: "i_#{full_name}_set", width: 1,
|
9
9
|
array_size: array_size, array_format: array_port_format
|
10
10
|
}
|
11
11
|
end
|
12
12
|
input :value_in, {
|
13
|
-
name: "i_#{full_name}",
|
13
|
+
name: "i_#{full_name}", width: width,
|
14
14
|
array_size: array_size, array_format: array_port_format
|
15
15
|
}
|
16
16
|
output :value_out, {
|
17
|
-
name: "o_#{full_name}",
|
17
|
+
name: "o_#{full_name}", width: width,
|
18
18
|
array_size: array_size, array_format: array_port_format
|
19
19
|
}
|
20
20
|
end
|
@@ -4,7 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:w0t, :w1t]) do
|
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
6
|
output :value_out, {
|
7
|
-
name: "o_#{full_name}",
|
7
|
+
name: "o_#{full_name}", width: width,
|
8
8
|
array_size: array_size, array_format: array_port_format
|
9
9
|
}
|
10
10
|
end
|
@@ -4,7 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:w0trg, :w1trg]) do
|
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
6
|
output :trigger, {
|
7
|
-
name: "o_#{full_name}_trigger",
|
7
|
+
name: "o_#{full_name}_trigger", width: width,
|
8
8
|
array_size: array_size, array_format: array_port_format
|
9
9
|
}
|
10
10
|
end
|
@@ -1,12 +1,16 @@
|
|
1
1
|
rggen_bit_field #(
|
2
|
-
.WIDTH
|
3
|
-
.INITIAL_VALUE
|
4
|
-
.
|
2
|
+
.WIDTH (<%= width %>),
|
3
|
+
.INITIAL_VALUE (<%= initial_value %>),
|
4
|
+
.SW_READ_ACTION (RGGEN_READ_NONE),
|
5
|
+
.SW_WRITE_ONCE (<%= write_once %>),
|
6
|
+
.TRIGGER (<%= trigger %>)
|
5
7
|
) u_bit_field (
|
6
8
|
.i_clk (<%= clock %>),
|
7
9
|
.i_rst_n (<%= reset %>),
|
8
10
|
.bit_field_if (<%= bit_field_if %>),
|
9
|
-
.
|
11
|
+
.o_write_trigger (<%= write_trigger_signal %>),
|
12
|
+
.o_read_trigger (),
|
13
|
+
.i_sw_write_enable ('1),
|
10
14
|
.i_hw_write_enable ('0),
|
11
15
|
.i_hw_write_data ('0),
|
12
16
|
.i_hw_set ('0),
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:wo, :wo1, :wotrg]) 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
|
+
if wotrg?
|
11
|
+
output :write_trigger, {
|
12
|
+
name: "o_#{full_name}_write_trigger", width: 1,
|
13
|
+
array_size: array_size, array_format: array_port_format
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
main_code :bit_field, from_template: true
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def wotrg?
|
23
|
+
bit_field.type == :wotrg
|
24
|
+
end
|
25
|
+
|
26
|
+
def trigger
|
27
|
+
wotrg? && 1 || 0
|
28
|
+
end
|
29
|
+
|
30
|
+
def write_trigger_signal
|
31
|
+
wotrg? && write_trigger[loop_variables] || nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def write_once
|
35
|
+
bit_field.type == :wo1 && 1 || 0
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -4,7 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:wrc, :wrs]) do
|
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
6
|
output :value_out, {
|
7
|
-
name: "o_#{full_name}",
|
7
|
+
name: "o_#{full_name}", width: width,
|
8
8
|
array_size: array_size, array_format: array_port_format
|
9
9
|
}
|
10
10
|
end
|
@@ -16,10 +16,12 @@ module RgGen
|
|
16
16
|
InterfaceInstance.new(attributes, &block)
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
def create_port(direction, attributes, &block)
|
20
|
+
attributes =
|
21
|
+
{ data_type: 'logic' }
|
22
|
+
.merge(attributes)
|
23
|
+
.merge(direction: direction)
|
24
|
+
DataObject.new(:argument, attributes, &block)
|
23
25
|
end
|
24
26
|
|
25
27
|
def create_if_port(_, attributes, &block)
|
@@ -34,8 +36,8 @@ module RgGen
|
|
34
36
|
|
35
37
|
define_entity :logic, :create_variable, :variable, -> { component }
|
36
38
|
define_entity :interface, :create_if_instance, :variable, -> { component }
|
37
|
-
define_entity :input, :
|
38
|
-
define_entity :output, :
|
39
|
+
define_entity :input, :create_port, :port, -> { register_block }
|
40
|
+
define_entity :output, :create_port, :port, -> { register_block }
|
39
41
|
define_entity :interface_port, :create_if_port, :port, -> { register_block }
|
40
42
|
define_entity :parameter, :create_parameter, :parameter, -> { register_block }
|
41
43
|
define_entity :localparam, :create_parameter, :parameter, -> { component }
|
@@ -7,12 +7,11 @@ module RgGen
|
|
7
7
|
private
|
8
8
|
|
9
9
|
def partial_sums(operands)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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,71 +3,14 @@
|
|
3
3
|
RgGen.define_list_item_feature(:register, :type, :external) do
|
4
4
|
sv_rtl do
|
5
5
|
build do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
}
|
12
|
-
else
|
13
|
-
output :valid, {
|
14
|
-
name: "o_#{register.name}_valid",
|
15
|
-
data_type: :logic, width: 1
|
16
|
-
}
|
17
|
-
output :access, {
|
18
|
-
name: "o_#{register.name}_access",
|
19
|
-
data_type: :logic, width: '$bits(rggen_access)'
|
20
|
-
}
|
21
|
-
output :address, {
|
22
|
-
name: "o_#{register.name}_address",
|
23
|
-
data_type: :logic, width: address_width
|
24
|
-
}
|
25
|
-
output :write_data, {
|
26
|
-
name: "o_#{register.name}_data",
|
27
|
-
data_type: :logic, width: bus_width
|
28
|
-
}
|
29
|
-
output :strobe, {
|
30
|
-
name: "o_#{register.name}_strobe",
|
31
|
-
data_type: :logic, width: byte_width
|
32
|
-
}
|
33
|
-
input :ready, {
|
34
|
-
name: "i_#{register.name}_ready",
|
35
|
-
data_type: :logic, width: 1
|
36
|
-
}
|
37
|
-
input :status, {
|
38
|
-
name: "i_#{register.name}_status",
|
39
|
-
data_type: :logic, width: 2
|
40
|
-
}
|
41
|
-
input :read_data, {
|
42
|
-
name: "i_#{register.name}_data",
|
43
|
-
data_type: :logic, width: bus_width
|
44
|
-
}
|
45
|
-
interface :bus_if, {
|
46
|
-
name: 'bus_if', interface_type: 'rggen_bus_if',
|
47
|
-
parameter_values: [address_width, bus_width],
|
48
|
-
variables: [
|
49
|
-
'valid', 'access', 'address', 'write_data', 'strobe',
|
50
|
-
'ready', 'status', 'read_data'
|
51
|
-
]
|
52
|
-
}
|
53
|
-
end
|
6
|
+
interface_port :bus_if, {
|
7
|
+
name: "#{register.name}_bus_if",
|
8
|
+
interface_type: 'rggen_bus_if',
|
9
|
+
modport: 'master'
|
10
|
+
}
|
54
11
|
end
|
55
12
|
|
56
13
|
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
|
-
[access, bus_if.access],
|
62
|
-
[address, bus_if.address],
|
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
14
|
|
72
15
|
private
|
73
16
|
|
@@ -21,68 +21,11 @@ RgGen.define_list_item_feature(:register_block, :protocol, :apb) do
|
|
21
21
|
|
22
22
|
sv_rtl do
|
23
23
|
build do
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
}
|
28
|
-
else
|
29
|
-
input :psel, {
|
30
|
-
name: 'i_psel', data_type: :logic, width: 1
|
31
|
-
}
|
32
|
-
input :penable, {
|
33
|
-
name: 'i_penable', data_type: :logic, width: 1
|
34
|
-
}
|
35
|
-
input :paddr, {
|
36
|
-
name: 'i_paddr', data_type: :logic, width: address_width
|
37
|
-
}
|
38
|
-
input :pprot, {
|
39
|
-
name: 'i_pprot', data_type: :logic, width: 3
|
40
|
-
}
|
41
|
-
input :pwrite, {
|
42
|
-
name: 'i_pwrite', data_type: :logic, width: 1
|
43
|
-
}
|
44
|
-
input :pstrb, {
|
45
|
-
name: 'i_pstrb', data_type: :logic, width: byte_width
|
46
|
-
}
|
47
|
-
input :pwdata, {
|
48
|
-
name: 'i_pwdata', data_type: :logic, width: bus_width
|
49
|
-
}
|
50
|
-
output :pready, {
|
51
|
-
name: 'o_pready', data_type: :logic, width: 1
|
52
|
-
}
|
53
|
-
output :prdata, {
|
54
|
-
name: 'o_prdata', data_type: :logic, width: bus_width
|
55
|
-
}
|
56
|
-
output :pslverr, {
|
57
|
-
name: 'o_pslverr', data_type: :logic, width: 1
|
58
|
-
}
|
59
|
-
interface :apb_if, {
|
60
|
-
name: 'apb_if', interface_type: 'rggen_apb_if',
|
61
|
-
parameter_values: [address_width, bus_width],
|
62
|
-
variables: [
|
63
|
-
'psel', 'penable', 'paddr', 'pprot', 'pwrite', 'pstrb', 'pwdata',
|
64
|
-
'pready', 'prdata', 'pslverr'
|
65
|
-
]
|
66
|
-
}
|
67
|
-
end
|
24
|
+
interface_port :apb_if, {
|
25
|
+
name: 'apb_if', interface_type: 'rggen_apb_if', modport: 'slave'
|
26
|
+
}
|
68
27
|
end
|
69
28
|
|
70
29
|
main_code :register_block, from_template: true
|
71
|
-
main_code :register_block do |code|
|
72
|
-
unless configuration.fold_sv_interface_port?
|
73
|
-
[
|
74
|
-
[apb_if.psel, psel],
|
75
|
-
[apb_if.penable, penable],
|
76
|
-
[apb_if.paddr, paddr],
|
77
|
-
[apb_if.pprot, pprot],
|
78
|
-
[apb_if.pwrite, pwrite],
|
79
|
-
[apb_if.pstrb, pstrb],
|
80
|
-
[apb_if.pwdata, pwdata],
|
81
|
-
[pready, apb_if.pready],
|
82
|
-
[prdata, apb_if.prdata],
|
83
|
-
[pslverr, apb_if.pslverr]
|
84
|
-
].each { |lhs, rhs| code << assign(lhs, rhs) << nl }
|
85
|
-
end
|
86
|
-
end
|
87
30
|
end
|
88
31
|
end
|
@@ -19,132 +19,18 @@ RgGen.define_list_item_feature(:register_block, :protocol, :axi4lite) do
|
|
19
19
|
parameter :write_first, {
|
20
20
|
name: 'WRITE_FIRST', data_type: :bit, default: 1
|
21
21
|
}
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
}
|
27
|
-
else
|
28
|
-
input :awvalid, {
|
29
|
-
name: 'i_awvalid', data_type: :logic, width: 1
|
30
|
-
}
|
31
|
-
output :awready, {
|
32
|
-
name: 'o_awready', data_type: :logic, width: 1
|
33
|
-
}
|
34
|
-
input :awid, {
|
35
|
-
name: 'i_awid', data_type: :logic, width: id_port_width
|
36
|
-
}
|
37
|
-
input :awaddr, {
|
38
|
-
name: 'i_awaddr', data_type: :logic, width: address_width
|
39
|
-
}
|
40
|
-
input :awprot, {
|
41
|
-
name: 'i_awprot', data_type: :logic, width: 3
|
42
|
-
}
|
43
|
-
input :wvalid, {
|
44
|
-
name: 'i_wvalid', data_type: :logic, width: 1
|
45
|
-
}
|
46
|
-
output :wready, {
|
47
|
-
name: 'o_wready', data_type: :logic, width: 1
|
48
|
-
}
|
49
|
-
input :wdata, {
|
50
|
-
name: 'i_wdata', data_type: :logic, width: bus_width
|
51
|
-
}
|
52
|
-
input :wstrb, {
|
53
|
-
name: 'i_wstrb', data_type: :logic, width: byte_width
|
54
|
-
}
|
55
|
-
output :bvalid, {
|
56
|
-
name: 'o_bvalid', data_type: :logic, width: 1
|
57
|
-
}
|
58
|
-
output :bid, {
|
59
|
-
name: 'o_bid', data_type: :logic, width: id_port_width
|
60
|
-
}
|
61
|
-
input :bready, {
|
62
|
-
name: 'i_bready', data_type: :logic, width: 1
|
63
|
-
}
|
64
|
-
output :bresp, {
|
65
|
-
name: 'o_bresp', data_type: :logic, width: 2
|
66
|
-
}
|
67
|
-
input :arvalid, {
|
68
|
-
name: 'i_arvalid', data_type: :logic, width: 1
|
69
|
-
}
|
70
|
-
output :arready, {
|
71
|
-
name: 'o_arready', data_type: :logic, width: 1
|
72
|
-
}
|
73
|
-
input :arid, {
|
74
|
-
name: 'i_arid', data_type: :logic, width: id_port_width
|
75
|
-
}
|
76
|
-
input :araddr, {
|
77
|
-
name: 'i_araddr', data_type: :logic, width: address_width
|
78
|
-
}
|
79
|
-
input :arprot, {
|
80
|
-
name: 'i_arprot', data_type: :logic, width: 3
|
81
|
-
}
|
82
|
-
output :rvalid, {
|
83
|
-
name: 'o_rvalid', data_type: :logic, width: 1
|
84
|
-
}
|
85
|
-
input :rready, {
|
86
|
-
name: 'i_rready', data_type: :logic, width: 1
|
87
|
-
}
|
88
|
-
output :rid, {
|
89
|
-
name: 'o_rid', data_type: :logic, width: id_port_width
|
90
|
-
}
|
91
|
-
output :rdata, {
|
92
|
-
name: 'o_rdata', data_type: :logic, width: bus_width
|
93
|
-
}
|
94
|
-
output :rresp, {
|
95
|
-
name: 'o_rresp', data_type: :logic, width: 2
|
96
|
-
}
|
97
|
-
interface :axi4lite_if, {
|
98
|
-
name: 'axi4lite_if', interface_type: 'rggen_axi4lite_if',
|
99
|
-
parameter_values: [id_width, address_width, bus_width],
|
100
|
-
variables: [
|
101
|
-
'awvalid', 'awready', 'awid', 'awaddr', 'awprot',
|
102
|
-
'wvalid', 'wready', 'wdata', 'wstrb',
|
103
|
-
'bvalid', 'bready', 'bid', 'bresp',
|
104
|
-
'arvalid', 'arready', 'arid', 'araddr', 'arprot',
|
105
|
-
'rvalid', 'rready', 'rid', 'rdata', 'rresp'
|
106
|
-
]
|
107
|
-
}
|
108
|
-
end
|
22
|
+
interface_port :axi4lite_if, {
|
23
|
+
name: 'axi4lite_if',
|
24
|
+
interface_type: 'rggen_axi4lite_if', modport: 'slave'
|
25
|
+
}
|
109
26
|
end
|
110
27
|
|
111
28
|
main_code :register_block, from_template: true
|
112
|
-
main_code :register_block do |code|
|
113
|
-
configuration.fold_sv_interface_port? || assign_axi4lite_signals(code)
|
114
|
-
end
|
115
29
|
|
116
30
|
private
|
117
31
|
|
118
32
|
def id_port_width
|
119
33
|
"((#{id_width}>0)?#{id_width}:1)"
|
120
34
|
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
|
149
35
|
end
|
150
36
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
rggen_wishbone_adapter #(
|
2
|
+
.ADDRESS_WIDTH (<%= address_width %>),
|
3
|
+
.LOCAL_ADDRESS_WIDTH (<%= local_address_width %>),
|
4
|
+
.BUS_WIDTH (<%= bus_width %>),
|
5
|
+
.REGISTERS (<%= total_registers %>),
|
6
|
+
.PRE_DECODE (<%= pre_decode %>),
|
7
|
+
.BASE_ADDRESS (<%= base_address %>),
|
8
|
+
.BYTE_SIZE (<%= byte_size %>),
|
9
|
+
.ERROR_STATUS (<%= error_status %>),
|
10
|
+
.DEFAULT_READ_DATA (<%= default_read_data %>),
|
11
|
+
.USE_STALL (<%= use_stall %>)
|
12
|
+
) u_adapter (
|
13
|
+
.i_clk (<%= clock %>),
|
14
|
+
.i_rst_n (<%= reset %>),
|
15
|
+
.wishbone_if (<%= wishbone_if %>),
|
16
|
+
.register_if (<%= register_if %>)
|
17
|
+
);
|