rggen 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/c_header/LICENSE +21 -0
  3. data/{c → c_header}/rggen.h +0 -0
  4. data/lib/rggen/builtins.rb +2 -5
  5. data/lib/rggen/builtins/bit_field/type.rb +22 -7
  6. data/lib/rggen/builtins/bit_field/types/ro.erb +2 -2
  7. data/lib/rggen/builtins/bit_field/types/ro.rb +2 -2
  8. data/lib/rggen/builtins/bit_field/types/rw.erb +5 -9
  9. data/lib/rggen/builtins/bit_field/types/rw.rb +5 -5
  10. data/lib/rggen/builtins/bit_field/types/rwl_rwe.erb +3 -7
  11. data/lib/rggen/builtins/bit_field/types/rwl_rwe.rb +6 -7
  12. data/lib/rggen/builtins/bit_field/types/w0c_w1c.erb +8 -12
  13. data/lib/rggen/builtins/bit_field/types/w0c_w1c.rb +5 -2
  14. data/lib/rggen/builtins/bit_field/types/w0s_w1s.erb +8 -12
  15. data/lib/rggen/builtins/bit_field/types/w0s_w1s.rb +3 -6
  16. data/lib/rggen/builtins/register/array.rb +0 -93
  17. data/lib/rggen/builtins/register/reg_model.rb +1 -1
  18. data/lib/rggen/builtins/register/rtl_top.rb +68 -0
  19. data/lib/rggen/builtins/register/type.rb +74 -0
  20. data/lib/rggen/builtins/register/types/default.erb +10 -0
  21. data/lib/rggen/builtins/register/types/external.erb +11 -0
  22. data/lib/rggen/builtins/register/types/external.rb +11 -0
  23. data/lib/rggen/builtins/register/types/indirect.erb +13 -0
  24. data/lib/rggen/builtins/register/types/indirect.rb +43 -0
  25. data/lib/rggen/builtins/register_block/clock_reset.rb +2 -2
  26. data/lib/rggen/builtins/register_block/host_if.rb +11 -12
  27. data/lib/rggen/builtins/register_block/host_ifs/apb.erb +7 -25
  28. data/lib/rggen/builtins/register_block/host_ifs/apb.rb +4 -13
  29. data/lib/rggen/builtins/register_block/host_ifs/axi4lite.erb +6 -34
  30. data/lib/rggen/builtins/register_block/host_ifs/axi4lite.rb +8 -30
  31. data/lib/rggen/builtins/register_block/irq_controller.rb +4 -4
  32. data/lib/rggen/builtins/register_block/rtl_top.erb +7 -0
  33. data/lib/rggen/builtins/register_block/rtl_top.rb +28 -0
  34. data/lib/rggen/core_components.rb +3 -0
  35. data/lib/rggen/core_components/ral/item.rb +2 -6
  36. data/lib/rggen/core_components/rtl/component.rb +8 -8
  37. data/lib/rggen/core_components/rtl/item.rb +41 -38
  38. data/lib/rggen/core_components/verilog_utility.rb +23 -4
  39. data/lib/rggen/core_components/verilog_utility/declaration.rb +14 -4
  40. data/lib/rggen/core_components/verilog_utility/identifier.rb +19 -0
  41. data/lib/rggen/core_components/verilog_utility/interface_instantiation.rb +33 -0
  42. data/lib/rggen/core_components/verilog_utility/interface_port_declaration.rb +29 -0
  43. data/lib/rggen/core_components/verilog_utility/local_scope.rb +64 -0
  44. data/lib/rggen/core_extensions/facets.rb +1 -1
  45. data/lib/rggen/core_extensions/forwardable.rb +1 -1
  46. data/lib/rggen/version.rb +2 -2
  47. data/ral/LICENSE +21 -0
  48. data/ral/rggen_ral_macros.svh +1 -4
  49. data/ral/rggen_ral_reg.svh +35 -3
  50. data/rtl/LICENSE +21 -0
  51. data/rtl/compile.f +21 -6
  52. data/rtl/rggen_address_decoder.sv +23 -0
  53. data/rtl/rggen_apb_if.sv +41 -0
  54. data/rtl/rggen_axi4lite_if.sv +68 -0
  55. data/rtl/rggen_bit_field_if.sv +28 -0
  56. data/rtl/rggen_bit_field_ro.sv +9 -0
  57. data/rtl/rggen_bit_field_rw.sv +25 -0
  58. data/rtl/rggen_bit_field_rwl_rwe.sv +29 -0
  59. data/rtl/rggen_bit_field_w01s_w01c.sv +55 -0
  60. data/rtl/rggen_bus_if.sv +43 -0
  61. data/rtl/rggen_bus_splitter.sv +87 -0
  62. data/rtl/rggen_default_register.sv +15 -0
  63. data/rtl/rggen_external_register.sv +83 -0
  64. data/rtl/rggen_host_if_apb.sv +29 -0
  65. data/rtl/rggen_host_if_axi4lite.sv +14 -0
  66. data/rtl/rggen_indirect_register.sv +21 -0
  67. data/rtl/{register_block/rggen_irq_controller.sv → rggen_irq_controller.sv} +0 -0
  68. data/rtl/rggen_register_base.sv +57 -0
  69. data/rtl/rggen_register_if.sv +42 -0
  70. data/rtl/rggen_rtl_pkg.sv +23 -0
  71. data/sample/LICENSE +21 -0
  72. data/sample/sample_0.sv +315 -444
  73. data/sample/sample_0_ral_pkg.sv +7 -7
  74. data/sample/sample_1.sv +104 -162
  75. data/sample/sample_1_ral_pkg.sv +3 -3
  76. data/sample/sample_setup.rb +2 -2
  77. data/setup/default.rb +3 -3
  78. metadata +35 -23
  79. data/lib/rggen/builtins/register/address_decoder.erb +0 -12
  80. data/lib/rggen/builtins/register/address_decoder.rb +0 -82
  81. data/lib/rggen/builtins/register/bus_exporter.erb +0 -28
  82. data/lib/rggen/builtins/register/bus_exporter.rb +0 -52
  83. data/lib/rggen/builtins/register/read_data.rb +0 -61
  84. data/lib/rggen/builtins/register_block/response_mux.erb +0 -18
  85. data/lib/rggen/builtins/register_block/response_mux.rb +0 -47
  86. data/lib/rggen/builtins/register_block/top_module.rb +0 -20
  87. data/rtl/bit_field/rggen_bit_field_common.svh +0 -15
  88. data/rtl/bit_field/rggen_bit_field_ro.sv +0 -8
  89. data/rtl/bit_field/rggen_bit_field_rw.sv +0 -27
  90. data/rtl/bit_field/rggen_bit_field_rwl_rwe.sv +0 -49
  91. data/rtl/bit_field/rggen_bit_field_w01s_w01c.sv +0 -67
  92. data/rtl/register/rggen_address_decoder.sv +0 -37
  93. data/rtl/register/rggen_bus_exporter.sv +0 -96
  94. data/rtl/register_block/rggen_host_if_apb.sv +0 -42
  95. data/rtl/register_block/rggen_host_if_axi4lite.sv +0 -257
  96. data/rtl/register_block/rggen_host_if_common.svh +0 -9
  97. data/rtl/register_block/rggen_response_mux.sv +0 -113
