rggen 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +91 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/LICENSE.txt +21 -0
- data/README.md +31 -0
- data/bin/rggen +6 -0
- data/lib/rggen/base/component.rb +27 -0
- data/lib/rggen/base/component_factory.rb +46 -0
- data/lib/rggen/base/hierarchical_accessors.rb +87 -0
- data/lib/rggen/base/hierarchical_item_accessors.rb +79 -0
- data/lib/rggen/base/item.rb +24 -0
- data/lib/rggen/base/item_factory.rb +20 -0
- data/lib/rggen/builder/builder.rb +69 -0
- data/lib/rggen/builder/category.rb +52 -0
- data/lib/rggen/builder/component_entry.rb +50 -0
- data/lib/rggen/builder/component_store.rb +42 -0
- data/lib/rggen/builder/input_component_store.rb +25 -0
- data/lib/rggen/builder/item_store.rb +89 -0
- data/lib/rggen/builder/list_item_entry.rb +81 -0
- data/lib/rggen/builder/output_component_store.rb +13 -0
- data/lib/rggen/builder/simple_item_entry.rb +33 -0
- data/lib/rggen/builtins/bit_field/bit_assignment.rb +39 -0
- data/lib/rggen/builtins/bit_field/field_model_creation.rb +25 -0
- data/lib/rggen/builtins/bit_field/field_model_declaration.rb +9 -0
- data/lib/rggen/builtins/bit_field/initial_value.rb +36 -0
- data/lib/rggen/builtins/bit_field/name.rb +26 -0
- data/lib/rggen/builtins/bit_field/reference.rb +42 -0
- data/lib/rggen/builtins/bit_field/reserved.rb +9 -0
- data/lib/rggen/builtins/bit_field/ro.rb +19 -0
- data/lib/rggen/builtins/bit_field/rw.erb +13 -0
- data/lib/rggen/builtins/bit_field/rw.rb +25 -0
- data/lib/rggen/builtins/bit_field/type.rb +205 -0
- data/lib/rggen/builtins/bit_field/wo.rb +5 -0
- data/lib/rggen/builtins/global/address_width.rb +17 -0
- data/lib/rggen/builtins/global/data_width.rb +20 -0
- data/lib/rggen/builtins/loaders/configuration/json_loader.rb +7 -0
- data/lib/rggen/builtins/loaders/configuration/yaml_loader.rb +7 -0
- data/lib/rggen/builtins/loaders/register_map/csv_loader.rb +14 -0
- data/lib/rggen/builtins/loaders/register_map/xls_loader.rb +19 -0
- data/lib/rggen/builtins/loaders/register_map/xlsx_ods_loader.rb +24 -0
- data/lib/rggen/builtins/register/accessibility.rb +23 -0
- data/lib/rggen/builtins/register/address_decoder.erb +16 -0
- data/lib/rggen/builtins/register/address_decoder.rb +92 -0
- data/lib/rggen/builtins/register/array.rb +133 -0
- data/lib/rggen/builtins/register/field_model_creator.rb +10 -0
- data/lib/rggen/builtins/register/field_model_declarations.rb +7 -0
- data/lib/rggen/builtins/register/name.rb +26 -0
- data/lib/rggen/builtins/register/offset_address.rb +55 -0
- data/lib/rggen/builtins/register/read_data.rb +36 -0
- data/lib/rggen/builtins/register/reg_model_constructor.rb +17 -0
- data/lib/rggen/builtins/register/reg_model_creation.rb +64 -0
- data/lib/rggen/builtins/register/reg_model_declaration.rb +13 -0
- data/lib/rggen/builtins/register/reg_model_definition.rb +22 -0
- data/lib/rggen/builtins/register/shadow.rb +130 -0
- data/lib/rggen/builtins/register/shadow_index_configurator.rb +53 -0
- data/lib/rggen/builtins/register/uniqueness_validator.rb +48 -0
- data/lib/rggen/builtins/register_block/apb.erb +27 -0
- data/lib/rggen/builtins/register_block/apb.rb +20 -0
- data/lib/rggen/builtins/register_block/base_address.rb +64 -0
- data/lib/rggen/builtins/register_block/block_model_constructor.rb +14 -0
- data/lib/rggen/builtins/register_block/block_model_default_map_creator.rb +39 -0
- data/lib/rggen/builtins/register_block/block_model_definition.rb +18 -0
- data/lib/rggen/builtins/register_block/byte_size.rb +37 -0
- data/lib/rggen/builtins/register_block/clock_reset.rb +8 -0
- data/lib/rggen/builtins/register_block/host_if.rb +46 -0
- data/lib/rggen/builtins/register_block/module_definition.rb +13 -0
- data/lib/rggen/builtins/register_block/name.rb +26 -0
- data/lib/rggen/builtins/register_block/ral_package_definition.rb +19 -0
- data/lib/rggen/builtins/register_block/reg_model_creator.rb +14 -0
- data/lib/rggen/builtins/register_block/reg_model_declarations.rb +7 -0
- data/lib/rggen/builtins/register_block/response_mux.erb +14 -0
- data/lib/rggen/builtins/register_block/response_mux.rb +16 -0
- data/lib/rggen/builtins/register_block/signal_declarations.rb +9 -0
- data/lib/rggen/builtins.rb +52 -0
- data/lib/rggen/commands.rb +23 -0
- data/lib/rggen/core_components/configuration/configuration_factory.rb +23 -0
- data/lib/rggen/core_components/configuration/item_factory.rb +13 -0
- data/lib/rggen/core_components/configuration/raise_error.rb +11 -0
- data/lib/rggen/core_components/configuration/setup.rb +14 -0
- data/lib/rggen/core_components/ral/item.rb +16 -0
- data/lib/rggen/core_components/ral/setup.rb +19 -0
- data/lib/rggen/core_components/register_map/bit_field_factory.rb +11 -0
- data/lib/rggen/core_components/register_map/component.rb +12 -0
- data/lib/rggen/core_components/register_map/generic_map.rb +69 -0
- data/lib/rggen/core_components/register_map/item.rb +22 -0
- data/lib/rggen/core_components/register_map/item_factory.rb +13 -0
- data/lib/rggen/core_components/register_map/loader.rb +13 -0
- data/lib/rggen/core_components/register_map/raise_error.rb +17 -0
- data/lib/rggen/core_components/register_map/register_block_factory.rb +29 -0
- data/lib/rggen/core_components/register_map/register_factory.rb +18 -0
- data/lib/rggen/core_components/register_map/register_map_factory.rb +21 -0
- data/lib/rggen/core_components/register_map/setup.rb +33 -0
- data/lib/rggen/core_components/rtl/component.rb +28 -0
- data/lib/rggen/core_components/rtl/item.rb +83 -0
- data/lib/rggen/core_components/rtl/setup.rb +19 -0
- data/lib/rggen/core_components.rb +23 -0
- data/lib/rggen/core_extensions/facets.rb +17 -0
- data/lib/rggen/core_extensions/forwardable.rb +26 -0
- data/lib/rggen/core_extensions/integer.rb +5 -0
- data/lib/rggen/core_extensions/math.rb +7 -0
- data/lib/rggen/exceptions.rb +22 -0
- data/lib/rggen/generator.rb +185 -0
- data/lib/rggen/input_base/component.rb +19 -0
- data/lib/rggen/input_base/component_factory.rb +58 -0
- data/lib/rggen/input_base/item.rb +170 -0
- data/lib/rggen/input_base/item_factory.rb +13 -0
- data/lib/rggen/input_base/loader.rb +14 -0
- data/lib/rggen/input_base/regexp_patterns.rb +29 -0
- data/lib/rggen/output_base/code_block.rb +72 -0
- data/lib/rggen/output_base/code_utility.rb +44 -0
- data/lib/rggen/output_base/component.rb +88 -0
- data/lib/rggen/output_base/component_factory.rb +32 -0
- data/lib/rggen/output_base/item.rb +175 -0
- data/lib/rggen/output_base/item_factory.rb +6 -0
- data/lib/rggen/output_base/line.rb +28 -0
- data/lib/rggen/output_base/template_utility.rb +29 -0
- data/lib/rggen/output_base/verilog_utility/class_definition.rb +23 -0
- data/lib/rggen/output_base/verilog_utility/declaration.rb +70 -0
- data/lib/rggen/output_base/verilog_utility/identifier.rb +29 -0
- data/lib/rggen/output_base/verilog_utility/module_definition.rb +47 -0
- data/lib/rggen/output_base/verilog_utility/package_definition.rb +67 -0
- data/lib/rggen/output_base/verilog_utility/structure_definition.rb +52 -0
- data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +43 -0
- data/lib/rggen/output_base/verilog_utility.rb +66 -0
- data/lib/rggen/version.rb +6 -0
- data/lib/rggen.rb +65 -0
- data/ral/compile.f +4 -0
- data/ral/rggen_ral_block.svh +84 -0
- data/ral/rggen_ral_field.svh +47 -0
- data/ral/rggen_ral_macros.svh +22 -0
- data/ral/rggen_ral_map.svh +124 -0
- data/ral/rggen_ral_pkg.sv +14 -0
- data/ral/rggen_ral_reg.svh +52 -0
- data/ral/rggen_ral_shadow_reg.svh +188 -0
- data/rggen.gemspec +45 -0
- data/rtl/bit_field/rggen_bit_field_rw.sv +28 -0
- data/rtl/register/rggen_address_decoder.sv +49 -0
- data/rtl/register_block/rggen_host_if_apb.sv +40 -0
- data/rtl/register_block/rggen_response_mux.sv +82 -0
- data/sample/sample.csv +14 -0
- data/sample/sample.json +4 -0
- data/sample/sample.xls +0 -0
- data/sample/sample.xlsx +0 -0
- data/sample/sample.yaml +2 -0
- data/sample/sample_0.sv +285 -0
- data/sample/sample_0_ral_pkg.sv +99 -0
- data/sample/sample_1.sv +172 -0
- data/sample/sample_1_ral_pkg.sv +53 -0
- data/sample/sample_setup.rb +21 -0
- data/setup/default.rb +11 -0
- metadata +296 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
module RgGen
|
2
|
+
module OutputBase
|
3
|
+
module VerilogUtility
|
4
|
+
class PackageDefinition < StructureDefinition
|
5
|
+
ImportedPackage = Struct.new(:name, :items) do
|
6
|
+
def to_s
|
7
|
+
"import #{import_items.join(', ')};"
|
8
|
+
end
|
9
|
+
|
10
|
+
def import_items
|
11
|
+
(((items.nil? || items.empty?) && [:*]) || items).map do |item|
|
12
|
+
"#{name}::#{item}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def import_package(name, items = nil)
|
18
|
+
import_packages << ImportedPackage.new(name, items)
|
19
|
+
end
|
20
|
+
|
21
|
+
def include_file(name)
|
22
|
+
include_files << "`include #{name.to_s.quote}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_code
|
26
|
+
bodies.unshift(include_fiels_code ) unless @include_files.nil?
|
27
|
+
bodies.unshift(import_packges_code) unless @import_packages.nil?
|
28
|
+
super
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def header_code
|
34
|
+
"package #{@name};"
|
35
|
+
end
|
36
|
+
|
37
|
+
def footer_code
|
38
|
+
:endpackage
|
39
|
+
end
|
40
|
+
|
41
|
+
def import_packages
|
42
|
+
@import_packages ||= []
|
43
|
+
end
|
44
|
+
|
45
|
+
def include_files
|
46
|
+
@include_files ||= []
|
47
|
+
end
|
48
|
+
|
49
|
+
def import_packges_code
|
50
|
+
lambda do |code|
|
51
|
+
import_packages.each do |package|
|
52
|
+
code << package << nl
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def include_fiels_code
|
58
|
+
lambda do |code|
|
59
|
+
include_files.each do |file|
|
60
|
+
code << file << nl
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module RgGen
|
2
|
+
module OutputBase
|
3
|
+
module VerilogUtility
|
4
|
+
class StructureDefinition
|
5
|
+
include CodeUtility
|
6
|
+
|
7
|
+
def initialize(name, &body)
|
8
|
+
@name = name
|
9
|
+
body.call(self) if block_given?
|
10
|
+
end
|
11
|
+
|
12
|
+
def body(&block)
|
13
|
+
bodies << block if block_given?
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_code
|
17
|
+
code_block do |code|
|
18
|
+
code << header_code << nl
|
19
|
+
body_code(code) if body_code?
|
20
|
+
code << footer_code << nl
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def bodies
|
27
|
+
@bodies ||= []
|
28
|
+
end
|
29
|
+
|
30
|
+
def body_code(code)
|
31
|
+
bodies.each do |body|
|
32
|
+
generate_body_code(code, body)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def generate_body_code(code, body)
|
37
|
+
indent(code, 2) do
|
38
|
+
if body.arity.zero?
|
39
|
+
code << body.call
|
40
|
+
else
|
41
|
+
body.call(code)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def body_code?
|
47
|
+
@bodies && @bodies.size > 0
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module RgGen
|
2
|
+
module OutputBase
|
3
|
+
module VerilogUtility
|
4
|
+
class SubroutineDefinition < StructureDefinition
|
5
|
+
def initialize(type, name, &body)
|
6
|
+
@type = type
|
7
|
+
super(name, &body)
|
8
|
+
end
|
9
|
+
|
10
|
+
def return_type(data_type_and_width)
|
11
|
+
if [Symbol, String].any?(&data_type_and_width.method(:is_a?))
|
12
|
+
@return_type = data_type_and_width
|
13
|
+
else
|
14
|
+
data_type = data_type_and_width[:data_type]
|
15
|
+
width = data_type_and_width[:width ] || 1
|
16
|
+
@return_type =
|
17
|
+
((width > 1) && "#{data_type} [#{width - 1}:0]") || data_type
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_setter :arguments
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def function?
|
26
|
+
@type == :function
|
27
|
+
end
|
28
|
+
|
29
|
+
def header_code
|
30
|
+
[
|
31
|
+
(function? && :function ) || :task,
|
32
|
+
(function? && @return_type) || nil,
|
33
|
+
"#{@name}(#{Array(@arguments).join(', ')});"
|
34
|
+
].compact.join(' ')
|
35
|
+
end
|
36
|
+
|
37
|
+
def footer_code
|
38
|
+
(function? && :endfunction) || :endtask
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module RgGen
|
2
|
+
module OutputBase
|
3
|
+
module VerilogUtility
|
4
|
+
private
|
5
|
+
|
6
|
+
def create_identifier(name)
|
7
|
+
Identifier.new(name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_declaration(declaration_type, attributes)
|
11
|
+
Declaration.new(declaration_type, attributes)
|
12
|
+
end
|
13
|
+
|
14
|
+
def module_definition(name, &body)
|
15
|
+
ModuleDefinition.new(name, &body).to_code
|
16
|
+
end
|
17
|
+
|
18
|
+
def package_definition(name, &body)
|
19
|
+
PackageDefinition.new(name, &body).to_code
|
20
|
+
end
|
21
|
+
|
22
|
+
def class_definition(name, &body)
|
23
|
+
ClassDefinition.new(name, &body).to_code
|
24
|
+
end
|
25
|
+
|
26
|
+
def function_definition(name, &body)
|
27
|
+
SubroutineDefinition.new(:function, name, &body).to_code
|
28
|
+
end
|
29
|
+
|
30
|
+
def argument(name, attributes)
|
31
|
+
attributes[:name] = name
|
32
|
+
create_declaration(:port, attributes)
|
33
|
+
end
|
34
|
+
|
35
|
+
def assign(lhs, rhs)
|
36
|
+
"assign #{lhs} = #{rhs};"
|
37
|
+
end
|
38
|
+
|
39
|
+
def concat(expression, *other_expressions)
|
40
|
+
expressions = Array[expression, *other_expressions]
|
41
|
+
"{#{expressions.join(', ')}}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def array(expression, *other_expressions)
|
45
|
+
"'#{concat(expression, *other_expressions)}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def string(expression)
|
49
|
+
"\"#{expression}\""
|
50
|
+
end
|
51
|
+
|
52
|
+
def bin(value, width)
|
53
|
+
format("%d'b%0*b", width, width, value)
|
54
|
+
end
|
55
|
+
|
56
|
+
def dec(value, width)
|
57
|
+
format("%d'd%d", width, value)
|
58
|
+
end
|
59
|
+
|
60
|
+
def hex(value, width)
|
61
|
+
print_width = (width + 3) / 4
|
62
|
+
format("%d'h%0*x", width, print_width, value)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/rggen.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
module RgGen
|
2
|
+
RGGEN_HOME = File.realpath(File.join(__dir__, '..'))
|
3
|
+
|
4
|
+
require 'forwardable'
|
5
|
+
require 'baby_erubis'
|
6
|
+
require 'fileutils'
|
7
|
+
require 'optparse'
|
8
|
+
|
9
|
+
require_relative 'rggen/version'
|
10
|
+
|
11
|
+
require_relative 'rggen/exceptions'
|
12
|
+
|
13
|
+
require_relative 'rggen/core_extensions/facets'
|
14
|
+
require_relative 'rggen/core_extensions/forwardable'
|
15
|
+
require_relative 'rggen/core_extensions/integer'
|
16
|
+
require_relative 'rggen/core_extensions/math'
|
17
|
+
|
18
|
+
require_relative 'rggen/base/hierarchical_accessors'
|
19
|
+
require_relative 'rggen/base/hierarchical_item_accessors'
|
20
|
+
require_relative 'rggen/base/component'
|
21
|
+
require_relative 'rggen/base/item'
|
22
|
+
require_relative 'rggen/base/component_factory'
|
23
|
+
require_relative 'rggen/base/item_factory'
|
24
|
+
|
25
|
+
require_relative 'rggen/input_base/regexp_patterns'
|
26
|
+
require_relative 'rggen/input_base/component'
|
27
|
+
require_relative 'rggen/input_base/item'
|
28
|
+
require_relative 'rggen/input_base/loader'
|
29
|
+
require_relative 'rggen/input_base/component_factory'
|
30
|
+
require_relative 'rggen/input_base/item_factory'
|
31
|
+
|
32
|
+
require_relative 'rggen/output_base/line'
|
33
|
+
require_relative 'rggen/output_base/code_block'
|
34
|
+
require_relative 'rggen/output_base/code_utility'
|
35
|
+
require_relative 'rggen/output_base/template_utility'
|
36
|
+
require_relative 'rggen/output_base/verilog_utility/identifier'
|
37
|
+
require_relative 'rggen/output_base/verilog_utility/declaration'
|
38
|
+
require_relative 'rggen/output_base/verilog_utility/structure_definition'
|
39
|
+
require_relative 'rggen/output_base/verilog_utility/module_definition'
|
40
|
+
require_relative 'rggen/output_base/verilog_utility/package_definition'
|
41
|
+
require_relative 'rggen/output_base/verilog_utility/class_definition'
|
42
|
+
require_relative 'rggen/output_base/verilog_utility/subroutine_definition'
|
43
|
+
require_relative 'rggen/output_base/verilog_utility'
|
44
|
+
require_relative 'rggen/output_base/component'
|
45
|
+
require_relative 'rggen/output_base/item'
|
46
|
+
require_relative 'rggen/output_base/component_factory'
|
47
|
+
require_relative 'rggen/output_base/item_factory'
|
48
|
+
|
49
|
+
require_relative 'rggen/builder/simple_item_entry'
|
50
|
+
require_relative 'rggen/builder/list_item_entry'
|
51
|
+
require_relative 'rggen/builder/item_store'
|
52
|
+
require_relative 'rggen/builder/component_entry'
|
53
|
+
require_relative 'rggen/builder/component_store'
|
54
|
+
require_relative 'rggen/builder/input_component_store'
|
55
|
+
require_relative 'rggen/builder/output_component_store'
|
56
|
+
require_relative 'rggen/builder/category'
|
57
|
+
require_relative 'rggen/builder/builder'
|
58
|
+
|
59
|
+
require_relative 'rggen/generator'
|
60
|
+
|
61
|
+
require_relative 'rggen/commands'
|
62
|
+
|
63
|
+
require_relative 'rggen/core_components'
|
64
|
+
require_relative 'rggen/builtins'
|
65
|
+
end
|
data/ral/compile.f
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
`ifndef __RGGEN_RAL_BLOCK_SVH__
|
2
|
+
`define __RGGEN_RAL_BLOCK_SVH__
|
3
|
+
class rggen_ral_block extends uvm_reg_block;
|
4
|
+
protected uvm_object cfg;
|
5
|
+
|
6
|
+
extern function new(string name= "rggen_ral_block", int has_coverage = UVM_NO_COVERAGE);
|
7
|
+
|
8
|
+
extern function void configure(uvm_object cfg, uvm_reg_block parent = null, string hdl_path = "");
|
9
|
+
|
10
|
+
extern virtual function uvm_reg_map create_map(
|
11
|
+
string name,
|
12
|
+
uvm_reg_addr_t base_addr,
|
13
|
+
int unsigned n_bytes,
|
14
|
+
uvm_endianness_e endian,
|
15
|
+
bit byte_addressing = 1
|
16
|
+
);
|
17
|
+
extern virtual function void lock_model();
|
18
|
+
|
19
|
+
extern protected virtual function void set_cfg(uvm_object cfg);
|
20
|
+
extern protected virtual function uvm_reg_map create_default_map();
|
21
|
+
extern protected virtual function void create_blocks();
|
22
|
+
extern protected virtual function void create_registers();
|
23
|
+
endclass
|
24
|
+
|
25
|
+
function rggen_ral_block::new(string name, int has_coverage);
|
26
|
+
super.new(name, has_coverage);
|
27
|
+
endfunction
|
28
|
+
|
29
|
+
function void rggen_ral_block::configure(uvm_object cfg, uvm_reg_block parent, string hdl_path);
|
30
|
+
set_cfg(cfg);
|
31
|
+
super.configure(parent, hdl_path);
|
32
|
+
if (default_map == null) begin
|
33
|
+
default_map = create_default_map();
|
34
|
+
end
|
35
|
+
create_blocks();
|
36
|
+
create_registers();
|
37
|
+
endfunction
|
38
|
+
|
39
|
+
function uvm_reg_map rggen_ral_block::create_map(
|
40
|
+
string name,
|
41
|
+
uvm_reg_addr_t base_addr,
|
42
|
+
int unsigned n_bytes,
|
43
|
+
uvm_endianness_e endian,
|
44
|
+
bit byte_addressing
|
45
|
+
);
|
46
|
+
uvm_factory f = uvm_factory::get();
|
47
|
+
f.set_inst_override_by_type(uvm_reg_map::get_type(), rggen_ral_map::get_type(), {get_full_name(), ".", name});
|
48
|
+
return super.create_map(name, base_addr, n_bytes, endian, byte_addressing);
|
49
|
+
endfunction
|
50
|
+
|
51
|
+
function void rggen_ral_block::lock_model();
|
52
|
+
uvm_reg_block parent_block = get_parent();
|
53
|
+
|
54
|
+
if (is_locked()) begin
|
55
|
+
return;
|
56
|
+
end
|
57
|
+
|
58
|
+
super.lock_model();
|
59
|
+
|
60
|
+
if (parent_block == null) begin
|
61
|
+
uvm_reg_map maps[$];
|
62
|
+
get_maps(maps);
|
63
|
+
foreach (maps[i]) begin
|
64
|
+
rggen_ral_map rggen_map;
|
65
|
+
if ($cast(rggen_map, maps[i])) begin
|
66
|
+
rggen_map.Xinit_shadow_reg_address_mapX();
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
endfunction
|
71
|
+
|
72
|
+
function void rggen_ral_block::set_cfg(uvm_object cfg);
|
73
|
+
this.cfg = cfg;
|
74
|
+
endfunction
|
75
|
+
|
76
|
+
function uvm_reg_map rggen_ral_block::create_default_map();
|
77
|
+
endfunction
|
78
|
+
|
79
|
+
function void rggen_ral_block::create_blocks();
|
80
|
+
endfunction
|
81
|
+
|
82
|
+
function void rggen_ral_block::create_registers();
|
83
|
+
endfunction
|
84
|
+
`endif
|
@@ -0,0 +1,47 @@
|
|
1
|
+
`ifndef __RGGEN_RAL_FIELD_SVH__
|
2
|
+
`define __RGGEN_RAL_FIELD_SVH__
|
3
|
+
class rggen_ral_field extends uvm_reg_field;
|
4
|
+
protected uvm_object cfg;
|
5
|
+
|
6
|
+
extern function new(string name = "rggen_ral_field");
|
7
|
+
|
8
|
+
extern function void configure(
|
9
|
+
uvm_object cfg,
|
10
|
+
uvm_reg parent,
|
11
|
+
int unsigned size,
|
12
|
+
int unsigned lsb_pos,
|
13
|
+
string access,
|
14
|
+
bit volatile,
|
15
|
+
uvm_reg_data_t reset,
|
16
|
+
bit has_reset,
|
17
|
+
bit is_rand,
|
18
|
+
bit individually_accessible
|
19
|
+
);
|
20
|
+
|
21
|
+
extern protected virtual function void set_cfg(uvm_object cfg);
|
22
|
+
endclass
|
23
|
+
|
24
|
+
function rggen_ral_field::new(string name);
|
25
|
+
super.new(name);
|
26
|
+
endfunction
|
27
|
+
|
28
|
+
function void rggen_ral_field::configure(
|
29
|
+
uvm_object cfg,
|
30
|
+
uvm_reg parent,
|
31
|
+
int unsigned size,
|
32
|
+
int unsigned lsb_pos,
|
33
|
+
string access,
|
34
|
+
bit volatile,
|
35
|
+
uvm_reg_data_t reset,
|
36
|
+
bit has_reset,
|
37
|
+
bit is_rand,
|
38
|
+
bit individually_accessible
|
39
|
+
);
|
40
|
+
set_cfg(cfg);
|
41
|
+
super.configure(parent, size, lsb_pos, access, volatile, reset, has_reset, is_rand, individually_accessible);
|
42
|
+
endfunction
|
43
|
+
|
44
|
+
function void rggen_ral_field::set_cfg(uvm_object cfg);
|
45
|
+
this.cfg = cfg;
|
46
|
+
endfunction
|
47
|
+
`endif
|
@@ -0,0 +1,22 @@
|
|
1
|
+
`ifndef __RGGEN_RAL_MACROS_SVH__
|
2
|
+
`define __RGGEN_RAL_MACROS_SVH__
|
3
|
+
|
4
|
+
`define rggen_ral_create_field_model(handle, name, width, lsb, access, volatile, reset, has_reset) \
|
5
|
+
begin \
|
6
|
+
handle = new(name); \
|
7
|
+
handle.configure(this.cfg, this, width, lsb, access, volatile, reset, has_reset, 1, 1); \
|
8
|
+
end
|
9
|
+
|
10
|
+
`define rggen_ral_create_reg_model(handle, base_naem, array_index, offset_address, rights, unmapped) \
|
11
|
+
begin \
|
12
|
+
string __instance_name = base_naem; \
|
13
|
+
int __array_index[$] = array_index; \
|
14
|
+
foreach (__array_index[__i]) begin \
|
15
|
+
$sformat(__instance_name, "%s[%0d]", __instance_name, __array_index[__i]); \
|
16
|
+
end \
|
17
|
+
handle = new(__instance_name); \
|
18
|
+
handle.configure(this.cfg, this, null, array_index); \
|
19
|
+
default_map.add_reg(handle, offset_address, rights, unmapped); \
|
20
|
+
end
|
21
|
+
|
22
|
+
`endif
|
@@ -0,0 +1,124 @@
|
|
1
|
+
`ifndef __RGGEN_RAL_MAP_SVH__
|
2
|
+
`define __RGGEN_RAL_MAP_SVH__
|
3
|
+
class rggen_ral_map extends uvm_reg_map;
|
4
|
+
protected rggen_ral_shadow_reg m_shadow_regs_by_offset[uvm_reg_addr_t][$];
|
5
|
+
|
6
|
+
extern function new(string name = "rggen_ral_map");
|
7
|
+
|
8
|
+
extern virtual function void add_reg(
|
9
|
+
uvm_reg rg,
|
10
|
+
uvm_reg_addr_t offset,
|
11
|
+
string rights = "RW",
|
12
|
+
bit unmapped = 0,
|
13
|
+
uvm_reg_frontdoor frontdoor = null
|
14
|
+
);
|
15
|
+
extern virtual function void set_base_addr(uvm_reg_addr_t offset);
|
16
|
+
extern virtual function void set_submap_offset(uvm_reg_map submap, uvm_reg_addr_t offset);
|
17
|
+
|
18
|
+
extern virtual function uvm_reg get_reg_by_offset(uvm_reg_addr_t offset, bit read = 1);
|
19
|
+
|
20
|
+
extern function void Xinit_shadow_reg_address_mapX();
|
21
|
+
|
22
|
+
`uvm_object_utils(rggen_ral_map)
|
23
|
+
endclass
|
24
|
+
|
25
|
+
function rggen_ral_map::new(string name);
|
26
|
+
super.new(name);
|
27
|
+
endfunction
|
28
|
+
|
29
|
+
function void rggen_ral_map::add_reg(
|
30
|
+
uvm_reg rg,
|
31
|
+
uvm_reg_addr_t offset,
|
32
|
+
string rights,
|
33
|
+
bit unmapped,
|
34
|
+
uvm_reg_frontdoor frontdoor
|
35
|
+
);
|
36
|
+
rggen_ral_reg rggen_reg;
|
37
|
+
rggen_ral_shadow_reg rggen_shadow_reg;
|
38
|
+
|
39
|
+
if ((frontdoor == null) && $cast(rggen_reg, rg)) begin
|
40
|
+
frontdoor = rggen_reg.create_frontdoor();
|
41
|
+
end
|
42
|
+
if ($cast(rggen_shadow_reg, rg)) begin
|
43
|
+
unmapped = 1;
|
44
|
+
end
|
45
|
+
super.add_reg(rg, offset, rights, unmapped, frontdoor);
|
46
|
+
endfunction
|
47
|
+
|
48
|
+
function void rggen_ral_map::set_base_addr(uvm_reg_addr_t offset);
|
49
|
+
uvm_reg_block parent_block = get_parent();
|
50
|
+
uvm_reg_map parent_map = get_parent_map();
|
51
|
+
bit locked = parent_block.is_locked();
|
52
|
+
super.set_base_addr(offset);
|
53
|
+
if ((parent_map == null) && locked) begin
|
54
|
+
Xinit_shadow_reg_address_mapX();
|
55
|
+
end
|
56
|
+
endfunction
|
57
|
+
|
58
|
+
function void rggen_ral_map::set_submap_offset(uvm_reg_map submap, uvm_reg_addr_t offset);
|
59
|
+
uvm_reg_block parent_block = get_parent();
|
60
|
+
bit locked = parent_block.is_locked();
|
61
|
+
super.set_submap_offset(submap, offset);
|
62
|
+
if ((submap != null) && locked) begin
|
63
|
+
uvm_reg_map root_map = get_root_map();
|
64
|
+
rggen_ral_map rggen_map;
|
65
|
+
if ($cast(rggen_map, root_map)) begin
|
66
|
+
rggen_map.Xinit_shadow_reg_address_mapX();
|
67
|
+
end
|
68
|
+
end
|
69
|
+
endfunction
|
70
|
+
|
71
|
+
function uvm_reg rggen_ral_map::get_reg_by_offset(uvm_reg_addr_t offset, bit read);
|
72
|
+
uvm_reg rg = super.get_reg_by_offset(offset, read);
|
73
|
+
uvm_reg_block parent = get_parent();
|
74
|
+
if ((rg == null) && parent.is_locked() && m_shadow_regs_by_offset.exists(offset)) begin
|
75
|
+
foreach (m_shadow_regs_by_offset[offset][i]) begin
|
76
|
+
if (m_shadow_regs_by_offset[offset][i].is_active()) begin
|
77
|
+
rg = m_shadow_regs_by_offset[offset][i];
|
78
|
+
break;
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
return rg;
|
83
|
+
endfunction
|
84
|
+
|
85
|
+
function void rggen_ral_map::Xinit_shadow_reg_address_mapX();
|
86
|
+
uvm_reg_map top_map;
|
87
|
+
rggen_ral_map top_rggen_map;
|
88
|
+
uvm_reg_map submaps[$];
|
89
|
+
uvm_reg regs[$];
|
90
|
+
|
91
|
+
top_map = get_root_map();
|
92
|
+
if (top_map == this) begin
|
93
|
+
m_shadow_regs_by_offset.delete();
|
94
|
+
end
|
95
|
+
if (!$cast(top_rggen_map, top_map)) begin
|
96
|
+
return;
|
97
|
+
end
|
98
|
+
|
99
|
+
get_submaps(submaps, UVM_NO_HIER);
|
100
|
+
foreach (submaps[i]) begin
|
101
|
+
rggen_ral_map rggen_map;
|
102
|
+
if ($cast(rggen_map, submaps[i])) begin
|
103
|
+
rggen_map.Xinit_shadow_reg_address_mapX();
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
get_registers(regs, UVM_NO_HIER);
|
108
|
+
foreach (regs[i]) begin
|
109
|
+
rggen_ral_shadow_reg shadow_reg;
|
110
|
+
uvm_reg_map_info map_info;
|
111
|
+
|
112
|
+
if (!$cast(shadow_reg, regs[i])) begin
|
113
|
+
continue;
|
114
|
+
end
|
115
|
+
|
116
|
+
map_info = get_reg_map_info(shadow_reg);
|
117
|
+
map_info.unmapped = 0;
|
118
|
+
void'(get_physical_addresses(map_info.offset, 0, shadow_reg.get_n_bytes(), map_info.addr));
|
119
|
+
foreach (map_info.addr[j]) begin
|
120
|
+
top_rggen_map.m_shadow_regs_by_offset[map_info.addr[j]].push_back(shadow_reg);
|
121
|
+
end
|
122
|
+
end
|
123
|
+
endfunction
|
124
|
+
`endif
|
@@ -0,0 +1,14 @@
|
|
1
|
+
`ifndef __RGGEN_RAL_PKG_SV__
|
2
|
+
`define __RGGEN_RAL_PKG_SV__
|
3
|
+
package rggen_ral_pkg;
|
4
|
+
import uvm_pkg::*;
|
5
|
+
`include "uvm_macros.svh"
|
6
|
+
|
7
|
+
`include "rggen_ral_macros.svh"
|
8
|
+
`include "rggen_ral_field.svh"
|
9
|
+
`include "rggen_ral_reg.svh"
|
10
|
+
`include "rggen_ral_shadow_reg.svh"
|
11
|
+
`include "rggen_ral_map.svh"
|
12
|
+
`include "rggen_ral_block.svh"
|
13
|
+
endpackage
|
14
|
+
`endif
|
@@ -0,0 +1,52 @@
|
|
1
|
+
`ifndef __RGGEN_RAL_REG_SVH__
|
2
|
+
`define __RGGEN_RAL_REG_SVH__
|
3
|
+
class rggen_ral_reg extends uvm_reg;
|
4
|
+
protected int indexes[$];
|
5
|
+
protected uvm_object cfg;
|
6
|
+
|
7
|
+
extern function new(string name, int unsigned n_bits, int has_coverage);
|
8
|
+
|
9
|
+
extern function void configure(
|
10
|
+
uvm_object cfg,
|
11
|
+
uvm_reg_block blk_parent,
|
12
|
+
uvm_reg_file regfile_parent,
|
13
|
+
int indexes[$],
|
14
|
+
string hdl_path = ""
|
15
|
+
);
|
16
|
+
|
17
|
+
extern virtual function uvm_reg_frontdoor create_frontdoor();
|
18
|
+
|
19
|
+
extern protected virtual function void set_cfg(uvm_object cfg);
|
20
|
+
extern protected virtual function void create_fields();
|
21
|
+
endclass
|
22
|
+
|
23
|
+
function rggen_ral_reg::new(string name, int unsigned n_bits, int has_coverage);
|
24
|
+
super.new(name, n_bits, has_coverage);
|
25
|
+
endfunction
|
26
|
+
|
27
|
+
function void rggen_ral_reg::configure(
|
28
|
+
uvm_object cfg,
|
29
|
+
uvm_reg_block blk_parent,
|
30
|
+
uvm_reg_file regfile_parent,
|
31
|
+
int indexes[$],
|
32
|
+
string hdl_path
|
33
|
+
);
|
34
|
+
foreach (indexes[i]) begin
|
35
|
+
this.indexes.push_back(indexes[i]);
|
36
|
+
end
|
37
|
+
set_cfg(cfg);
|
38
|
+
super.configure(blk_parent, regfile_parent, hdl_path);
|
39
|
+
create_fields();
|
40
|
+
endfunction
|
41
|
+
|
42
|
+
function uvm_reg_frontdoor rggen_ral_reg::create_frontdoor();
|
43
|
+
return null;
|
44
|
+
endfunction
|
45
|
+
|
46
|
+
function void rggen_ral_reg::set_cfg(uvm_object cfg);
|
47
|
+
this.cfg = cfg;
|
48
|
+
endfunction
|
49
|
+
|
50
|
+
function void rggen_ral_reg::create_fields();
|
51
|
+
endfunction
|
52
|
+
`endif
|