rggen 0.3.3 → 0.4.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 +27 -17
- data/lib/rggen/base/component.rb +5 -1
- data/lib/rggen/base/component_factory.rb +12 -5
- data/lib/rggen/base/item.rb +19 -9
- data/lib/rggen/base/item_factory.rb +9 -5
- data/lib/rggen/builtins.rb +12 -15
- data/lib/rggen/builtins/bit_field/{field_model_creation.rb → field_model.rb} +12 -3
- data/lib/rggen/builtins/register/accessibility.rb +3 -3
- data/lib/rggen/builtins/register/address_decoder.rb +1 -1
- data/lib/rggen/builtins/register/array.rb +30 -28
- data/lib/rggen/builtins/register/bus_exporter.erb +28 -0
- data/lib/rggen/builtins/register/bus_exporter.rb +44 -0
- data/lib/rggen/builtins/register/{reg_model_constructor.rb → constructor.rb} +1 -1
- data/lib/rggen/builtins/register/external.rb +42 -0
- data/lib/rggen/builtins/register/field_model_creator.rb +5 -1
- data/lib/rggen/builtins/register/read_data.rb +4 -0
- data/lib/rggen/builtins/register/reg_model.rb +92 -0
- data/lib/rggen/builtins/register/shadow_index_configurator.rb +5 -1
- data/lib/rggen/builtins/register/sub_block_model.rb +34 -0
- data/lib/rggen/builtins/register_block/apb.erb +1 -0
- data/lib/rggen/builtins/register_block/axi4lite.erb +1 -0
- data/lib/rggen/builtins/register_block/{block_model_definition.rb → block_model.rb} +4 -2
- data/lib/rggen/builtins/register_block/{block_model_constructor.rb → constructor.rb} +1 -1
- data/lib/rggen/builtins/register_block/{block_model_default_map_creator.rb → default_map_creator.rb} +1 -1
- data/lib/rggen/builtins/register_block/host_if.rb +1 -0
- data/lib/rggen/builtins/register_block/{ral_package_definition.rb → ral_package.rb} +1 -1
- data/lib/rggen/builtins/register_block/response_mux.erb +15 -11
- data/lib/rggen/builtins/register_block/response_mux.rb +35 -4
- data/lib/rggen/builtins/register_block/sub_model_creator.rb +14 -0
- data/lib/rggen/builtins/register_block/top_module.rb +16 -0
- data/lib/rggen/core_components.rb +2 -0
- data/lib/rggen/core_components/configuration/item_factory.rb +1 -1
- data/lib/rggen/core_components/ral/component.rb +24 -0
- data/lib/rggen/core_components/ral/item.rb +50 -5
- data/lib/rggen/core_components/ral/setup.rb +1 -1
- data/lib/rggen/core_components/register_map/bit_field_factory.rb +1 -1
- data/lib/rggen/core_components/register_map/component.rb +4 -1
- data/lib/rggen/core_components/register_map/component_factory.rb +9 -0
- data/lib/rggen/core_components/register_map/item.rb +9 -7
- data/lib/rggen/core_components/register_map/item_factory.rb +2 -2
- data/lib/rggen/core_components/register_map/register_block_factory.rb +1 -1
- data/lib/rggen/core_components/register_map/register_factory.rb +1 -1
- data/lib/rggen/core_components/register_map/register_map_factory.rb +1 -1
- data/lib/rggen/core_components/rtl/item.rb +1 -1
- data/lib/rggen/input_base/component.rb +9 -0
- data/lib/rggen/output_base/code_utility.rb +6 -0
- data/lib/rggen/output_base/component.rb +1 -0
- data/lib/rggen/output_base/item_factory.rb +3 -0
- data/lib/rggen/output_base/verilog_utility/class_definition.rb +35 -0
- data/lib/rggen/output_base/verilog_utility/declaration.rb +11 -4
- data/lib/rggen/output_base/verilog_utility/identifier.rb +1 -1
- data/lib/rggen/output_base/verilog_utility/module_definition.rb +33 -7
- data/lib/rggen/version.rb +2 -2
- data/ral/rggen_ral_block.svh +3 -8
- data/ral/rggen_ral_macros.svh +9 -2
- data/rtl/register/rggen_bus_exporter.sv +96 -0
- data/rtl/register_block/rggen_host_if_apb.sv +2 -0
- data/rtl/register_block/rggen_host_if_axi4lite.sv +7 -1
- data/rtl/register_block/rggen_response_mux.sv +53 -23
- data/sample/sample.csv +15 -14
- data/sample/sample.xls +0 -0
- data/sample/sample.xlsx +0 -0
- data/sample/sample_0.sv +77 -14
- data/sample/sample_0_ral_pkg.sv +6 -2
- data/sample/sample_1.sv +17 -11
- data/sample/sample_1_ral_pkg.sv +1 -1
- data/sample/sample_setup.rb +6 -6
- data/setup/default.rb +6 -6
- metadata +20 -19
- data/lib/rggen/builtins/bit_field/field_model_declaration.rb +0 -9
- data/lib/rggen/builtins/register/field_model_declarations.rb +0 -7
- data/lib/rggen/builtins/register/reg_model_creation.rb +0 -64
- data/lib/rggen/builtins/register/reg_model_declaration.rb +0 -13
- data/lib/rggen/builtins/register/reg_model_definition.rb +0 -22
- data/lib/rggen/builtins/register_block/module_definition.rb +0 -13
- data/lib/rggen/builtins/register_block/reg_model_creator.rb +0 -14
- data/lib/rggen/builtins/register_block/reg_model_declarations.rb +0 -7
- data/lib/rggen/builtins/register_block/signal_declarations.rb +0 -9
@@ -0,0 +1,44 @@
|
|
1
|
+
simple_item :register, :bus_exporter do
|
2
|
+
rtl do
|
3
|
+
delegate [
|
4
|
+
:data_width, :byte_width
|
5
|
+
] => :configuration
|
6
|
+
delegate [
|
7
|
+
:name, :byte_size, :external?, :index, :external_index
|
8
|
+
] => :register
|
9
|
+
|
10
|
+
available? { external? }
|
11
|
+
|
12
|
+
build do
|
13
|
+
output :valid , name: "o_#{name}_valid" , width: 1
|
14
|
+
output :write , name: "o_#{name}_write" , width: 1
|
15
|
+
output :read , name: "o_#{name}_read" , width: 1
|
16
|
+
output :address , name: "o_#{name}_address" , width: address_width
|
17
|
+
output :strobe , name: "o_#{name}_strobe" , width: byte_width
|
18
|
+
output :write_data, name: "o_#{name}_write_data", width: data_width
|
19
|
+
input :ready , name: "i_#{name}_ready" , width: 1
|
20
|
+
input :status , name: "i_#{name}_status" , width: 2
|
21
|
+
input :read_data , name: "i_#{name}_read_data" , width: data_width
|
22
|
+
end
|
23
|
+
|
24
|
+
generate_code :module_item do |code|
|
25
|
+
code << register_select_connection << nl
|
26
|
+
code << process_template
|
27
|
+
end
|
28
|
+
|
29
|
+
def address_width
|
30
|
+
Math.clog2(byte_size)
|
31
|
+
end
|
32
|
+
|
33
|
+
def register_select_connection
|
34
|
+
assign(
|
35
|
+
register_block.external_register_select[external_index],
|
36
|
+
register_block.register_select[index]
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
def start_address
|
41
|
+
hex(register.start_address, register_block.local_address_width)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
simple_item :register, :external do
|
2
|
+
register_map do
|
3
|
+
field :external?
|
4
|
+
field :internal? do
|
5
|
+
!external?
|
6
|
+
end
|
7
|
+
|
8
|
+
input_pattern %r{(true)|(false)|()}i, convert_to_string: true
|
9
|
+
|
10
|
+
build do |cell|
|
11
|
+
@external = parse(cell)
|
12
|
+
register.need_no_children if external?
|
13
|
+
end
|
14
|
+
|
15
|
+
validate do
|
16
|
+
if (register.array? || register.shadow?) && external?
|
17
|
+
error 'not use array/shadow and ' \
|
18
|
+
'external register on the same register'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse(cell)
|
23
|
+
if pattern_matched?
|
24
|
+
captures.first.not_nil?
|
25
|
+
else
|
26
|
+
error "invalid value for 'external': #{cell.inspect}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
rtl do
|
32
|
+
export :external_index
|
33
|
+
|
34
|
+
def external_index
|
35
|
+
external_registers.index(®ister.method(:equal?))
|
36
|
+
end
|
37
|
+
|
38
|
+
def external_registers
|
39
|
+
register_block.registers.select(&:external?)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -3,8 +3,12 @@ simple_item :register, :field_model_creator do
|
|
3
3
|
generate_code :reg_model_item do
|
4
4
|
function_definition :create_fields do |f|
|
5
5
|
f.return_type :void
|
6
|
-
f.body {
|
6
|
+
f.body { |code| body_code(code) }
|
7
7
|
end
|
8
8
|
end
|
9
|
+
|
10
|
+
def body_code(code)
|
11
|
+
register.bit_fields.each { |b| b.model_creation(code) }
|
12
|
+
end
|
9
13
|
end
|
10
14
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
simple_item :register, :reg_model do
|
2
|
+
ral do
|
3
|
+
export :model_creation
|
4
|
+
|
5
|
+
delegate [:byte_width] => :configuration
|
6
|
+
delegate [:local_address_width] => :register_block
|
7
|
+
delegate [:name, :dimensions, :array?, :shadow?] => :register
|
8
|
+
|
9
|
+
available? { register.internal? }
|
10
|
+
|
11
|
+
build do
|
12
|
+
variable :block_model, :reg_model,
|
13
|
+
data_type: model_name,
|
14
|
+
name: name,
|
15
|
+
dimensions: dimensions,
|
16
|
+
random: true
|
17
|
+
end
|
18
|
+
|
19
|
+
generate_code :package_item do
|
20
|
+
class_definition model_name do |c|
|
21
|
+
c.base base_model
|
22
|
+
c.variables register.variable_declarations(:reg_model)
|
23
|
+
c.body { |code| body_code(code) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def model_creation(code)
|
28
|
+
foreach_header(code) if array?
|
29
|
+
code << "`rggen_ral_create_reg_model(#{arguments.join(', ')})" << nl
|
30
|
+
foreach_footer(code) if array?
|
31
|
+
end
|
32
|
+
|
33
|
+
def foreach_header(code)
|
34
|
+
code << "foreach (#{name}[#{loop_varibles.join(', ')}]) begin" << nl
|
35
|
+
code.indent += 2
|
36
|
+
end
|
37
|
+
|
38
|
+
def foreach_footer(code)
|
39
|
+
code.indent -= 2
|
40
|
+
code << :end << nl
|
41
|
+
end
|
42
|
+
|
43
|
+
def arguments
|
44
|
+
[handle, string(name), array_index, offset_address, rights, unmapped]
|
45
|
+
end
|
46
|
+
|
47
|
+
def handle
|
48
|
+
create_identifier(name)[loop_varibles]
|
49
|
+
end
|
50
|
+
|
51
|
+
def array_index
|
52
|
+
return '\'{}' unless array?
|
53
|
+
array(*loop_varibles)
|
54
|
+
end
|
55
|
+
|
56
|
+
def offset_address
|
57
|
+
base = hex(register.start_address, local_address_width)
|
58
|
+
if !array? || shadow?
|
59
|
+
base
|
60
|
+
else
|
61
|
+
"#{base} + #{byte_width} * #{loop_varibles.first}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def rights
|
66
|
+
return string(:RO) if register.read_only?
|
67
|
+
return string(:WO) if register.write_only?
|
68
|
+
string(:RW)
|
69
|
+
end
|
70
|
+
|
71
|
+
def unmapped
|
72
|
+
(shadow? && 1) || 0
|
73
|
+
end
|
74
|
+
|
75
|
+
def loop_varibles
|
76
|
+
return nil unless array?
|
77
|
+
@loop_varibles ||= Array.new(dimensions.size, &method(:loop_index))
|
78
|
+
end
|
79
|
+
|
80
|
+
def model_name
|
81
|
+
"#{name}_reg_model"
|
82
|
+
end
|
83
|
+
|
84
|
+
def base_model
|
85
|
+
(register.shadow? && :rggen_ral_shadow_reg) || :rggen_ral_reg
|
86
|
+
end
|
87
|
+
|
88
|
+
def body_code(code)
|
89
|
+
register.generate_code(:reg_model_item, :top_down, code)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -1,10 +1,14 @@
|
|
1
1
|
simple_item :register, :shadow_index_configurator do
|
2
2
|
ral do
|
3
|
+
available? do
|
4
|
+
register.shadow?
|
5
|
+
end
|
6
|
+
|
3
7
|
generate_code :reg_model_item do
|
4
8
|
function_definition :configure_shadow_indexes do |f|
|
5
9
|
f.return_type :void
|
6
10
|
f.body { |code| function_body(code) }
|
7
|
-
end
|
11
|
+
end
|
8
12
|
end
|
9
13
|
|
10
14
|
def function_body(code)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
simple_item :register, :sub_block_model do
|
2
|
+
ral do
|
3
|
+
export :model_creation
|
4
|
+
|
5
|
+
available? { register.external? }
|
6
|
+
|
7
|
+
build do
|
8
|
+
parameter :block_model, :model_type,
|
9
|
+
data_type: :type,
|
10
|
+
name: type_name,
|
11
|
+
default: :rggen_ral_block
|
12
|
+
variable :block_model, :sub_block_model,
|
13
|
+
data_type: type_name,
|
14
|
+
name: register.name,
|
15
|
+
random: true
|
16
|
+
end
|
17
|
+
|
18
|
+
def type_name
|
19
|
+
register.name.upcase
|
20
|
+
end
|
21
|
+
|
22
|
+
def model_creation(code)
|
23
|
+
code << "`rggen_ral_create_block_model(#{arguments.join(', ')})" << nl
|
24
|
+
end
|
25
|
+
|
26
|
+
def arguments
|
27
|
+
[register.name, string(register.name), offset_addess]
|
28
|
+
end
|
29
|
+
|
30
|
+
def offset_addess
|
31
|
+
hex(register.start_address, register_block.local_address_width)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -19,6 +19,7 @@ rggen_host_if_apb #(
|
|
19
19
|
.o_write (<%= host_if.write %>),
|
20
20
|
.o_read (<%= host_if.read %>),
|
21
21
|
.o_address (<%= host_if.address %>),
|
22
|
+
.o_strobe (<%= host_if.strobe %>),
|
22
23
|
.o_write_data (<%= host_if.write_data %>),
|
23
24
|
.o_write_mask (<%= host_if.write_mask %>),
|
24
25
|
.i_response_ready (<%= host_if.response_ready %>),
|
@@ -29,6 +29,7 @@ rggen_host_if_axi4lite #(
|
|
29
29
|
.o_write (<%= host_if.write %>),
|
30
30
|
.o_read (<%= host_if.read %>),
|
31
31
|
.o_address (<%= host_if.address %>),
|
32
|
+
.o_strobe (<%= host_if.strobe %>),
|
32
33
|
.o_write_data (<%= host_if.write_data %>),
|
33
34
|
.o_write_mask (<%= host_if.write_mask %>),
|
34
35
|
.i_response_ready (<%= host_if.response_ready %>),
|
@@ -1,8 +1,10 @@
|
|
1
|
-
simple_item :register_block, :
|
1
|
+
simple_item :register_block, :block_model do
|
2
2
|
ral do
|
3
3
|
generate_code :package_item do
|
4
4
|
class_definition model_name do |c|
|
5
|
-
c.base
|
5
|
+
c.base :rggen_ral_block
|
6
|
+
c.variables register_block.variable_declarations(:block_model)
|
7
|
+
c.parameters register_block.parameter_declarations(:block_model)
|
6
8
|
c.body { |code| body_code(code) }
|
7
9
|
end
|
8
10
|
end
|
@@ -46,6 +46,7 @@ list_item :register_block, :host_if do
|
|
46
46
|
logic :write , width: 1
|
47
47
|
logic :read , width: 1
|
48
48
|
logic :address , width: register_block.local_address_width
|
49
|
+
logic :strobe , width: configuration.byte_width
|
49
50
|
logic :write_data , width: configuration.data_width
|
50
51
|
logic :write_mask , width: configuration.data_width
|
51
52
|
logic :response_ready, width: 1
|
@@ -1,14 +1,18 @@
|
|
1
1
|
rggen_response_mux #(
|
2
|
-
.DATA_WIDTH
|
3
|
-
.TOTAL_REGISTERS
|
2
|
+
.DATA_WIDTH (<%= configuration.data_width %>),
|
3
|
+
.TOTAL_REGISTERS (<%= total_registers %>),
|
4
|
+
.TOTAL_EXTERNAL_REGISTERS (<%= total_external_registers %>)
|
4
5
|
) u_response_mux (
|
5
|
-
.clk
|
6
|
-
.rst_n
|
7
|
-
.i_command_valid
|
8
|
-
.i_read
|
9
|
-
.o_response_ready
|
10
|
-
.o_read_data
|
11
|
-
.o_status
|
12
|
-
.i_register_select
|
13
|
-
.i_register_read_data
|
6
|
+
.clk (<%= register_block.clock %>),
|
7
|
+
.rst_n (<%= register_block.reset %>),
|
8
|
+
.i_command_valid (<%= register_block.host_if.command_valid %>),
|
9
|
+
.i_read (<%= register_block.host_if.read %>),
|
10
|
+
.o_response_ready (<%= register_block.host_if.response_ready %>),
|
11
|
+
.o_read_data (<%= register_block.host_if.read_data %>),
|
12
|
+
.o_status (<%= register_block.host_if.status %>),
|
13
|
+
.i_register_select (<%= register_select %>),
|
14
|
+
.i_register_read_data (<%= register_read_data %>),
|
15
|
+
.i_external_register_select (<%= actual_external_register_select %>),
|
16
|
+
.i_external_register_ready (<%= actual_external_register_ready %>),
|
17
|
+
.i_external_register_status (<%= actual_external_register_status %>)
|
14
18
|
);
|
@@ -2,15 +2,46 @@ simple_item :register_block, :response_mux do
|
|
2
2
|
rtl do
|
3
3
|
build do
|
4
4
|
logic :register_select , width: total_registers
|
5
|
-
logic :register_read_data,
|
5
|
+
logic :register_read_data,
|
6
|
+
width: configuration.data_width,
|
7
|
+
dimensions: [total_registers]
|
8
|
+
if external_registers?
|
9
|
+
logic :external_register_select,
|
10
|
+
width: total_external_registers,
|
11
|
+
vector: true
|
12
|
+
logic :external_register_ready ,
|
13
|
+
width: total_external_registers,
|
14
|
+
vector: true
|
15
|
+
logic :external_register_status,
|
16
|
+
width: 2,
|
17
|
+
dimensions: [total_external_registers]
|
18
|
+
end
|
6
19
|
end
|
7
20
|
|
8
21
|
generate_code_from_template :module_item
|
9
22
|
|
10
|
-
delegate data_width: :configuration
|
11
|
-
|
12
23
|
def total_registers
|
13
|
-
register_block.registers.
|
24
|
+
register_block.registers.sum(0, &:count)
|
25
|
+
end
|
26
|
+
|
27
|
+
def external_registers?
|
28
|
+
register_block.registers.any?(&:external?)
|
29
|
+
end
|
30
|
+
|
31
|
+
def total_external_registers
|
32
|
+
register_block.registers.count(&:external?)
|
33
|
+
end
|
34
|
+
|
35
|
+
def actual_external_register_select
|
36
|
+
(external_registers? && external_register_select) || bin(0, 1)
|
37
|
+
end
|
38
|
+
|
39
|
+
def actual_external_register_ready
|
40
|
+
(external_registers? && external_register_ready) || bin(0, 1)
|
41
|
+
end
|
42
|
+
|
43
|
+
def actual_external_register_status
|
44
|
+
(external_registers? && external_register_status) || array(bin(0, 2))
|
14
45
|
end
|
15
46
|
end
|
16
47
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
simple_item :register_block, :sub_model_creator do
|
2
|
+
ral do
|
3
|
+
generate_code :block_model_item do
|
4
|
+
function_definition :create_sub_models do |f|
|
5
|
+
f.return_type :void
|
6
|
+
f.body { |code| function_body(code) }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def function_body(code)
|
11
|
+
register_block.registers.each { |r| r.model_creation(code) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
define_simple_item :register_block, :top_module do
|
2
|
+
rtl do
|
3
|
+
write_file '<%= register_block.name %>.sv' do
|
4
|
+
module_definition register_block.name do |m|
|
5
|
+
m.parameters register_block.parameter_declarations
|
6
|
+
m.ports register_block.port_declarations
|
7
|
+
m.signals register_block.signal_declarations
|
8
|
+
m.body { |code| module_body(code) }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def module_body(code)
|
13
|
+
register_block.generate_code(:module_item, :top_down, code)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|