rggen 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (152) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +7 -0
  3. data/.rubocop_todo.yml +91 -0
  4. data/CODE_OF_CONDUCT.md +49 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +31 -0
  7. data/bin/rggen +6 -0
  8. data/lib/rggen/base/component.rb +27 -0
  9. data/lib/rggen/base/component_factory.rb +46 -0
  10. data/lib/rggen/base/hierarchical_accessors.rb +87 -0
  11. data/lib/rggen/base/hierarchical_item_accessors.rb +79 -0
  12. data/lib/rggen/base/item.rb +24 -0
  13. data/lib/rggen/base/item_factory.rb +20 -0
  14. data/lib/rggen/builder/builder.rb +69 -0
  15. data/lib/rggen/builder/category.rb +52 -0
  16. data/lib/rggen/builder/component_entry.rb +50 -0
  17. data/lib/rggen/builder/component_store.rb +42 -0
  18. data/lib/rggen/builder/input_component_store.rb +25 -0
  19. data/lib/rggen/builder/item_store.rb +89 -0
  20. data/lib/rggen/builder/list_item_entry.rb +81 -0
  21. data/lib/rggen/builder/output_component_store.rb +13 -0
  22. data/lib/rggen/builder/simple_item_entry.rb +33 -0
  23. data/lib/rggen/builtins/bit_field/bit_assignment.rb +39 -0
  24. data/lib/rggen/builtins/bit_field/field_model_creation.rb +25 -0
  25. data/lib/rggen/builtins/bit_field/field_model_declaration.rb +9 -0
  26. data/lib/rggen/builtins/bit_field/initial_value.rb +36 -0
  27. data/lib/rggen/builtins/bit_field/name.rb +26 -0
  28. data/lib/rggen/builtins/bit_field/reference.rb +42 -0
  29. data/lib/rggen/builtins/bit_field/reserved.rb +9 -0
  30. data/lib/rggen/builtins/bit_field/ro.rb +19 -0
  31. data/lib/rggen/builtins/bit_field/rw.erb +13 -0
  32. data/lib/rggen/builtins/bit_field/rw.rb +25 -0
  33. data/lib/rggen/builtins/bit_field/type.rb +205 -0
  34. data/lib/rggen/builtins/bit_field/wo.rb +5 -0
  35. data/lib/rggen/builtins/global/address_width.rb +17 -0
  36. data/lib/rggen/builtins/global/data_width.rb +20 -0
  37. data/lib/rggen/builtins/loaders/configuration/json_loader.rb +7 -0
  38. data/lib/rggen/builtins/loaders/configuration/yaml_loader.rb +7 -0
  39. data/lib/rggen/builtins/loaders/register_map/csv_loader.rb +14 -0
  40. data/lib/rggen/builtins/loaders/register_map/xls_loader.rb +19 -0
  41. data/lib/rggen/builtins/loaders/register_map/xlsx_ods_loader.rb +24 -0
  42. data/lib/rggen/builtins/register/accessibility.rb +23 -0
  43. data/lib/rggen/builtins/register/address_decoder.erb +16 -0
  44. data/lib/rggen/builtins/register/address_decoder.rb +92 -0
  45. data/lib/rggen/builtins/register/array.rb +133 -0
  46. data/lib/rggen/builtins/register/field_model_creator.rb +10 -0
  47. data/lib/rggen/builtins/register/field_model_declarations.rb +7 -0
  48. data/lib/rggen/builtins/register/name.rb +26 -0
  49. data/lib/rggen/builtins/register/offset_address.rb +55 -0
  50. data/lib/rggen/builtins/register/read_data.rb +36 -0
  51. data/lib/rggen/builtins/register/reg_model_constructor.rb +17 -0
  52. data/lib/rggen/builtins/register/reg_model_creation.rb +64 -0
  53. data/lib/rggen/builtins/register/reg_model_declaration.rb +13 -0
  54. data/lib/rggen/builtins/register/reg_model_definition.rb +22 -0
  55. data/lib/rggen/builtins/register/shadow.rb +130 -0
  56. data/lib/rggen/builtins/register/shadow_index_configurator.rb +53 -0
  57. data/lib/rggen/builtins/register/uniqueness_validator.rb +48 -0
  58. data/lib/rggen/builtins/register_block/apb.erb +27 -0
  59. data/lib/rggen/builtins/register_block/apb.rb +20 -0
  60. data/lib/rggen/builtins/register_block/base_address.rb +64 -0
  61. data/lib/rggen/builtins/register_block/block_model_constructor.rb +14 -0
  62. data/lib/rggen/builtins/register_block/block_model_default_map_creator.rb +39 -0
  63. data/lib/rggen/builtins/register_block/block_model_definition.rb +18 -0
  64. data/lib/rggen/builtins/register_block/byte_size.rb +37 -0
  65. data/lib/rggen/builtins/register_block/clock_reset.rb +8 -0
  66. data/lib/rggen/builtins/register_block/host_if.rb +46 -0
  67. data/lib/rggen/builtins/register_block/module_definition.rb +13 -0
  68. data/lib/rggen/builtins/register_block/name.rb +26 -0
  69. data/lib/rggen/builtins/register_block/ral_package_definition.rb +19 -0
  70. data/lib/rggen/builtins/register_block/reg_model_creator.rb +14 -0
  71. data/lib/rggen/builtins/register_block/reg_model_declarations.rb +7 -0
  72. data/lib/rggen/builtins/register_block/response_mux.erb +14 -0
  73. data/lib/rggen/builtins/register_block/response_mux.rb +16 -0
  74. data/lib/rggen/builtins/register_block/signal_declarations.rb +9 -0
  75. data/lib/rggen/builtins.rb +52 -0
  76. data/lib/rggen/commands.rb +23 -0
  77. data/lib/rggen/core_components/configuration/configuration_factory.rb +23 -0
  78. data/lib/rggen/core_components/configuration/item_factory.rb +13 -0
  79. data/lib/rggen/core_components/configuration/raise_error.rb +11 -0
  80. data/lib/rggen/core_components/configuration/setup.rb +14 -0
  81. data/lib/rggen/core_components/ral/item.rb +16 -0
  82. data/lib/rggen/core_components/ral/setup.rb +19 -0
  83. data/lib/rggen/core_components/register_map/bit_field_factory.rb +11 -0
  84. data/lib/rggen/core_components/register_map/component.rb +12 -0
  85. data/lib/rggen/core_components/register_map/generic_map.rb +69 -0
  86. data/lib/rggen/core_components/register_map/item.rb +22 -0
  87. data/lib/rggen/core_components/register_map/item_factory.rb +13 -0
  88. data/lib/rggen/core_components/register_map/loader.rb +13 -0
  89. data/lib/rggen/core_components/register_map/raise_error.rb +17 -0
  90. data/lib/rggen/core_components/register_map/register_block_factory.rb +29 -0
  91. data/lib/rggen/core_components/register_map/register_factory.rb +18 -0
  92. data/lib/rggen/core_components/register_map/register_map_factory.rb +21 -0
  93. data/lib/rggen/core_components/register_map/setup.rb +33 -0
  94. data/lib/rggen/core_components/rtl/component.rb +28 -0
  95. data/lib/rggen/core_components/rtl/item.rb +83 -0
  96. data/lib/rggen/core_components/rtl/setup.rb +19 -0
  97. data/lib/rggen/core_components.rb +23 -0
  98. data/lib/rggen/core_extensions/facets.rb +17 -0
  99. data/lib/rggen/core_extensions/forwardable.rb +26 -0
  100. data/lib/rggen/core_extensions/integer.rb +5 -0
  101. data/lib/rggen/core_extensions/math.rb +7 -0
  102. data/lib/rggen/exceptions.rb +22 -0
  103. data/lib/rggen/generator.rb +185 -0
  104. data/lib/rggen/input_base/component.rb +19 -0
  105. data/lib/rggen/input_base/component_factory.rb +58 -0
  106. data/lib/rggen/input_base/item.rb +170 -0
  107. data/lib/rggen/input_base/item_factory.rb +13 -0
  108. data/lib/rggen/input_base/loader.rb +14 -0
  109. data/lib/rggen/input_base/regexp_patterns.rb +29 -0
  110. data/lib/rggen/output_base/code_block.rb +72 -0
  111. data/lib/rggen/output_base/code_utility.rb +44 -0
  112. data/lib/rggen/output_base/component.rb +88 -0
  113. data/lib/rggen/output_base/component_factory.rb +32 -0
  114. data/lib/rggen/output_base/item.rb +175 -0
  115. data/lib/rggen/output_base/item_factory.rb +6 -0
  116. data/lib/rggen/output_base/line.rb +28 -0
  117. data/lib/rggen/output_base/template_utility.rb +29 -0
  118. data/lib/rggen/output_base/verilog_utility/class_definition.rb +23 -0
  119. data/lib/rggen/output_base/verilog_utility/declaration.rb +70 -0
  120. data/lib/rggen/output_base/verilog_utility/identifier.rb +29 -0
  121. data/lib/rggen/output_base/verilog_utility/module_definition.rb +47 -0
  122. data/lib/rggen/output_base/verilog_utility/package_definition.rb +67 -0
  123. data/lib/rggen/output_base/verilog_utility/structure_definition.rb +52 -0
  124. data/lib/rggen/output_base/verilog_utility/subroutine_definition.rb +43 -0
  125. data/lib/rggen/output_base/verilog_utility.rb +66 -0
  126. data/lib/rggen/version.rb +6 -0
  127. data/lib/rggen.rb +65 -0
  128. data/ral/compile.f +4 -0
  129. data/ral/rggen_ral_block.svh +84 -0
  130. data/ral/rggen_ral_field.svh +47 -0
  131. data/ral/rggen_ral_macros.svh +22 -0
  132. data/ral/rggen_ral_map.svh +124 -0
  133. data/ral/rggen_ral_pkg.sv +14 -0
  134. data/ral/rggen_ral_reg.svh +52 -0
  135. data/ral/rggen_ral_shadow_reg.svh +188 -0
  136. data/rggen.gemspec +45 -0
  137. data/rtl/bit_field/rggen_bit_field_rw.sv +28 -0
  138. data/rtl/register/rggen_address_decoder.sv +49 -0
  139. data/rtl/register_block/rggen_host_if_apb.sv +40 -0
  140. data/rtl/register_block/rggen_response_mux.sv +82 -0
  141. data/sample/sample.csv +14 -0
  142. data/sample/sample.json +4 -0
  143. data/sample/sample.xls +0 -0
  144. data/sample/sample.xlsx +0 -0
  145. data/sample/sample.yaml +2 -0
  146. data/sample/sample_0.sv +285 -0
  147. data/sample/sample_0_ral_pkg.sv +99 -0
  148. data/sample/sample_1.sv +172 -0
  149. data/sample/sample_1_ral_pkg.sv +53 -0
  150. data/sample/sample_setup.rb +21 -0
  151. data/setup/default.rb +11 -0
  152. 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
@@ -0,0 +1,6 @@
1
+ module RgGen
2
+ MAJOR = 0
3
+ MINOR = 3
4
+ TEENY = 0
5
+ VERSION = "#{MAJOR}.#{MINOR}.#{TEENY}".freeze
6
+ 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,4 @@
1
+ +incdir+${UVM_HOME}/src
2
+ +incdir+${RGGEN_HOME}/ral
3
+ ${UVM_HOME}/src/uvm_pkg.sv
4
+ ${RGGEN_HOME}/ral/rgen_ral_pkg.sv
@@ -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