rggen 0.3.3 → 0.4.0

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