rggen-verilog 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_feature(:register_block, :protocol) do
|
4
|
+
verilog do
|
5
|
+
shared_context.feature_registry(registry)
|
6
|
+
|
7
|
+
base_feature do
|
8
|
+
build do
|
9
|
+
parameter :address_width, {
|
10
|
+
name: 'ADDRESS_WIDTH', default: local_address_width
|
11
|
+
}
|
12
|
+
parameter :pre_decode, {
|
13
|
+
name: 'PRE_DECODE', default: 0
|
14
|
+
}
|
15
|
+
parameter :base_address, {
|
16
|
+
name: 'BASE_ADDRESS', width: address_width, default: 0
|
17
|
+
}
|
18
|
+
parameter :error_status, {
|
19
|
+
name: 'ERROR_STATUS', default: 0
|
20
|
+
}
|
21
|
+
parameter :default_read_data, {
|
22
|
+
name: 'DEFAULT_READ_DATA', width: bus_width, default: 0
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def bus_width
|
29
|
+
configuration.bus_width
|
30
|
+
end
|
31
|
+
|
32
|
+
def local_address_width
|
33
|
+
register_block.local_address_width
|
34
|
+
end
|
35
|
+
|
36
|
+
def total_registers
|
37
|
+
register_block.files_and_registers.sum(&:count)
|
38
|
+
end
|
39
|
+
|
40
|
+
def byte_size
|
41
|
+
register_block.byte_size
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
factory do
|
46
|
+
def target_feature_key(configuration, _register_block)
|
47
|
+
configuration.protocol
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
rggen_apb_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
|
+
) u_adapter (
|
12
|
+
.i_clk (<%= register_block.clock %>),
|
13
|
+
.i_rst_n (<%= register_block.reset %>),
|
14
|
+
.i_psel (<%= psel %>),
|
15
|
+
.i_penable (<%= penable %>),
|
16
|
+
.i_paddr (<%= paddr %>),
|
17
|
+
.i_pprot (<%= pprot %>),
|
18
|
+
.i_pwrite (<%= pwrite %>),
|
19
|
+
.i_pstrb (<%= pstrb %>),
|
20
|
+
.i_pwdata (<%= pwdata %>),
|
21
|
+
.o_pready (<%= pready %>),
|
22
|
+
.o_prdata (<%= prdata %>),
|
23
|
+
.o_pslverr (<%= pslverr %>),
|
24
|
+
.o_register_valid (<%= register_block.register_valid %>),
|
25
|
+
.o_register_access (<%= register_block.register_access %>),
|
26
|
+
.o_register_address (<%= register_block.register_address %>),
|
27
|
+
.o_register_write_data (<%= register_block.register_write_data %>),
|
28
|
+
.o_register_strobe (<%= register_block.register_strobe %>),
|
29
|
+
.i_register_active (<%= register_block.register_active %>),
|
30
|
+
.i_register_ready (<%= register_block.register_ready %>),
|
31
|
+
.i_register_status (<%= register_block.register_status %>),
|
32
|
+
.i_register_read_data (<%= register_block.register_read_data %>)
|
33
|
+
);
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register_block, :protocol, :apb) do
|
4
|
+
verilog do
|
5
|
+
build do
|
6
|
+
input :psel, {
|
7
|
+
name: 'i_psel', width: 1
|
8
|
+
}
|
9
|
+
input :penable, {
|
10
|
+
name: 'i_penable', width: 1
|
11
|
+
}
|
12
|
+
input :paddr, {
|
13
|
+
name: 'i_paddr', width: address_width
|
14
|
+
}
|
15
|
+
input :pprot, {
|
16
|
+
name: 'i_pprot', width: 3
|
17
|
+
}
|
18
|
+
input :pwrite, {
|
19
|
+
name: 'i_pwrite', width: 1
|
20
|
+
}
|
21
|
+
input :pstrb, {
|
22
|
+
name: 'i_pstrb', width: bus_width / 8
|
23
|
+
}
|
24
|
+
input :pwdata, {
|
25
|
+
name: 'i_pwdata', width: bus_width
|
26
|
+
}
|
27
|
+
output :pready, {
|
28
|
+
name: 'o_pready', width: 1
|
29
|
+
}
|
30
|
+
output :prdata, {
|
31
|
+
name: 'o_prdata', width: bus_width
|
32
|
+
}
|
33
|
+
output :pslverr, {
|
34
|
+
name: 'o_pslverr', width: 1
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
main_code :register_block, from_template: true
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
rggen_axi4lite_adapter #(
|
2
|
+
.ID_WIDTH (<%= id_width %>),
|
3
|
+
.ADDRESS_WIDTH (<%= address_width %>),
|
4
|
+
.LOCAL_ADDRESS_WIDTH (<%= local_address_width %>),
|
5
|
+
.BUS_WIDTH (<%= bus_width %>),
|
6
|
+
.REGISTERS (<%= total_registers %>),
|
7
|
+
.PRE_DECODE (<%= pre_decode %>),
|
8
|
+
.BASE_ADDRESS (<%= base_address %>),
|
9
|
+
.BYTE_SIZE (<%= byte_size %>),
|
10
|
+
.ERROR_STATUS (<%= error_status %>),
|
11
|
+
.DEFAULT_READ_DATA (<%= default_read_data %>),
|
12
|
+
.WRITE_FIRST (<%= write_first %>)
|
13
|
+
) u_adapter (
|
14
|
+
.i_clk (<%= register_block.clock %>),
|
15
|
+
.i_rst_n (<%= register_block.reset %>),
|
16
|
+
.i_awvalid (<%= awvalid %>),
|
17
|
+
.o_awready (<%= awready %>),
|
18
|
+
.i_awid (<%= awid %>),
|
19
|
+
.i_awaddr (<%= awaddr %>),
|
20
|
+
.i_awprot (<%= awprot %>),
|
21
|
+
.i_wvalid (<%= wvalid %>),
|
22
|
+
.o_wready (<%= wready %>),
|
23
|
+
.i_wdata (<%= wdata %>),
|
24
|
+
.i_wstrb (<%= wstrb %>),
|
25
|
+
.o_bvalid (<%= bvalid %>),
|
26
|
+
.i_bready (<%= bready %>),
|
27
|
+
.o_bid (<%= bid %>),
|
28
|
+
.o_bresp (<%= bresp %>),
|
29
|
+
.i_arvalid (<%= arvalid %>),
|
30
|
+
.o_arready (<%= arready %>),
|
31
|
+
.i_arid (<%= arid %>),
|
32
|
+
.i_araddr (<%= araddr %>),
|
33
|
+
.i_arprot (<%= arprot %>),
|
34
|
+
.o_rvalid (<%= rvalid %>),
|
35
|
+
.i_rready (<%= rready %>),
|
36
|
+
.o_rid (<%= rid %>),
|
37
|
+
.o_rdata (<%= rdata %>),
|
38
|
+
.o_rresp (<%= rresp %>),
|
39
|
+
.o_register_valid (<%= register_block.register_valid %>),
|
40
|
+
.o_register_access (<%= register_block.register_access %>),
|
41
|
+
.o_register_address (<%= register_block.register_address %>),
|
42
|
+
.o_register_write_data (<%= register_block.register_write_data %>),
|
43
|
+
.o_register_strobe (<%= register_block.register_strobe %>),
|
44
|
+
.i_register_active (<%= register_block.register_active %>),
|
45
|
+
.i_register_ready (<%= register_block.register_ready %>),
|
46
|
+
.i_register_status (<%= register_block.register_status %>),
|
47
|
+
.i_register_read_data (<%= register_block.register_read_data %>)
|
48
|
+
);
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_list_item_feature(:register_block, :protocol, :axi4lite) do
|
4
|
+
verilog do
|
5
|
+
build do
|
6
|
+
parameter :id_width, {
|
7
|
+
name: 'ID_WIDTH', default: 0
|
8
|
+
}
|
9
|
+
parameter :write_first, {
|
10
|
+
name: 'WRITE_FIRST', default: 1
|
11
|
+
}
|
12
|
+
|
13
|
+
input :awvalid, {
|
14
|
+
name: 'i_awvalid', width: 1
|
15
|
+
}
|
16
|
+
output :awready, {
|
17
|
+
name: 'o_awready', width: 1
|
18
|
+
}
|
19
|
+
input :awid, {
|
20
|
+
name: 'i_awid', width: id_width_value
|
21
|
+
}
|
22
|
+
input :awaddr, {
|
23
|
+
name: 'i_awaddr', width: address_width
|
24
|
+
}
|
25
|
+
input :awprot, {
|
26
|
+
name: 'i_awprot', width: 3
|
27
|
+
}
|
28
|
+
input :wvalid, {
|
29
|
+
name: 'i_wvalid', width: 1
|
30
|
+
}
|
31
|
+
output :wready, {
|
32
|
+
name: 'o_wready', width: 1
|
33
|
+
}
|
34
|
+
input :wdata, {
|
35
|
+
name: 'i_wdata', width: bus_width
|
36
|
+
}
|
37
|
+
input :wstrb, {
|
38
|
+
name: 'i_wstrb', width: bus_width / 8
|
39
|
+
}
|
40
|
+
output :bvalid, {
|
41
|
+
name: 'o_bvalid', width: 1
|
42
|
+
}
|
43
|
+
input :bready, {
|
44
|
+
name: 'i_bready', width: 1
|
45
|
+
}
|
46
|
+
output :bid, {
|
47
|
+
name: 'o_bid', width: id_width_value
|
48
|
+
}
|
49
|
+
output :bresp, {
|
50
|
+
name: 'o_bresp', width: 2
|
51
|
+
}
|
52
|
+
input :arvalid, {
|
53
|
+
name: 'i_arvalid', width: 1
|
54
|
+
}
|
55
|
+
output :arready, {
|
56
|
+
name: 'o_arready', width: 1
|
57
|
+
}
|
58
|
+
input :arid, {
|
59
|
+
name: 'i_arid', width: id_width_value
|
60
|
+
}
|
61
|
+
input :araddr, {
|
62
|
+
name: 'i_araddr', width: address_width
|
63
|
+
}
|
64
|
+
input :arprot, {
|
65
|
+
name: 'i_arprot', width: 3
|
66
|
+
}
|
67
|
+
output :rvalid, {
|
68
|
+
name: 'o_rvalid', width: 1
|
69
|
+
}
|
70
|
+
input :rready, {
|
71
|
+
name: 'i_rready', width: 1
|
72
|
+
}
|
73
|
+
output :rid, {
|
74
|
+
name: 'o_rid', width: id_width_value
|
75
|
+
}
|
76
|
+
output :rdata, {
|
77
|
+
name: 'o_rdata', width: bus_width
|
78
|
+
}
|
79
|
+
output :rresp, {
|
80
|
+
name: 'o_rresp', width: 2
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
main_code :register_block, from_template: true
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def id_width_value
|
89
|
+
"((#{id_width} == 0) ? 1 : #{id_width})"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register_block, :verilog_top) do
|
4
|
+
verilog do
|
5
|
+
build do
|
6
|
+
input :clock, {
|
7
|
+
name: 'i_clk', width: 1
|
8
|
+
}
|
9
|
+
input :reset, {
|
10
|
+
name: 'i_rst_n', width: 1
|
11
|
+
}
|
12
|
+
|
13
|
+
wire :register_valid, {
|
14
|
+
name: 'w_register_valid', width: 1
|
15
|
+
}
|
16
|
+
wire :register_access, {
|
17
|
+
name: 'w_register_access', width: 2
|
18
|
+
}
|
19
|
+
wire :register_address, {
|
20
|
+
name: 'w_register_address', width: address_width
|
21
|
+
}
|
22
|
+
wire :register_write_data, {
|
23
|
+
name: 'w_register_write_data', width: bus_width
|
24
|
+
}
|
25
|
+
wire :register_strobe, {
|
26
|
+
name: 'w_register_strobe', width: bus_width / 8
|
27
|
+
}
|
28
|
+
wire :register_active, {
|
29
|
+
name: 'w_register_active', width: 1, array_size: [total_registers]
|
30
|
+
}
|
31
|
+
wire :register_ready, {
|
32
|
+
name: 'w_register_ready', width: 1, array_size: [total_registers]
|
33
|
+
}
|
34
|
+
wire :register_status, {
|
35
|
+
name: 'w_register_status', width: 2, array_size: [total_registers]
|
36
|
+
}
|
37
|
+
wire :register_read_data, {
|
38
|
+
name: 'w_register_read_data', width: bus_width, array_size: [total_registers]
|
39
|
+
}
|
40
|
+
wire :register_value, {
|
41
|
+
name: 'w_register_value', width: value_width, array_size: [total_registers]
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
write_file '<%= register_block.name %>.v' do |file|
|
46
|
+
file.body(&method(:body_code))
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def total_registers
|
52
|
+
register_block.files_and_registers.sum(&:count)
|
53
|
+
end
|
54
|
+
|
55
|
+
def address_width
|
56
|
+
register_block.local_address_width
|
57
|
+
end
|
58
|
+
|
59
|
+
def bus_width
|
60
|
+
configuration.bus_width
|
61
|
+
end
|
62
|
+
|
63
|
+
def value_width
|
64
|
+
register_block.registers.map(&:width).max
|
65
|
+
end
|
66
|
+
|
67
|
+
def body_code(code)
|
68
|
+
macro_definition(code)
|
69
|
+
verilog_module_definition(code)
|
70
|
+
end
|
71
|
+
|
72
|
+
def macro_definition(code)
|
73
|
+
template_path = File.join(__dir__, 'verilog_macros.erb')
|
74
|
+
code << process_template(template_path)
|
75
|
+
end
|
76
|
+
|
77
|
+
def verilog_module_definition(code)
|
78
|
+
code << module_definition(register_block.name) do |verilog_module|
|
79
|
+
verilog_module.parameters parameters
|
80
|
+
verilog_module.ports ports
|
81
|
+
verilog_module.variables variables
|
82
|
+
verilog_module.body(&method(:verilog_module_body))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def parameters
|
87
|
+
register_block.declarations[:parameter]
|
88
|
+
end
|
89
|
+
|
90
|
+
def ports
|
91
|
+
register_block.declarations[:port]
|
92
|
+
end
|
93
|
+
|
94
|
+
def variables
|
95
|
+
register_block.declarations[:variable]
|
96
|
+
end
|
97
|
+
|
98
|
+
def verilog_module_body(code)
|
99
|
+
{ register_block: nil, register_file: 1 }.each do |kind, depth|
|
100
|
+
register_block.generate_code(code, kind, :top_down, depth)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RgGen.define_simple_feature(:register_file, :verilog_top) do
|
4
|
+
verilog do
|
5
|
+
include RgGen::SystemVerilog::RTL::RegisterIndex
|
6
|
+
|
7
|
+
main_code :register_file do
|
8
|
+
local_scope("g_#{register_file.name}") do |scope|
|
9
|
+
scope.top_scope top_scope?
|
10
|
+
scope.loop_size loop_size
|
11
|
+
scope.body(&method(:body_code))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def top_scope?
|
18
|
+
register_file(:upper).nil?
|
19
|
+
end
|
20
|
+
|
21
|
+
def loop_size
|
22
|
+
(register_file.array? || nil) &&
|
23
|
+
local_loop_variables.zip(register_file.array_size).to_h
|
24
|
+
end
|
25
|
+
|
26
|
+
def body_code(code)
|
27
|
+
register_file.generate_code(code, :register_file, :top_down, 1)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rggen/verilog'
|
4
|
+
require 'rggen/systemverilog/rtl/setup'
|
5
|
+
|
6
|
+
RgGen.setup RgGen::Verilog do |builder|
|
7
|
+
builder.enable :register_block, [:verilog_top]
|
8
|
+
builder.enable :register_file, [:verilog_top]
|
9
|
+
builder.enable :register, [:verilog_top]
|
10
|
+
builder.enable :bit_field, [:verilog_top]
|
11
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RgGen
|
4
|
+
module Verilog
|
5
|
+
module Utility
|
6
|
+
class LocalScope < SystemVerilog::Common::Utility::LocalScope
|
7
|
+
private
|
8
|
+
|
9
|
+
def generate_for(genvar, size)
|
10
|
+
"for (#{genvar} = 0;#{genvar} < #{size};#{genvar} = #{genvar} + 1) begin : g"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|