rggen 0.7.2 → 0.8.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 +4 -4
- data/lib/rggen/builtins.rb +2 -1
- data/lib/rggen/builtins/bit_field/type.rb +3 -5
- data/lib/rggen/builtins/bit_field/types/ro.rb +5 -3
- data/lib/rggen/builtins/bit_field/types/rw.rb +5 -3
- data/lib/rggen/builtins/bit_field/types/rwl_rwe.rb +5 -3
- data/lib/rggen/builtins/bit_field/types/w0c_w1c.erb +1 -1
- data/lib/rggen/builtins/bit_field/types/w0c_w1c.rb +11 -5
- data/lib/rggen/builtins/bit_field/types/w0s_w1s.rb +10 -6
- data/lib/rggen/builtins/global/array_port_format.rb +15 -0
- data/lib/rggen/builtins/global/unfold_sv_interface_port.rb +22 -0
- data/lib/rggen/builtins/register/type.rb +10 -4
- data/lib/rggen/builtins/register/types/external.rb +56 -5
- data/lib/rggen/builtins/register_block/clock_reset.rb +2 -2
- data/lib/rggen/builtins/register_block/host_if.rb +1 -1
- data/lib/rggen/builtins/register_block/host_ifs/apb.rb +44 -4
- data/lib/rggen/builtins/register_block/host_ifs/axi4lite.rb +76 -7
- data/lib/rggen/builtins/register_block/rtl_top.rb +17 -7
- data/lib/rggen/core_components.rb +3 -3
- data/lib/rggen/core_components/ral/item.rb +16 -15
- data/lib/rggen/core_components/rtl/component.rb +0 -4
- data/lib/rggen/core_components/rtl/item.rb +27 -32
- data/lib/rggen/core_components/verilog_utility.rb +6 -6
- data/lib/rggen/core_components/verilog_utility/class_definition.rb +11 -11
- data/lib/rggen/core_components/verilog_utility/identifier.rb +49 -17
- data/lib/rggen/core_components/verilog_utility/{interface_instantiation.rb → interface_instance.rb} +7 -3
- data/lib/rggen/core_components/verilog_utility/{interface_port_declaration.rb → interface_port.rb} +7 -3
- data/lib/rggen/core_components/verilog_utility/local_scope.rb +8 -4
- data/lib/rggen/core_components/verilog_utility/module_definition.rb +20 -9
- data/lib/rggen/core_components/verilog_utility/package_definition.rb +15 -23
- data/lib/rggen/core_components/verilog_utility/structure_definition.rb +7 -6
- data/lib/rggen/core_components/verilog_utility/variable.rb +115 -0
- data/lib/rggen/version.rb +2 -2
- data/rtl/compile.f +0 -3
- data/rtl/rggen_address_decoder.sv +2 -2
- data/rtl/rggen_bus_splitter.sv +2 -2
- data/rtl/rggen_external_register.sv +2 -2
- data/rtl/rggen_host_if_apb.sv +2 -2
- data/rtl/rggen_indirect_register.sv +3 -3
- data/sample/sample.json +3 -1
- data/sample/sample.yaml +2 -0
- data/sample/sample_0.sv +30 -42
- data/sample/sample_1.sv +13 -13
- data/sample/sample_setup.rb +2 -2
- data/setup/default.rb +2 -2
- metadata +7 -9
- data/lib/rggen/builtins/register_block/irq_controller.erb +0 -9
- data/lib/rggen/builtins/register_block/irq_controller.rb +0 -43
- data/lib/rggen/builtins/register_block/rtl_top.erb +0 -7
- data/lib/rggen/core_components/verilog_utility/declaration.rb +0 -76
- data/rtl/rggen_irq_controller.sv +0 -21
@@ -9,7 +9,6 @@ module RgGen
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def to_code
|
12
|
-
bodies.unshift(signal_declarations) if signals?
|
13
12
|
code_block do |c|
|
14
13
|
header_code(c)
|
15
14
|
body_code(c)
|
@@ -25,6 +24,13 @@ module RgGen
|
|
25
24
|
loops? && generate_for_header(code)
|
26
25
|
end
|
27
26
|
|
27
|
+
def body_code_blocks
|
28
|
+
blocks = []
|
29
|
+
signals? && (blocks << signal_declarations)
|
30
|
+
blocks.concat(super)
|
31
|
+
blocks
|
32
|
+
end
|
33
|
+
|
28
34
|
def footer_code(code)
|
29
35
|
loops? && generate_for_footer(code)
|
30
36
|
code << :end
|
@@ -61,9 +67,7 @@ module RgGen
|
|
61
67
|
|
62
68
|
def signal_declarations
|
63
69
|
lambda do |code|
|
64
|
-
signals.each
|
65
|
-
code << signal << semicolon << nl
|
66
|
-
end
|
70
|
+
signals.each { |signal| code << signal << semicolon << nl }
|
67
71
|
end
|
68
72
|
end
|
69
73
|
end
|
@@ -5,9 +5,9 @@ module RgGen
|
|
5
5
|
attr_setter :ports
|
6
6
|
attr_setter :signals
|
7
7
|
|
8
|
-
def
|
9
|
-
|
10
|
-
|
8
|
+
def include_file(file)
|
9
|
+
@include_files ||= []
|
10
|
+
@include_files << "`include #{file.to_s.quote}"
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
@@ -15,12 +15,20 @@ module RgGen
|
|
15
15
|
def header_code
|
16
16
|
code_block do |code|
|
17
17
|
code << :module << space << @name << space
|
18
|
-
parameter_declarations(code)
|
18
|
+
parameters? && parameter_declarations(code)
|
19
19
|
port_declarations(code)
|
20
20
|
code << semicolon
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
def body_code_blocks
|
25
|
+
blocks = []
|
26
|
+
@include_files && (blocks << include_files_code)
|
27
|
+
signals? && (blocks << signal_declarations)
|
28
|
+
blocks.concat(super)
|
29
|
+
blocks
|
30
|
+
end
|
31
|
+
|
24
32
|
def footer_code
|
25
33
|
:endmodule
|
26
34
|
end
|
@@ -38,7 +46,6 @@ module RgGen
|
|
38
46
|
end
|
39
47
|
|
40
48
|
def parameter_declarations(code)
|
41
|
-
return unless parameters?
|
42
49
|
wrap(code, '#(', ')') do
|
43
50
|
declarations(@parameters, code)
|
44
51
|
end
|
@@ -46,15 +53,19 @@ module RgGen
|
|
46
53
|
|
47
54
|
def port_declarations(code)
|
48
55
|
wrap(code, '(', ')') do
|
49
|
-
declarations(@ports, code)
|
56
|
+
ports? && declarations(@ports, code)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def include_files_code
|
61
|
+
lambda do |code|
|
62
|
+
@include_files.each { |file| code << file << nl }
|
50
63
|
end
|
51
64
|
end
|
52
65
|
|
53
66
|
def signal_declarations
|
54
67
|
lambda do |code|
|
55
|
-
signals.each
|
56
|
-
code << signal << semicolon << nl
|
57
|
-
end
|
68
|
+
signals.each { |signal| code << signal << semicolon << nl }
|
58
69
|
end
|
59
70
|
end
|
60
71
|
|
@@ -14,17 +14,13 @@ module RgGen
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def import_package(name, items = nil)
|
17
|
-
import_packages
|
17
|
+
@import_packages ||= []
|
18
|
+
@import_packages << ImportedPackage.new(name, items)
|
18
19
|
end
|
19
20
|
|
20
21
|
def include_file(name)
|
21
|
-
include_files
|
22
|
-
|
23
|
-
|
24
|
-
def to_code
|
25
|
-
bodies.unshift(include_fiels_code ) unless @include_files.nil?
|
26
|
-
bodies.unshift(import_packges_code) unless @import_packages.nil?
|
27
|
-
super
|
22
|
+
@include_files ||= []
|
23
|
+
@include_files << "`include #{name.to_s.quote}"
|
28
24
|
end
|
29
25
|
|
30
26
|
private
|
@@ -33,31 +29,27 @@ module RgGen
|
|
33
29
|
"package #{@name};"
|
34
30
|
end
|
35
31
|
|
36
|
-
def
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
def body_code_blocks
|
33
|
+
blocks = []
|
34
|
+
@import_packages && (blocks << import_packges_code)
|
35
|
+
@include_files && (blocks << include_files_code)
|
36
|
+
blocks.concat(super)
|
37
|
+
blocks
|
42
38
|
end
|
43
39
|
|
44
|
-
def
|
45
|
-
|
40
|
+
def footer_code
|
41
|
+
:endpackage
|
46
42
|
end
|
47
43
|
|
48
44
|
def import_packges_code
|
49
45
|
lambda do |code|
|
50
|
-
import_packages.each
|
51
|
-
code << package << nl
|
52
|
-
end
|
46
|
+
@import_packages.each { |package| code << package << nl }
|
53
47
|
end
|
54
48
|
end
|
55
49
|
|
56
|
-
def
|
50
|
+
def include_files_code
|
57
51
|
lambda do |code|
|
58
|
-
include_files.each
|
59
|
-
code << file << nl
|
60
|
-
end
|
52
|
+
@include_files.each { |file| code << file << nl }
|
61
53
|
end
|
62
54
|
end
|
63
55
|
end
|
@@ -9,7 +9,8 @@ module RgGen
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def body(&block)
|
12
|
-
bodies
|
12
|
+
@bodies ||= []
|
13
|
+
@bodies << block if block_given?
|
13
14
|
end
|
14
15
|
|
15
16
|
def to_code
|
@@ -22,16 +23,16 @@ module RgGen
|
|
22
23
|
|
23
24
|
private
|
24
25
|
|
25
|
-
def bodies
|
26
|
-
@bodies ||= []
|
27
|
-
end
|
28
|
-
|
29
26
|
def body_code(code)
|
30
|
-
|
27
|
+
body_code_blocks.each do |body|
|
31
28
|
generate_body_code(code, body)
|
32
29
|
end
|
33
30
|
end
|
34
31
|
|
32
|
+
def body_code_blocks
|
33
|
+
@bodies || []
|
34
|
+
end
|
35
|
+
|
35
36
|
def generate_body_code(code, body)
|
36
37
|
indent(code, 2) do
|
37
38
|
if body.arity.zero?
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module RgGen
|
2
|
+
module VerilogUtility
|
3
|
+
class Variable
|
4
|
+
def initialize(variable_type, attributes)
|
5
|
+
@variable_type = variable_type
|
6
|
+
@attributes = attributes
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s
|
10
|
+
code_snippets.join(' ')
|
11
|
+
end
|
12
|
+
|
13
|
+
def identifier
|
14
|
+
name = @attributes[:name]
|
15
|
+
width = @attributes[:width] || 1
|
16
|
+
dimensions = @attributes[:dimensions]
|
17
|
+
array_fomrat = @attributes[:array_format] || :unpacked
|
18
|
+
Identifier.new(name, width, dimensions, array_fomrat)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def code_snippets
|
24
|
+
[
|
25
|
+
rand_keyword,
|
26
|
+
port_direction,
|
27
|
+
parameter_keyword,
|
28
|
+
data_type,
|
29
|
+
width,
|
30
|
+
variable_identifier,
|
31
|
+
default_value_assignment
|
32
|
+
].select(&:itself)
|
33
|
+
end
|
34
|
+
|
35
|
+
def rand_keyword
|
36
|
+
@variable_type == :variable && @attributes[:random] && :rand
|
37
|
+
end
|
38
|
+
|
39
|
+
def port_direction
|
40
|
+
@variable_type == :port && @attributes[:direction]
|
41
|
+
end
|
42
|
+
|
43
|
+
def parameter_keyword
|
44
|
+
@variable_type == :parameter && @attributes[:parameter_type]
|
45
|
+
end
|
46
|
+
|
47
|
+
def data_type
|
48
|
+
@attributes[:data_type]
|
49
|
+
end
|
50
|
+
|
51
|
+
def width
|
52
|
+
vector? || return
|
53
|
+
msb =
|
54
|
+
if numerical_width?
|
55
|
+
vectored_array_size * (@attributes[:width] || 1) - 1
|
56
|
+
elsif vectored_array?
|
57
|
+
"#{vectored_array_size}*#{@attributes[:width]}-1"
|
58
|
+
else
|
59
|
+
"#{@attributes[:width]}-1"
|
60
|
+
end
|
61
|
+
"[#{msb}:0]"
|
62
|
+
end
|
63
|
+
|
64
|
+
def vectored_array_size
|
65
|
+
vectored_array? || (return 1)
|
66
|
+
@attributes[:dimensions].inject(&:*)
|
67
|
+
end
|
68
|
+
|
69
|
+
def variable_identifier
|
70
|
+
"#{@attributes[:name]}#{dimensions}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def dimensions
|
74
|
+
unpacked_array? || return
|
75
|
+
@attributes[:dimensions].map { |dimension| "[#{dimension}]" }.join
|
76
|
+
end
|
77
|
+
|
78
|
+
def default_value_assignment
|
79
|
+
@attributes[:default] || return
|
80
|
+
"= #{@attributes[:default]}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def parameter?
|
84
|
+
@variable_type == :parameter
|
85
|
+
end
|
86
|
+
|
87
|
+
def vector?
|
88
|
+
@attributes[:vector] && (return true)
|
89
|
+
vectored_array? && (return true)
|
90
|
+
@attributes[:width] || (return false)
|
91
|
+
numerical_width? || (return true)
|
92
|
+
parameter? && (return true)
|
93
|
+
@attributes[:width] > 1
|
94
|
+
end
|
95
|
+
|
96
|
+
def numerical_width?
|
97
|
+
@attributes[:width] || (return true)
|
98
|
+
@attributes[:width].is_a?(Integer) && (return true)
|
99
|
+
false
|
100
|
+
end
|
101
|
+
|
102
|
+
def unpacked_array?
|
103
|
+
@attributes[:dimensions] || (return false)
|
104
|
+
@attributes[:array_format] == :vectored && (return false)
|
105
|
+
true
|
106
|
+
end
|
107
|
+
|
108
|
+
def vectored_array?
|
109
|
+
@attributes[:dimensions] || (return false)
|
110
|
+
@attributes[:array_format] == :vectored && (return true)
|
111
|
+
false
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
data/lib/rggen/version.rb
CHANGED
data/rtl/compile.f
CHANGED
@@ -3,7 +3,6 @@ ${RGGEN_HOME}/rtl/rggen_bus_if.sv
|
|
3
3
|
${RGGEN_HOME}/rtl/rggen_register_if.sv
|
4
4
|
${RGGEN_HOME}/rtl/rggen_bit_field_if.sv
|
5
5
|
${RGGEN_HOME}/rtl/rggen_bus_splitter.sv
|
6
|
-
${RGGEN_HOME}/rtl/rggen_irq_controller.sv
|
7
6
|
${RGGEN_HOME}/rtl/rggen_address_decoder.sv
|
8
7
|
${RGGEN_HOME}/rtl/rggen_register_base.sv
|
9
8
|
${RGGEN_HOME}/rtl/rggen_default_register.sv
|
@@ -13,9 +12,7 @@ ${RGGEN_HOME}/rtl/rggen_bit_field_ro.sv
|
|
13
12
|
${RGGEN_HOME}/rtl/rggen_bit_field_rw.sv
|
14
13
|
${RGGEN_HOME}/rtl/rggen_bit_field_rwl_rwe.sv
|
15
14
|
${RGGEN_HOME}/rtl/rggen_bit_field_w01s_w01c.sv
|
16
|
-
|
17
15
|
${RGGEN_HOME}/rtl/rggen_apb_if.sv
|
18
16
|
${RGGEN_HOME}/rtl/rggen_host_if_apb.sv
|
19
|
-
|
20
17
|
${RGGEN_HOME}/rtl/rggen_axi4lite_if.sv
|
21
18
|
${RGGEN_HOME}/rtl/rggen_host_if_axi4lite.sv
|
@@ -4,8 +4,8 @@ module rggen_address_decoder #(
|
|
4
4
|
parameter bit [ADDRESS_WIDTH-1:0] END_ADDRESS = '0,
|
5
5
|
parameter int DATA_WIDTH = 32
|
6
6
|
)(
|
7
|
-
input [ADDRESS_WIDTH-1:0] i_address,
|
8
|
-
output
|
7
|
+
input logic [ADDRESS_WIDTH-1:0] i_address,
|
8
|
+
output logic o_match
|
9
9
|
);
|
10
10
|
localparam int LSB = $clog2(DATA_WIDTH / 8);
|
11
11
|
localparam bit [ADDRESS_WIDTH-LSB-1:0] SADDRESS = STAET_ADDRESS[ADDRESS_WIDTH-1:LSB];
|
data/rtl/rggen_bus_splitter.sv
CHANGED
@@ -4,8 +4,8 @@ module rggen_external_register #(
|
|
4
4
|
parameter bit [ADDRESS_WIDTH-1:0] END_ADDRESS = '0,
|
5
5
|
parameter int DATA_WIDTH = 32
|
6
6
|
)(
|
7
|
-
input
|
8
|
-
input
|
7
|
+
input logic clk,
|
8
|
+
input logic rst_n,
|
9
9
|
rggen_register_if.slave register_if,
|
10
10
|
rggen_bus_if.master bus_if
|
11
11
|
);
|
data/rtl/rggen_host_if_apb.sv
CHANGED
@@ -7,9 +7,9 @@ module rggen_indirect_register #(
|
|
7
7
|
parameter int DATA_WIDTH = 32,
|
8
8
|
parameter bit [DATA_WIDTH-1:0] VALID_BITS = '0
|
9
9
|
)(
|
10
|
-
rggen_register_if.slave
|
11
|
-
rggen_bit_field_if.master
|
12
|
-
input [INDEX_WIDTH-1:0]
|
10
|
+
rggen_register_if.slave register_if,
|
11
|
+
rggen_bit_field_if.master bit_field_if,
|
12
|
+
input logic [INDEX_WIDTH-1:0] i_index
|
13
13
|
);
|
14
14
|
logic index_match;
|
15
15
|
|
data/sample/sample.json
CHANGED
data/sample/sample.yaml
CHANGED
data/sample/sample_0.sv
CHANGED
@@ -1,38 +1,37 @@
|
|
1
1
|
module sample_0 (
|
2
|
-
input clk,
|
3
|
-
input rst_n,
|
2
|
+
input logic clk,
|
3
|
+
input logic rst_n,
|
4
4
|
rggen_apb_if.slave apb_if,
|
5
|
-
output
|
6
|
-
output [15:0]
|
7
|
-
output [
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
input [
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
input i_bit_field_6_1_set,
|
18
|
-
output
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
output [15:0]
|
5
|
+
output logic [15:0] o_bit_field_0_0,
|
6
|
+
output logic [15:0] o_bit_field_0_1,
|
7
|
+
output logic [31:0] o_bit_field_1_0,
|
8
|
+
input logic i_bit_field_2_0,
|
9
|
+
output logic o_bit_field_2_1,
|
10
|
+
input logic [31:0] i_bit_field_3_0,
|
11
|
+
input logic [15:0] i_bit_field_4_0[4],
|
12
|
+
output logic [15:0] o_bit_field_4_1[4],
|
13
|
+
input logic [15:0] i_bit_field_5_0[2][4],
|
14
|
+
output logic [15:0] o_bit_field_5_1[2][4],
|
15
|
+
input logic i_bit_field_6_0_set,
|
16
|
+
output logic o_bit_field_6_0,
|
17
|
+
input logic i_bit_field_6_1_set,
|
18
|
+
output logic o_bit_field_6_1,
|
19
|
+
output logic o_bit_field_7_0,
|
20
|
+
input logic i_bit_field_7_0_clear,
|
21
|
+
output logic o_bit_field_7_1,
|
22
|
+
input logic i_bit_field_7_1_clear,
|
23
|
+
output logic [15:0] o_bit_field_8_0,
|
24
|
+
output logic [15:0] o_bit_field_8_1,
|
24
25
|
rggen_bus_if.master register_9_bus_if
|
25
26
|
);
|
26
27
|
rggen_register_if #(8, 32) register_if[20]();
|
27
|
-
logic [1:0] ier;
|
28
|
-
logic [1:0] isr;
|
29
28
|
`define rggen_connect_bit_field_if(RIF, FIF, MSB, LSB) \
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
assign FIF.read_access = RIF.read_access; \
|
30
|
+
assign FIF.write_access = RIF.write_access; \
|
31
|
+
assign FIF.write_data = RIF.write_data[MSB:LSB]; \
|
32
|
+
assign FIF.write_mask = RIF.write_mask[MSB:LSB]; \
|
33
|
+
assign RIF.value[MSB:LSB] = FIF.value; \
|
34
|
+
assign RIF.read_data[MSB:LSB] = FIF.read_data;
|
36
35
|
rggen_host_if_apb #(
|
37
36
|
.LOCAL_ADDRESS_WIDTH (8),
|
38
37
|
.DATA_WIDTH (32),
|
@@ -43,17 +42,6 @@ module sample_0 (
|
|
43
42
|
.apb_if (apb_if),
|
44
43
|
.register_if (register_if)
|
45
44
|
);
|
46
|
-
assign ier = {register_if[2].value[0], register_if[2].value[0]};
|
47
|
-
assign isr = {register_if[16].value[8], register_if[16].value[0]};
|
48
|
-
rggen_irq_controller #(
|
49
|
-
.TOTAL_INTERRUPTS (2)
|
50
|
-
) u_irq_controller (
|
51
|
-
.clk (clk),
|
52
|
-
.rst_n (rst_n),
|
53
|
-
.i_ier (ier),
|
54
|
-
.i_isr (isr),
|
55
|
-
.o_irq (o_irq)
|
56
|
-
);
|
57
45
|
generate if (1) begin : g_register_0
|
58
46
|
rggen_bit_field_if #(32) bit_field_if();
|
59
47
|
rggen_default_register #(
|
@@ -289,7 +277,7 @@ module sample_0 (
|
|
289
277
|
.rst_n (rst_n),
|
290
278
|
.i_set_or_clear (i_bit_field_6_0_set),
|
291
279
|
.bit_field_if (bit_field_sub_if),
|
292
|
-
.o_value ()
|
280
|
+
.o_value (o_bit_field_6_0)
|
293
281
|
);
|
294
282
|
end
|
295
283
|
if (1) begin : g_bit_field_6_1
|
@@ -305,7 +293,7 @@ module sample_0 (
|
|
305
293
|
.rst_n (rst_n),
|
306
294
|
.i_set_or_clear (i_bit_field_6_1_set),
|
307
295
|
.bit_field_if (bit_field_sub_if),
|
308
|
-
.o_value ()
|
296
|
+
.o_value (o_bit_field_6_1)
|
309
297
|
);
|
310
298
|
end
|
311
299
|
end endgenerate
|