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.
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