rggen-verilog 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/LICENSE +21 -0
- data/README.md +74 -0
- data/lib/rggen/verilog.rb +64 -0
- data/lib/rggen/verilog/bit_field/type.rb +85 -0
- data/lib/rggen/verilog/bit_field/type/rc_w0c_w1c_wc_woc.erb +21 -0
- data/lib/rggen/verilog/bit_field/type/rc_w0c_w1c_wc_woc.rb +40 -0
- data/lib/rggen/verilog/bit_field/type/reserved.erb +10 -0
- data/lib/rggen/verilog/bit_field/type/reserved.rb +7 -0
- data/lib/rggen/verilog/bit_field/type/ro.erb +11 -0
- data/lib/rggen/verilog/bit_field/type/ro.rb +21 -0
- data/lib/rggen/verilog/bit_field/type/rof.erb +11 -0
- data/lib/rggen/verilog/bit_field/type/rof.rb +7 -0
- data/lib/rggen/verilog/bit_field/type/rs_w0s_w1s_ws_wos.erb +19 -0
- data/lib/rggen/verilog/bit_field/type/rs_w0s_w1s_ws_wos.rb +31 -0
- data/lib/rggen/verilog/bit_field/type/rw_w1_wo_wo1.erb +16 -0
- data/lib/rggen/verilog/bit_field/type/rw_w1_wo_wo1.rb +23 -0
- data/lib/rggen/verilog/bit_field/type/rwc.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/rwc.rb +24 -0
- data/lib/rggen/verilog/bit_field/type/rwe.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/rwe.rb +24 -0
- data/lib/rggen/verilog/bit_field/type/rwl.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/rwl.rb +24 -0
- data/lib/rggen/verilog/bit_field/type/rws.erb +16 -0
- data/lib/rggen/verilog/bit_field/type/rws.rb +27 -0
- data/lib/rggen/verilog/bit_field/type/w0crs_w1crs_wcrs.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/w0crs_w1crs_wcrs.rb +20 -0
- data/lib/rggen/verilog/bit_field/type/w0src_w1src_wsrc.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/w0src_w1src_wsrc.rb +20 -0
- data/lib/rggen/verilog/bit_field/type/w0t_w1t.erb +15 -0
- data/lib/rggen/verilog/bit_field/type/w0t_w1t.rb +19 -0
- data/lib/rggen/verilog/bit_field/type/w0trg_w1trg.erb +14 -0
- data/lib/rggen/verilog/bit_field/type/w0trg_w1trg.rb +19 -0
- data/lib/rggen/verilog/bit_field/type/wrc_wrs.erb +14 -0
- data/lib/rggen/verilog/bit_field/type/wrc_wrs.rb +13 -0
- data/lib/rggen/verilog/bit_field/verilog_top.rb +89 -0
- data/lib/rggen/verilog/component.rb +7 -0
- data/lib/rggen/verilog/factories.rb +11 -0
- data/lib/rggen/verilog/feature.rb +35 -0
- data/lib/rggen/verilog/register/type.rb +101 -0
- data/lib/rggen/verilog/register/type/default.erb +29 -0
- data/lib/rggen/verilog/register/type/external.erb +27 -0
- data/lib/rggen/verilog/register/type/external.rb +45 -0
- data/lib/rggen/verilog/register/type/indirect.erb +31 -0
- data/lib/rggen/verilog/register/type/indirect.rb +18 -0
- data/lib/rggen/verilog/register/verilog_top.rb +58 -0
- data/lib/rggen/verilog/register_block/protocol.rb +51 -0
- data/lib/rggen/verilog/register_block/protocol/apb.erb +33 -0
- data/lib/rggen/verilog/register_block/protocol/apb.rb +40 -0
- data/lib/rggen/verilog/register_block/protocol/axi4lite.erb +48 -0
- data/lib/rggen/verilog/register_block/protocol/axi4lite.rb +92 -0
- data/lib/rggen/verilog/register_block/verilog_macros.erb +4 -0
- data/lib/rggen/verilog/register_block/verilog_top.rb +104 -0
- data/lib/rggen/verilog/register_file/verilog_top.rb +30 -0
- data/lib/rggen/verilog/setup.rb +11 -0
- data/lib/rggen/verilog/utility.rb +13 -0
- data/lib/rggen/verilog/utility/local_scope.rb +15 -0
- data/lib/rggen/verilog/version.rb +7 -0
- metadata +133 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:bit_field, :type, [:wrc, :wrs]) do
|
4
|
+
verilog do
|
5
|
+
build do
|
6
|
+
output :value_out, {
|
7
|
+
name: "o_#{full_name}", width: width, array_size: array_size
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
main_code :bit_field, from_template: true
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:bit_field, :verilog_top) do
|
4
|
+
verilog do
|
5
|
+
include RgGen::SystemVerilog::RTL::BitFieldIndex
|
6
|
+
|
7
|
+
export :initial_value
|
8
|
+
export :value
|
9
|
+
|
10
|
+
build do
|
11
|
+
if parameterized_initial_value?
|
12
|
+
parameter :initial_value, {
|
13
|
+
name: initial_value_name, width: bit_field.width,
|
14
|
+
array_size: initial_value_array_size, default: initial_value_rhs
|
15
|
+
}
|
16
|
+
else
|
17
|
+
define_accessor_for_initial_value
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
main_code :register do
|
22
|
+
local_scope("g_#{bit_field.name}") do |scope|
|
23
|
+
scope.loop_size loop_size
|
24
|
+
scope.body(&method(:body_code))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def value(offsets = nil, width = nil)
|
29
|
+
value_lsb = bit_field.lsb(offsets&.last || local_index)
|
30
|
+
value_width = width || bit_field.width
|
31
|
+
register_value(offsets&.slice(0..-2), value_lsb, value_width)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def register_value(offsets, lsb, width)
|
37
|
+
index = register.index(offsets || register.local_indices)
|
38
|
+
register_block.register_value[[index], lsb, width]
|
39
|
+
end
|
40
|
+
|
41
|
+
def parameterized_initial_value?
|
42
|
+
bit_field.initial_value? && !bit_field.fixed_initial_value?
|
43
|
+
end
|
44
|
+
|
45
|
+
def define_accessor_for_initial_value
|
46
|
+
define_singleton_method(:initial_value) do
|
47
|
+
bit_field.initial_value? && initial_value_rhs || nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def initial_value_name
|
52
|
+
"#{bit_field.full_name('_')}_initial_value".upcase
|
53
|
+
end
|
54
|
+
|
55
|
+
def initial_value_array_size
|
56
|
+
bit_field.initial_value_array? && [bit_field.sequence_size] || nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def initial_value_rhs
|
60
|
+
if !bit_field.initial_value_array?
|
61
|
+
sized_initial_value
|
62
|
+
elsif bit_field.fixed_initial_value?
|
63
|
+
concat(sized_initial_values)
|
64
|
+
else
|
65
|
+
repeat(bit_field.sequence_size, sized_initial_value)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def sized_initial_value
|
70
|
+
hex(bit_field.register_map.initial_value, bit_field.width)
|
71
|
+
end
|
72
|
+
|
73
|
+
def sized_initial_values
|
74
|
+
bit_field
|
75
|
+
.initial_values
|
76
|
+
.reverse
|
77
|
+
.map { |v| hex(v, bit_field.width) }
|
78
|
+
end
|
79
|
+
|
80
|
+
def loop_size
|
81
|
+
loop_variable = local_index
|
82
|
+
loop_variable && { loop_variable => bit_field.sequence_size }
|
83
|
+
end
|
84
|
+
|
85
|
+
def body_code(code)
|
86
|
+
bit_field.generate_code(code, :bit_field, :top_down)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RgGen
|
4
|
+
module Verilog
|
5
|
+
class Feature < SystemVerilog::RTL::Feature
|
6
|
+
include Utility
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def create_variable(data_type, attributes, &block)
|
11
|
+
attributes = attributes.merge(array_format: :serialized)
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_argument(direction, attributes, &block)
|
16
|
+
attributes =
|
17
|
+
attributes
|
18
|
+
.reject { |key, _| key == :data_type }
|
19
|
+
.merge(array_format: :serialized)
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_parameter(parameter_type, attributes, &block)
|
24
|
+
attributes = attributes.merge(array_format: :serialized)
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
define_entity :wire, :create_variable, :variable, -> { component }
|
29
|
+
|
30
|
+
undef_method :interface
|
31
|
+
undef_method :interface_port
|
32
|
+
undef_method :localparam
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_feature(:register, :type) do
|
4
|
+
verilog do
|
5
|
+
base_feature do
|
6
|
+
include RgGen::SystemVerilog::RTL::RegisterType
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def clock
|
11
|
+
register_block.clock
|
12
|
+
end
|
13
|
+
|
14
|
+
def reset
|
15
|
+
register_block.reset
|
16
|
+
end
|
17
|
+
|
18
|
+
def register_valid
|
19
|
+
register_block.register_valid
|
20
|
+
end
|
21
|
+
|
22
|
+
def register_access
|
23
|
+
register_block.register_access
|
24
|
+
end
|
25
|
+
|
26
|
+
def register_address
|
27
|
+
register_block.register_address
|
28
|
+
end
|
29
|
+
|
30
|
+
def register_write_data
|
31
|
+
register_block.register_write_data
|
32
|
+
end
|
33
|
+
|
34
|
+
def register_strobe
|
35
|
+
register_block.register_strobe
|
36
|
+
end
|
37
|
+
|
38
|
+
def register_active
|
39
|
+
register_block.register_active[[register.index]]
|
40
|
+
end
|
41
|
+
|
42
|
+
def register_ready
|
43
|
+
register_block.register_ready[[register.index]]
|
44
|
+
end
|
45
|
+
|
46
|
+
def register_status
|
47
|
+
register_block.register_status[[register.index]]
|
48
|
+
end
|
49
|
+
|
50
|
+
def register_read_data
|
51
|
+
register_block.register_read_data[[register.index]]
|
52
|
+
end
|
53
|
+
|
54
|
+
def register_value
|
55
|
+
register_block.register_value[[register.index], 0, width]
|
56
|
+
end
|
57
|
+
|
58
|
+
def bit_field_valid
|
59
|
+
register.bit_field_valid
|
60
|
+
end
|
61
|
+
|
62
|
+
def bit_field_read_mask
|
63
|
+
register.bit_field_read_mask
|
64
|
+
end
|
65
|
+
|
66
|
+
def bit_field_write_mask
|
67
|
+
register.bit_field_write_mask
|
68
|
+
end
|
69
|
+
|
70
|
+
def bit_field_write_data
|
71
|
+
register.bit_field_write_data
|
72
|
+
end
|
73
|
+
|
74
|
+
def bit_field_read_data
|
75
|
+
register.bit_field_read_data
|
76
|
+
end
|
77
|
+
|
78
|
+
def bit_field_value
|
79
|
+
register.bit_field_value
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
default_feature do
|
84
|
+
main_code :register, from_template: File.join(__dir__, 'type', 'default.erb')
|
85
|
+
end
|
86
|
+
|
87
|
+
factory do
|
88
|
+
def target_feature_key(_configuration, register)
|
89
|
+
type = register.type
|
90
|
+
valid_type?(type) && type ||
|
91
|
+
(error "code generator for #{type} register type is not implemented")
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def valid_type?(type)
|
97
|
+
target_features.key?(type) || type == :default
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,29 @@
|
|
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 (<%= clock %>),
|
12
|
+
.i_rst_n (<%= reset %>),
|
13
|
+
.i_register_valid (<%= register_valid %>),
|
14
|
+
.i_register_access (<%= register_access %>),
|
15
|
+
.i_register_address (<%= register_address %>),
|
16
|
+
.i_register_write_data (<%= register_write_data %>),
|
17
|
+
.i_register_strobe (<%= register_strobe %>),
|
18
|
+
.o_register_active (<%= register_active %>),
|
19
|
+
.o_register_ready (<%= register_ready %>),
|
20
|
+
.o_register_status (<%= register_status %>),
|
21
|
+
.o_register_read_data (<%= register_read_data %>),
|
22
|
+
.o_register_value (<%= register_value %>),
|
23
|
+
.o_bit_field_valid (<%= bit_field_valid %>),
|
24
|
+
.o_bit_field_read_mask (<%= bit_field_read_mask %>),
|
25
|
+
.o_bit_field_write_mask (<%= bit_field_write_mask %>),
|
26
|
+
.o_bit_field_write_data (<%= bit_field_write_data %>),
|
27
|
+
.i_bit_field_read_data (<%= bit_field_read_data %>),
|
28
|
+
.i_bit_field_value (<%= bit_field_value %>)
|
29
|
+
);
|
@@ -0,0 +1,27 @@
|
|
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 (<%= clock %>),
|
8
|
+
.i_rst_n (<%= reset %>),
|
9
|
+
.i_register_valid (<%= register_valid %>),
|
10
|
+
.i_register_access (<%= register_access %>),
|
11
|
+
.i_register_address (<%= register_address %>),
|
12
|
+
.i_register_write_data (<%= register_write_data %>),
|
13
|
+
.i_register_strobe (<%= register_strobe %>),
|
14
|
+
.o_register_active (<%= register_active %>),
|
15
|
+
.o_register_ready (<%= register_ready %>),
|
16
|
+
.o_register_status (<%= register_status %>),
|
17
|
+
.o_register_read_data (<%= register_read_data %>),
|
18
|
+
.o_register_value (<%= register_value %>),
|
19
|
+
.o_external_valid (<%= external_valid %>),
|
20
|
+
.o_external_access (<%= external_access %>),
|
21
|
+
.o_external_address (<%= external_address %>),
|
22
|
+
.o_external_data (<%= external_write_data %>),
|
23
|
+
.o_external_strobe (<%= external_strobe %>),
|
24
|
+
.i_external_ready (<%= external_ready %>),
|
25
|
+
.i_external_status (<%= external_status %>),
|
26
|
+
.i_external_data (<%= external_read_data %>)
|
27
|
+
);
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register, :type, :external) do
|
4
|
+
verilog do
|
5
|
+
build do
|
6
|
+
output :external_valid, {
|
7
|
+
name: "o_#{register.name}_valid", width: 1
|
8
|
+
}
|
9
|
+
output :external_access, {
|
10
|
+
name: "o_#{register.name}_access", width: 2
|
11
|
+
}
|
12
|
+
output :external_address, {
|
13
|
+
name: "o_#{register.name}_address", width: address_width
|
14
|
+
}
|
15
|
+
output :external_write_data, {
|
16
|
+
name: "o_#{register.name}_data", width: bus_width
|
17
|
+
}
|
18
|
+
output :external_strobe, {
|
19
|
+
name: "o_#{register.name}_strobe", width: bus_width / 8
|
20
|
+
}
|
21
|
+
input :external_ready, {
|
22
|
+
name: "i_#{register.name}_ready", width: 1
|
23
|
+
}
|
24
|
+
input :external_status, {
|
25
|
+
name: "i_#{register.name}_status", width: 2
|
26
|
+
}
|
27
|
+
input :external_read_data, {
|
28
|
+
name: "i_#{register.name}_data", width: bus_width
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
main_code :register, from_template: true
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def start_address
|
37
|
+
hex(register.offset_address, address_width)
|
38
|
+
end
|
39
|
+
|
40
|
+
def end_address
|
41
|
+
address = register.offset_address + register.byte_size - 1
|
42
|
+
hex(address, address_width)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,31 @@
|
|
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 (<%= clock %>),
|
13
|
+
.i_rst_n (<%= reset %>),
|
14
|
+
.i_register_valid (<%= register_valid %>),
|
15
|
+
.i_register_access (<%= register_access %>),
|
16
|
+
.i_register_address (<%= register_address %>),
|
17
|
+
.i_register_write_data (<%= register_write_data %>),
|
18
|
+
.i_register_strobe (<%= register_strobe %>),
|
19
|
+
.o_register_active (<%= register_active %>),
|
20
|
+
.o_register_ready (<%= register_ready %>),
|
21
|
+
.o_register_status (<%= register_status %>),
|
22
|
+
.o_register_read_data (<%= register_read_data %>),
|
23
|
+
.o_register_value (<%= register_value %>),
|
24
|
+
.i_indirect_index (<%= indirect_index %>),
|
25
|
+
.o_bit_field_valid (<%= bit_field_valid %>),
|
26
|
+
.o_bit_field_read_mask (<%= bit_field_read_mask %>),
|
27
|
+
.o_bit_field_write_mask (<%= bit_field_write_mask %>),
|
28
|
+
.o_bit_field_write_data (<%= bit_field_write_data %>),
|
29
|
+
.i_bit_field_read_data (<%= bit_field_read_data %>),
|
30
|
+
.i_bit_field_value (<%= bit_field_value %>)
|
31
|
+
);
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register, :type, :indirect) do
|
4
|
+
verilog do
|
5
|
+
include RgGen::SystemVerilog::RTL::IndirectIndex
|
6
|
+
|
7
|
+
build do
|
8
|
+
wire :indirect_index, {
|
9
|
+
name: 'w_indirect_index', width: index_width
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
main_code :register do |code|
|
14
|
+
code << indirect_index_assignment << nl
|
15
|
+
code << process_template
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register, :verilog_top) do
|
4
|
+
verilog do
|
5
|
+
include RgGen::SystemVerilog::RTL::RegisterIndex
|
6
|
+
|
7
|
+
build do
|
8
|
+
unless register.bit_fields.empty?
|
9
|
+
wire :bit_field_valid, {
|
10
|
+
name: 'w_bit_field_valid', width: 1
|
11
|
+
}
|
12
|
+
wire :bit_field_read_mask, {
|
13
|
+
name: 'w_bit_field_read_mask', width: register.width
|
14
|
+
}
|
15
|
+
wire :bit_field_write_mask, {
|
16
|
+
name: 'w_bit_field_write_mask', width: register.width
|
17
|
+
}
|
18
|
+
wire :bit_field_write_data, {
|
19
|
+
name: 'w_bit_field_write_data', width: register.width
|
20
|
+
}
|
21
|
+
wire :bit_field_read_data, {
|
22
|
+
name: 'w_bit_field_read_data', width: register.width
|
23
|
+
}
|
24
|
+
wire :bit_field_value, {
|
25
|
+
name: 'w_bit_field_value', width: register.width
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
main_code :register_file do
|
31
|
+
local_scope("g_#{register.name}") do |scope|
|
32
|
+
scope.top_scope top_scope?
|
33
|
+
scope.loop_size loop_size
|
34
|
+
scope.variables variables
|
35
|
+
scope.body(&method(:body_code))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def top_scope?
|
42
|
+
register_file.nil?
|
43
|
+
end
|
44
|
+
|
45
|
+
def loop_size
|
46
|
+
(register.array? || nil) &&
|
47
|
+
local_loop_variables.zip(register.array_size).to_h
|
48
|
+
end
|
49
|
+
|
50
|
+
def variables
|
51
|
+
register.declarations[:variable]
|
52
|
+
end
|
53
|
+
|
54
|
+
def body_code(code)
|
55
|
+
register.generate_code(code, :register, :top_down)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|