rggen 0.3.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/.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
|