@@ -1,12 +0,0 @@
1
- rggen_address_decoder #(
2
- .ADDRESS_WIDTH (<%= local_address_width - address_lsb %>),
3
- .START_ADDRESS (<%= start_address%>),
4
- .END_ADDRESS (<%= end_address %>),
5
- .INDIRECT_REGISTER (<%= indirect_register %>),
6
- .INDIRECT_INDEX_WIDTH (<%= indirect_index_width %>),
7
- .INDIRECT_INDEX_VALUE (<%= indirect_index_value %>)
8
- ) u_<%= register.name%>_address_decoder (
9
- .i_address (<%= register_block.host_if.address[local_address_width - 1, address_lsb] %>),
10
- .i_indirect_index (<%= (type?(:indirect) && indirect_index[loop_variables]) || indirect_index_value %>),
11
- .o_select (<%= register_block.register_select[register.index] %>)
12
- );
@@ -1,82 +0,0 @@
1
- simple_item :register, :address_decoder do
2
- rtl do
3
- build do
4
- next unless type?(:indirect)
5
- logic :indirect_index,
6
- name: "#{register.name}_indirect_index",
7
- width: indirect_index_width,
8
- dimensions: register.dimensions
9
- end
10
-
11
- generate_code :module_item do |buffer|
12
- buffer << indirect_index_assignment << nl if type?(:indirect)
13
- buffer << process_template
14
- end
15
-
16
- delegate [:local_address_width] => :register_block
17
- delegate [:array?, :type?, :multiple?] => :register
18
- delegate [:indexes, :loop_variables] => :register
19
-
20
- def address_lsb
21
- Math.clog2(configuration.byte_width)
22
- end
23
-
24
- def start_address
25
- address_code(register.start_address)
26
- end
27
-
28
- def end_address
29
- if array?
30
- address = register.start_address + configuration.byte_width - 1
31
- address_code(address)
32
- else
33
- address_code(register.end_address)
34
- end
35
- end
36
-
37
- def address_code(address)
38
- shift = address_lsb
39
- base = hex(address >> shift, local_address_width - shift)
40
- (array? && multiple? && "#{base} + #{register.local_index}") || base
41
- end
42
-
43
- def indirect_index_assignment
44
- assign(
45
- indirect_index[register.loop_variables],
46
- concat(indirect_index_fields.map(&:value))
47
- )
48
- end
49
-
50
- def indirect_register
51
- (type?(:indirect) && 1) || 0
52
- end
53
-
54
- def indirect_index_width
55
- return 1 unless type?(:indirect)
56
- indirect_index_fields.sum(0, &:width)
57
- end
58
-
59
- def indirect_index_value
60
- return hex(0, 1) unless type?(:indirect)
61
- concat(indirect_index_values)
62
- end
63
-
64
- def indirect_index_fields
65
- @indirect_index_fields ||= indexes.map do |index|
66
- register_block.bit_fields.find_by(name: index.name)
67
- end
68
- end
69
-
70
- def indirect_index_values
71
- variables = loop_variables
72
- indexes.map.with_index do |index, i|
73
- if index.value
74
- hex(index.value, indirect_index_fields[i].width)
75
- else
76
- loop_variable = variables.shift
77
- loop_variable[indirect_index_fields[i].width - 1, 0]
78
- end
79
- end
80
- end
81
- end
82
- end
@@ -1,28 +0,0 @@
1
- rggen_bus_exporter #(
2
- .DATA_WIDTH (<%= configuration.data_width %>),
3
- .LOCAL_ADDRESS_WIDTH (<%= register_block.local_address_width %>),
4
- .EXTERNAL_ADDRESS_WIDTH (<%= address_width %>),
5
- .START_ADDRESS (<%= start_address %>)
6
- ) u_<%= name %>_bus_exporter (
7
- .clk (<%= register_block.clock %>),
8
- .rst_n (<%= register_block.reset %>),
9
- .i_valid (<%= register_block.host_if.command_valid %>),
10
- .i_select (<%= register_block.register_select[index] %>),
11
- .i_write (<%= register_block.host_if.write %>),
12
- .i_read (<%= register_block.host_if.read %>),
13
- .i_address (<%= register_block.host_if.address %>),
14
- .i_strobe (<%= register_block.host_if.strobe %>),
15
- .i_write_data (<%= register_block.host_if.write_data %>),
16
- .o_ready (<%= register_block.external_register_ready[external_index] %>),
17
- .o_read_data (<%= register_block.register_read_data[index] %>),
18
- .o_status (<%= register_block.external_register_status[external_index] %>),
19
- .o_valid (<%= valid %>),
20
- .o_write (<%= write %>),
21
- .o_read (<%= read %>),
22
- .o_address (<%= address %>),
23
- .o_strobe (<%= strobe %>),
24
- .o_write_data (<%= write_data %>),
25
- .i_ready (<%= ready %>),
26
- .i_read_data (<%= read_data %>),
27
- .i_status (<%= status %>)
28
- );
@@ -1,52 +0,0 @@
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, :index, :external_index
8
- ] => :register
9
-
10
- available? { register.type?(: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
-
44
- def external_index
45
- external_registers.index(&register.method(:equal?))
46
- end
47
-
48
- def external_registers
49
- register_block.registers.select { |r| r.type?(:external) }
50
- end
51
- end
52
- end
@@ -1,61 +0,0 @@
1
- simple_item :register, :read_data do
2
- rtl do
3
- available? { !register.type?(:external) }
4
-
5
- generate_code :module_item do |buffer|
6
- buffer << assign(register_read_data, read_data) << nl
7
- end
8
-
9
- define_struct :read_data_entry, [:lsb, :msb, :value, :dummy] do
10
- def initialize(args)
11
- self.lsb = args[:lsb]
12
- self.msb = args[:msb]
13
- self.value = args[:value]
14
- self.dummy = args[:dummy] || false
15
- end
16
- end
17
-
18
- delegate [:data_width] => :configuration
19
- delegate [:loop_variables] => :register
20
-
21
- def register_read_data
22
- register_block.register_read_data[register.index]
23
- end
24
-
25
- def read_data
26
- if register.readable?
27
- concat(read_data_expressions)
28
- else
29
- hex(0, configuration.data_width)
30
- end
31
- end
32
-
33
- def read_data_expressions
34
- read_data_entries.each_cons(2).with_object([]) do |entries, expressions|
35
- padding_bits = entries[0].lsb - entries[1].msb - 1
36
- expressions << hex(0, padding_bits) if padding_bits > 0
37
- expressions << entries[1].value unless entries[1].dummy
38
- end
39
- end
40
-
41
- def read_data_entries
42
- [].tap do |entries|
43
- entries << read_data_entry.new(lsb: data_width, dummy: true)
44
- entries.concat(readable_field_entries)
45
- entries << read_data_entry.new(msb: -1, dummy: true)
46
- end
47
- end
48
-
49
- def readable_field_entries
50
- readable_fields.map do |field|
51
- read_data_entry.new(
52
- lsb: field.lsb, msb: field.msb, value: field.value[loop_variables]
53
- )
54
- end
55
- end
56
-
57
- def readable_fields
58
- register.bit_fields.select(&:readable?).sort_by(&:msb).reverse
59
- end
60
- end
61
- end
@@ -1,18 +0,0 @@
1
- rggen_response_mux #(
2
- .DATA_WIDTH (<%= configuration.data_width %>),
3
- .TOTAL_REGISTERS (<%= total_registers %>),
4
- .TOTAL_EXTERNAL_REGISTERS (<%= total_external_registers %>)
5
- ) u_response_mux (
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 %>)
18
- );
@@ -1,47 +0,0 @@
1
- simple_item :register_block, :response_mux do
2
- rtl do
3
- build do
4
- logic :register_select , width: 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
19
- end
20
-
21
- generate_code_from_template :module_item
22
-
23
- def total_registers
24
- register_block.registers.sum(0, &:count)
25
- end
26
-
27
- def external_registers?
28
- register_block.registers.any? { |r| r.type?(:external) }
29
- end
30
-
31
- def total_external_registers
32
- register_block.registers.count { |r| r.type?(: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))
45
- end
46
- end
47
- end
@@ -1,20 +0,0 @@
1
- define_simple_item :register_block, :top_module do
2
- rtl do
3
- write_file '<%= register_block.name %>.sv' do |f|
4
- f.body { source_file_body }
5
- end
6
-
7
- def source_file_body
8
- module_definition register_block.name do |m|
9
- m.parameters register_block.parameter_declarations
10
- m.ports register_block.port_declarations
11
- m.signals register_block.signal_declarations
12
- m.body { |code| module_body(code) }
13
- end
14
- end
15
-
16
- def module_body(code)
17
- register_block.generate_code(:module_item, :top_down, code)
18
- end
19
- end
20
- end
@@ -1,15 +0,0 @@
1
- function automatic logic is_write_access(
2
- input command_valid,
3
- input select,
4
- input write
5
- );
6
- return (command_valid && select && write) ? 1'b1 : 1'b0;
7
- endfunction
8
-
9
- function automatic logic [WIDTH-1:0] get_write_data(
10
- input [WIDTH-1:0] current_data,
11
- input [WIDTH-1:0] write_data,
12
- input [WIDTH-1:0] write_mask
13
- );
14
- return (current_data & (~write_mask)) | (write_data & write_mask);
15
- endfunction
@@ -1,8 +0,0 @@
1
- module rggen_bit_field_ro #(
2
- parameter WIDTH = 1
3
- )(
4
- input [WIDTH-1:0] i_value,
5
- output [WIDTH-1:0] o_value
6
- );
7
- assign o_value = i_value;
8
- endmodule
@@ -1,27 +0,0 @@
1
- module rggen_bit_field_rw #(
2
- parameter WIDTH = 1,
3
- parameter INITIAL_VALUE = 0
4
- )(
5
- input clk,
6
- input rst_n,
7
- input i_command_valid,
8
- input i_select,
9
- input i_write,
10
- input [WIDTH-1:0] i_write_data,
11
- input [WIDTH-1:0] i_write_mask,
12
- output [WIDTH-1:0] o_value
13
- );
14
- `include "rggen_bit_field_common.svh"
15
-
16
- logic [WIDTH-1:0] value;
17
-
18
- assign o_value = value;
19
- always_ff @(posedge clk or negedge rst_n) begin
20
- if (!rst_n) begin
21
- value <= INITIAL_VALUE;
22
- end
23
- else if (is_write_access(i_command_valid, i_select, i_write)) begin
24
- value <= get_write_data(value, i_write_data, i_write_mask);
25
- end
26
- end
27
- endmodule
@@ -1,49 +0,0 @@
1
- module rggen_bit_field_rwl_rwe #(
2
- parameter LOCK_MODE = 1,
3
- parameter WIDTH = 1,
4
- parameter INITIAL_VALUE = 0
5
- )(
6
- input clk,
7
- input rst_n,
8
- input i_lock_or_enable,
9
- input i_command_valid,
10
- input i_select,
11
- input i_write,
12
- input [WIDTH-1:0] i_write_data,
13
- input [WIDTH-1:0] i_write_mask,
14
- output [WIDTH-1:0] o_value
15
- );
16
- `include "rggen_bit_field_common.svh"
17
-
18
- logic [WIDTH-1:0] value;
19
-
20
- assign o_value = value;
21
- always_ff @(posedge clk or negedge rst_n) begin
22
- if (!rst_n) begin
23
- value <= INITIAL_VALUE;
24
- end
25
- else if (
26
- can_write(i_lock_or_enable, i_command_valid, i_select, i_write)
27
- ) begin
28
- value <= get_write_data(value, i_write_data, i_write_mask);
29
- end
30
- end
31
-
32
- function automatic logic can_write(
33
- input lock_or_enable,
34
- input command_valid,
35
- input select,
36
- input write
37
- );
38
- if (LOCK_MODE) begin
39
- return (
40
- (!lock_or_enable) && is_write_access(command_valid, select, write)
41
- ) ? 1'b1 : 1'b0;
42
- end
43
- else begin
44
- return (
45
- lock_or_enable && is_write_access(command_valid, select, write)
46
- ) ? 1'b1 : 1'b0;
47
- end
48
- endfunction
49
- endmodule
@@ -1,67 +0,0 @@
1
- module rggen_bit_field_w01s_w01c #(
2
- parameter WIDTH = 1,
3
- parameter INITIAL_VALUE = 0,
4
- parameter SET_MODE = 1,
5
- parameter SET_CLEAR_VALUE = 0
6
- )(
7
- input clk,
8
- input rst_n,
9
- input [WIDTH-1:0] i_set_or_clear,
10
- input i_command_valid,
11
- input i_select,
12
- input i_write,
13
- input [WIDTH-1:0] i_write_data,
14
- input [WIDTH-1:0] i_write_mask,
15
- output [WIDTH-1:0] o_value
16
- );
17
- `include "rggen_bit_field_common.svh"
18
-
19
- logic [WIDTH-1:0] value;
20
-
21
- assign o_value = value;
22
- always_ff @(posedge clk or negedge rst_n) begin
23
- if (!rst_n) begin
24
- value <= INITIAL_VALUE;
25
- end
26
- else begin
27
- value <= get_next_value(
28
- i_set_or_clear,
29
- value,
30
- i_command_valid,
31
- i_select,
32
- i_write,
33
- i_write_mask,
34
- i_write_data
35
- );
36
- end
37
- end
38
-
39
- function automatic logic [WIDTH-1:0] get_next_value(
40
- input [WIDTH-1:0] set_or_clear,
41
- input [WIDTH-1:0] current_value,
42
- input command_valid,
43
- input select,
44
- input write,
45
- input [WIDTH-1:0] write_mask,
46
- input [WIDTH-1:0] write_data
47
- );
48
- logic [WIDTH-1:0] control_value;
49
- logic [WIDTH-1:0] set;
50
- logic [WIDTH-1:0] clear;
51
- if (is_write_access(command_valid, select, write)) begin
52
- control_value = write_mask & ((SET_CLEAR_VALUE) ? write_data : ~write_data);
53
- end
54
- else begin
55
- control_value = '0;
56
- end
57
- if (SET_MODE) begin
58
- set = control_value;
59
- clear = set_or_clear;
60
- end
61
- else begin
62
- set = set_or_clear;
63
- clear = control_value;
64
- end
65
- return set | (current_value & (~clear));
66
- endfunction
67
- endmodule