rggen-verilog 0.1.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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/CODE_OF_CONDUCT.md +74 -0
  3. data/LICENSE +21 -0
  4. data/README.md +74 -0
  5. data/lib/rggen/verilog.rb +64 -0
  6. data/lib/rggen/verilog/bit_field/type.rb +85 -0
  7. data/lib/rggen/verilog/bit_field/type/rc_w0c_w1c_wc_woc.erb +21 -0
  8. data/lib/rggen/verilog/bit_field/type/rc_w0c_w1c_wc_woc.rb +40 -0
  9. data/lib/rggen/verilog/bit_field/type/reserved.erb +10 -0
  10. data/lib/rggen/verilog/bit_field/type/reserved.rb +7 -0
  11. data/lib/rggen/verilog/bit_field/type/ro.erb +11 -0
  12. data/lib/rggen/verilog/bit_field/type/ro.rb +21 -0
  13. data/lib/rggen/verilog/bit_field/type/rof.erb +11 -0
  14. data/lib/rggen/verilog/bit_field/type/rof.rb +7 -0
  15. data/lib/rggen/verilog/bit_field/type/rs_w0s_w1s_ws_wos.erb +19 -0
  16. data/lib/rggen/verilog/bit_field/type/rs_w0s_w1s_ws_wos.rb +31 -0
  17. data/lib/rggen/verilog/bit_field/type/rw_w1_wo_wo1.erb +16 -0
  18. data/lib/rggen/verilog/bit_field/type/rw_w1_wo_wo1.rb +23 -0
  19. data/lib/rggen/verilog/bit_field/type/rwc.erb +15 -0
  20. data/lib/rggen/verilog/bit_field/type/rwc.rb +24 -0
  21. data/lib/rggen/verilog/bit_field/type/rwe.erb +15 -0
  22. data/lib/rggen/verilog/bit_field/type/rwe.rb +24 -0
  23. data/lib/rggen/verilog/bit_field/type/rwl.erb +15 -0
  24. data/lib/rggen/verilog/bit_field/type/rwl.rb +24 -0
  25. data/lib/rggen/verilog/bit_field/type/rws.erb +16 -0
  26. data/lib/rggen/verilog/bit_field/type/rws.rb +27 -0
  27. data/lib/rggen/verilog/bit_field/type/w0crs_w1crs_wcrs.erb +15 -0
  28. data/lib/rggen/verilog/bit_field/type/w0crs_w1crs_wcrs.rb +20 -0
  29. data/lib/rggen/verilog/bit_field/type/w0src_w1src_wsrc.erb +15 -0
  30. data/lib/rggen/verilog/bit_field/type/w0src_w1src_wsrc.rb +20 -0
  31. data/lib/rggen/verilog/bit_field/type/w0t_w1t.erb +15 -0
  32. data/lib/rggen/verilog/bit_field/type/w0t_w1t.rb +19 -0
  33. data/lib/rggen/verilog/bit_field/type/w0trg_w1trg.erb +14 -0
  34. data/lib/rggen/verilog/bit_field/type/w0trg_w1trg.rb +19 -0
  35. data/lib/rggen/verilog/bit_field/type/wrc_wrs.erb +14 -0
  36. data/lib/rggen/verilog/bit_field/type/wrc_wrs.rb +13 -0
  37. data/lib/rggen/verilog/bit_field/verilog_top.rb +89 -0
  38. data/lib/rggen/verilog/component.rb +7 -0
  39. data/lib/rggen/verilog/factories.rb +11 -0
  40. data/lib/rggen/verilog/feature.rb +35 -0
  41. data/lib/rggen/verilog/register/type.rb +101 -0
  42. data/lib/rggen/verilog/register/type/default.erb +29 -0
  43. data/lib/rggen/verilog/register/type/external.erb +27 -0
  44. data/lib/rggen/verilog/register/type/external.rb +45 -0
  45. data/lib/rggen/verilog/register/type/indirect.erb +31 -0
  46. data/lib/rggen/verilog/register/type/indirect.rb +18 -0
  47. data/lib/rggen/verilog/register/verilog_top.rb +58 -0
  48. data/lib/rggen/verilog/register_block/protocol.rb +51 -0
  49. data/lib/rggen/verilog/register_block/protocol/apb.erb +33 -0
  50. data/lib/rggen/verilog/register_block/protocol/apb.rb +40 -0
  51. data/lib/rggen/verilog/register_block/protocol/axi4lite.erb +48 -0
  52. data/lib/rggen/verilog/register_block/protocol/axi4lite.rb +92 -0
  53. data/lib/rggen/verilog/register_block/verilog_macros.erb +4 -0
  54. data/lib/rggen/verilog/register_block/verilog_top.rb +104 -0
  55. data/lib/rggen/verilog/register_file/verilog_top.rb +30 -0
  56. data/lib/rggen/verilog/setup.rb +11 -0
  57. data/lib/rggen/verilog/utility.rb +13 -0
  58. data/lib/rggen/verilog/utility/local_scope.rb +15 -0
  59. data/lib/rggen/verilog/version.rb +7 -0
  60. metadata +133 -0
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:wrc, :wrs]) do
4
+ verilog do
5
+ build do
6
+ output :value_out, {
7
+ name: "o_#{full_name}", width: width, array_size: array_size
8
+ }
9
+ end
10
+
11
+ main_code :bit_field, from_template: true
12
+ end
13
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_simple_feature(:bit_field, :verilog_top) do
4
+ verilog do
5
+ include RgGen::SystemVerilog::RTL::BitFieldIndex
6
+
7
+ export :initial_value
8
+ export :value
9
+
10
+ build do
11
+ if parameterized_initial_value?
12
+ parameter :initial_value, {
13
+ name: initial_value_name, width: bit_field.width,
14
+ array_size: initial_value_array_size, default: initial_value_rhs
15
+ }
16
+ else
17
+ define_accessor_for_initial_value
18
+ end
19
+ end
20
+
21
+ main_code :register do
22
+ local_scope("g_#{bit_field.name}") do |scope|
23
+ scope.loop_size loop_size
24
+ scope.body(&method(:body_code))
25
+ end
26
+ end
27
+
28
+ def value(offsets = nil, width = nil)
29
+ value_lsb = bit_field.lsb(offsets&.last || local_index)
30
+ value_width = width || bit_field.width
31
+ register_value(offsets&.slice(0..-2), value_lsb, value_width)
32
+ end
33
+
34
+ private
35
+
36
+ def register_value(offsets, lsb, width)
37
+ index = register.index(offsets || register.local_indices)
38
+ register_block.register_value[[index], lsb, width]
39
+ end
40
+
41
+ def parameterized_initial_value?
42
+ bit_field.initial_value? && !bit_field.fixed_initial_value?
43
+ end
44
+
45
+ def define_accessor_for_initial_value
46
+ define_singleton_method(:initial_value) do
47
+ bit_field.initial_value? && initial_value_rhs || nil
48
+ end
49
+ end
50
+
51
+ def initial_value_name
52
+ "#{bit_field.full_name('_')}_initial_value".upcase
53
+ end
54
+
55
+ def initial_value_array_size
56
+ bit_field.initial_value_array? && [bit_field.sequence_size] || nil
57
+ end
58
+
59
+ def initial_value_rhs
60
+ if !bit_field.initial_value_array?
61
+ sized_initial_value
62
+ elsif bit_field.fixed_initial_value?
63
+ concat(sized_initial_values)
64
+ else
65
+ repeat(bit_field.sequence_size, sized_initial_value)
66
+ end
67
+ end
68
+
69
+ def sized_initial_value
70
+ hex(bit_field.register_map.initial_value, bit_field.width)
71
+ end
72
+
73
+ def sized_initial_values
74
+ bit_field
75
+ .initial_values
76
+ .reverse
77
+ .map { |v| hex(v, bit_field.width) }
78
+ end
79
+
80
+ def loop_size
81
+ loop_variable = local_index
82
+ loop_variable && { loop_variable => bit_field.sequence_size }
83
+ end
84
+
85
+ def body_code(code)
86
+ bit_field.generate_code(code, :bit_field, :top_down)
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Verilog
5
+ Component = SystemVerilog::Common::Component
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Verilog
5
+ class ComponentFactory < Core::OutputBase::ComponentFactory
6
+ end
7
+
8
+ class FeatureFactory < Core::OutputBase::FeatureFactory
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Verilog
5
+ class Feature < SystemVerilog::RTL::Feature
6
+ include Utility
7
+
8
+ private
9
+
10
+ def create_variable(data_type, attributes, &block)
11
+ attributes = attributes.merge(array_format: :serialized)
12
+ super
13
+ end
14
+
15
+ def create_argument(direction, attributes, &block)
16
+ attributes =
17
+ attributes
18
+ .reject { |key, _| key == :data_type }
19
+ .merge(array_format: :serialized)
20
+ super
21
+ end
22
+
23
+ def create_parameter(parameter_type, attributes, &block)
24
+ attributes = attributes.merge(array_format: :serialized)
25
+ super
26
+ end
27
+
28
+ define_entity :wire, :create_variable, :variable, -> { component }
29
+
30
+ undef_method :interface
31
+ undef_method :interface_port
32
+ undef_method :localparam
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_feature(:register, :type) do
4
+ verilog do
5
+ base_feature do
6
+ include RgGen::SystemVerilog::RTL::RegisterType
7
+
8
+ private
9
+
10
+ def clock
11
+ register_block.clock
12
+ end
13
+
14
+ def reset
15
+ register_block.reset
16
+ end
17
+
18
+ def register_valid
19
+ register_block.register_valid
20
+ end
21
+
22
+ def register_access
23
+ register_block.register_access
24
+ end
25
+
26
+ def register_address
27
+ register_block.register_address
28
+ end
29
+
30
+ def register_write_data
31
+ register_block.register_write_data
32
+ end
33
+
34
+ def register_strobe
35
+ register_block.register_strobe
36
+ end
37
+
38
+ def register_active
39
+ register_block.register_active[[register.index]]
40
+ end
41
+
42
+ def register_ready
43
+ register_block.register_ready[[register.index]]
44
+ end
45
+
46
+ def register_status
47
+ register_block.register_status[[register.index]]
48
+ end
49
+
50
+ def register_read_data
51
+ register_block.register_read_data[[register.index]]
52
+ end
53
+
54
+ def register_value
55
+ register_block.register_value[[register.index], 0, width]
56
+ end
57
+
58
+ def bit_field_valid
59
+ register.bit_field_valid
60
+ end
61
+
62
+ def bit_field_read_mask
63
+ register.bit_field_read_mask
64
+ end
65
+
66
+ def bit_field_write_mask
67
+ register.bit_field_write_mask
68
+ end
69
+
70
+ def bit_field_write_data
71
+ register.bit_field_write_data
72
+ end
73
+
74
+ def bit_field_read_data
75
+ register.bit_field_read_data
76
+ end
77
+
78
+ def bit_field_value
79
+ register.bit_field_value
80
+ end
81
+ end
82
+
83
+ default_feature do
84
+ main_code :register, from_template: File.join(__dir__, 'type', 'default.erb')
85
+ end
86
+
87
+ factory do
88
+ def target_feature_key(_configuration, register)
89
+ type = register.type
90
+ valid_type?(type) && type ||
91
+ (error "code generator for #{type} register type is not implemented")
92
+ end
93
+
94
+ private
95
+
96
+ def valid_type?(type)
97
+ target_features.key?(type) || type == :default
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,29 @@
1
+ rggen_default_register #(
2
+ .READABLE (<%= readable %>),
3
+ .WRITABLE (<%= writable %>),
4
+ .ADDRESS_WIDTH (<%= address_width %>),
5
+ .OFFSET_ADDRESS (<%= offset_address %>),
6
+ .BUS_WIDTH (<%= bus_width %>),
7
+ .DATA_WIDTH (<%= width %>),
8
+ .VALID_BITS (<%= valid_bits %>),
9
+ .REGISTER_INDEX (<%= register_index %>)
10
+ ) u_register (
11
+ .i_clk (<%= clock %>),
12
+ .i_rst_n (<%= reset %>),
13
+ .i_register_valid (<%= register_valid %>),
14
+ .i_register_access (<%= register_access %>),
15
+ .i_register_address (<%= register_address %>),
16
+ .i_register_write_data (<%= register_write_data %>),
17
+ .i_register_strobe (<%= register_strobe %>),
18
+ .o_register_active (<%= register_active %>),
19
+ .o_register_ready (<%= register_ready %>),
20
+ .o_register_status (<%= register_status %>),
21
+ .o_register_read_data (<%= register_read_data %>),
22
+ .o_register_value (<%= register_value %>),
23
+ .o_bit_field_valid (<%= bit_field_valid %>),
24
+ .o_bit_field_read_mask (<%= bit_field_read_mask %>),
25
+ .o_bit_field_write_mask (<%= bit_field_write_mask %>),
26
+ .o_bit_field_write_data (<%= bit_field_write_data %>),
27
+ .i_bit_field_read_data (<%= bit_field_read_data %>),
28
+ .i_bit_field_value (<%= bit_field_value %>)
29
+ );
@@ -0,0 +1,27 @@
1
+ rggen_external_register #(
2
+ .ADDRESS_WIDTH (<%= address_width %>),
3
+ .BUS_WIDTH (<%= bus_width %>),
4
+ .START_ADDRESS (<%= start_address %>),
5
+ .END_ADDRESS (<%= end_address %>)
6
+ ) u_register (
7
+ .i_clk (<%= clock %>),
8
+ .i_rst_n (<%= reset %>),
9
+ .i_register_valid (<%= register_valid %>),
10
+ .i_register_access (<%= register_access %>),
11
+ .i_register_address (<%= register_address %>),
12
+ .i_register_write_data (<%= register_write_data %>),
13
+ .i_register_strobe (<%= register_strobe %>),
14
+ .o_register_active (<%= register_active %>),
15
+ .o_register_ready (<%= register_ready %>),
16
+ .o_register_status (<%= register_status %>),
17
+ .o_register_read_data (<%= register_read_data %>),
18
+ .o_register_value (<%= register_value %>),
19
+ .o_external_valid (<%= external_valid %>),
20
+ .o_external_access (<%= external_access %>),
21
+ .o_external_address (<%= external_address %>),
22
+ .o_external_data (<%= external_write_data %>),
23
+ .o_external_strobe (<%= external_strobe %>),
24
+ .i_external_ready (<%= external_ready %>),
25
+ .i_external_status (<%= external_status %>),
26
+ .i_external_data (<%= external_read_data %>)
27
+ );
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:register, :type, :external) do
4
+ verilog do
5
+ build do
6
+ output :external_valid, {
7
+ name: "o_#{register.name}_valid", width: 1
8
+ }
9
+ output :external_access, {
10
+ name: "o_#{register.name}_access", width: 2
11
+ }
12
+ output :external_address, {
13
+ name: "o_#{register.name}_address", width: address_width
14
+ }
15
+ output :external_write_data, {
16
+ name: "o_#{register.name}_data", width: bus_width
17
+ }
18
+ output :external_strobe, {
19
+ name: "o_#{register.name}_strobe", width: bus_width / 8
20
+ }
21
+ input :external_ready, {
22
+ name: "i_#{register.name}_ready", width: 1
23
+ }
24
+ input :external_status, {
25
+ name: "i_#{register.name}_status", width: 2
26
+ }
27
+ input :external_read_data, {
28
+ name: "i_#{register.name}_data", width: bus_width
29
+ }
30
+ end
31
+
32
+ main_code :register, from_template: true
33
+
34
+ private
35
+
36
+ def start_address
37
+ hex(register.offset_address, address_width)
38
+ end
39
+
40
+ def end_address
41
+ address = register.offset_address + register.byte_size - 1
42
+ hex(address, address_width)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,31 @@
1
+ rggen_indirect_register #(
2
+ .READABLE (<%= readable %>),
3
+ .WRITABLE (<%= writable %>),
4
+ .ADDRESS_WIDTH (<%= address_width %>),
5
+ .OFFSET_ADDRESS (<%= offset_address %>),
6
+ .BUS_WIDTH (<%= bus_width %>),
7
+ .DATA_WIDTH (<%= width %>),
8
+ .VALID_BITS (<%= valid_bits %>),
9
+ .INDIRECT_INDEX_WIDTH (<%= index_width %>),
10
+ .INDIRECT_INDEX_VALUE (<%= concat(index_values) %>)
11
+ ) u_register (
12
+ .i_clk (<%= clock %>),
13
+ .i_rst_n (<%= reset %>),
14
+ .i_register_valid (<%= register_valid %>),
15
+ .i_register_access (<%= register_access %>),
16
+ .i_register_address (<%= register_address %>),
17
+ .i_register_write_data (<%= register_write_data %>),
18
+ .i_register_strobe (<%= register_strobe %>),
19
+ .o_register_active (<%= register_active %>),
20
+ .o_register_ready (<%= register_ready %>),
21
+ .o_register_status (<%= register_status %>),
22
+ .o_register_read_data (<%= register_read_data %>),
23
+ .o_register_value (<%= register_value %>),
24
+ .i_indirect_index (<%= indirect_index %>),
25
+ .o_bit_field_valid (<%= bit_field_valid %>),
26
+ .o_bit_field_read_mask (<%= bit_field_read_mask %>),
27
+ .o_bit_field_write_mask (<%= bit_field_write_mask %>),
28
+ .o_bit_field_write_data (<%= bit_field_write_data %>),
29
+ .i_bit_field_read_data (<%= bit_field_read_data %>),
30
+ .i_bit_field_value (<%= bit_field_value %>)
31
+ );
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:register, :type, :indirect) do
4
+ verilog do
5
+ include RgGen::SystemVerilog::RTL::IndirectIndex
6
+
7
+ build do
8
+ wire :indirect_index, {
9
+ name: 'w_indirect_index', width: index_width
10
+ }
11
+ end
12
+
13
+ main_code :register do |code|
14
+ code << indirect_index_assignment << nl
15
+ code << process_template
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_simple_feature(:register, :verilog_top) do
4
+ verilog do
5
+ include RgGen::SystemVerilog::RTL::RegisterIndex
6
+
7
+ build do
8
+ unless register.bit_fields.empty?
9
+ wire :bit_field_valid, {
10
+ name: 'w_bit_field_valid', width: 1
11
+ }
12
+ wire :bit_field_read_mask, {
13
+ name: 'w_bit_field_read_mask', width: register.width
14
+ }
15
+ wire :bit_field_write_mask, {
16
+ name: 'w_bit_field_write_mask', width: register.width
17
+ }
18
+ wire :bit_field_write_data, {
19
+ name: 'w_bit_field_write_data', width: register.width
20
+ }
21
+ wire :bit_field_read_data, {
22
+ name: 'w_bit_field_read_data', width: register.width
23
+ }
24
+ wire :bit_field_value, {
25
+ name: 'w_bit_field_value', width: register.width
26
+ }
27
+ end
28
+ end
29
+
30
+ main_code :register_file do
31
+ local_scope("g_#{register.name}") do |scope|
32
+ scope.top_scope top_scope?
33
+ scope.loop_size loop_size
34
+ scope.variables variables
35
+ scope.body(&method(:body_code))
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def top_scope?
42
+ register_file.nil?
43
+ end
44
+
45
+ def loop_size
46
+ (register.array? || nil) &&
47
+ local_loop_variables.zip(register.array_size).to_h
48
+ end
49
+
50
+ def variables
51
+ register.declarations[:variable]
52
+ end
53
+
54
+ def body_code(code)
55
+ register.generate_code(code, :register, :top_down)
56
+ end
57
+ end
58
+ end