rggen-systemverilog 0.24.0 → 0.26.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +1 -1
  4. data/lib/rggen/systemverilog/common/factories.rb +1 -1
  5. data/lib/rggen/systemverilog/common/feature.rb +1 -1
  6. data/lib/rggen/systemverilog/common/utility/class_definition.rb +12 -4
  7. data/lib/rggen/systemverilog/common/utility/data_object.rb +1 -2
  8. data/lib/rggen/systemverilog/common/utility/function_definition.rb +16 -4
  9. data/lib/rggen/systemverilog/common/utility/identifier.rb +16 -11
  10. data/lib/rggen/systemverilog/common/utility/local_scope.rb +9 -7
  11. data/lib/rggen/systemverilog/common/utility/module_definition.rb +12 -4
  12. data/lib/rggen/systemverilog/common/utility/package_definition.rb +4 -4
  13. data/lib/rggen/systemverilog/common/utility.rb +1 -1
  14. data/lib/rggen/systemverilog/common.rb +0 -2
  15. data/lib/rggen/systemverilog/ral/bit_field/type/rof.rb +5 -0
  16. data/lib/rggen/systemverilog/ral/bit_field/type/rotrg_rwtrg_wotrg.rb +9 -0
  17. data/lib/rggen/systemverilog/ral/bit_field/type/rowo_rowotrg.rb +8 -0
  18. data/lib/rggen/systemverilog/ral/bit_field/type.rb +20 -7
  19. data/lib/rggen/systemverilog/ral/register_common.rb +1 -1
  20. data/lib/rggen/systemverilog/ral.rb +3 -1
  21. data/lib/rggen/systemverilog/rtl/bit_field/sv_rtl_top.rb +1 -1
  22. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.erb +2 -0
  23. data/lib/rggen/systemverilog/rtl/bit_field/type/rc_w0c_w1c_wc_woc.rb +3 -3
  24. data/lib/rggen/systemverilog/rtl/bit_field/type/{ro.erb → ro_rotrg.erb} +8 -4
  25. data/lib/rggen/systemverilog/rtl/bit_field/type/ro_rotrg.rb +40 -0
  26. data/lib/rggen/systemverilog/rtl/bit_field/type/rof.erb +5 -2
  27. data/lib/rggen/systemverilog/rtl/bit_field/type/rowo_rowotrg.erb +21 -0
  28. data/lib/rggen/systemverilog/rtl/bit_field/type/rowo_rowotrg.rb +52 -0
  29. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.erb +2 -0
  30. data/lib/rggen/systemverilog/rtl/bit_field/type/rs_w0s_w1s_ws_wos.rb +2 -2
  31. data/lib/rggen/systemverilog/rtl/bit_field/type/{rw_w1_wo_wo1.erb → rw_rwtrg_w1.erb} +4 -2
  32. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_rwtrg_w1.rb +46 -0
  33. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.erb +2 -0
  34. data/lib/rggen/systemverilog/rtl/bit_field/type/rwc.rb +2 -2
  35. data/lib/rggen/systemverilog/rtl/bit_field/type/{rwl.erb → rwe_rwl.erb} +4 -2
  36. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe_rwl.rb +34 -0
  37. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.erb +2 -0
  38. data/lib/rggen/systemverilog/rtl/bit_field/type/rws.rb +3 -3
  39. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.erb +2 -0
  40. data/lib/rggen/systemverilog/rtl/bit_field/type/w0crs_w0src_w1crs_w1src_wcrs_wsrc.rb +1 -1
  41. data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.erb +2 -0
  42. data/lib/rggen/systemverilog/rtl/bit_field/type/w0t_w1t.rb +1 -1
  43. data/lib/rggen/systemverilog/rtl/bit_field/type/w0trg_w1trg.rb +1 -1
  44. data/lib/rggen/systemverilog/rtl/bit_field/type/{rwe.erb → wo_wo1_wotrg.erb} +8 -4
  45. data/lib/rggen/systemverilog/rtl/bit_field/type/wo_wo1_wotrg.rb +38 -0
  46. data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.erb +2 -0
  47. data/lib/rggen/systemverilog/rtl/bit_field/type/wrc_wrs.rb +1 -1
  48. data/lib/rggen/systemverilog/rtl/bit_field_index.rb +1 -2
  49. data/lib/rggen/systemverilog/rtl/feature.rb +8 -6
  50. data/lib/rggen/systemverilog/rtl/partial_sum.rb +5 -6
  51. data/lib/rggen/systemverilog/rtl/register/type/external.rb +5 -62
  52. data/lib/rggen/systemverilog/rtl/register_block/protocol/apb.rb +3 -60
  53. data/lib/rggen/systemverilog/rtl/register_block/protocol/axi4lite.rb +4 -118
  54. data/lib/rggen/systemverilog/rtl/register_block/protocol/wishbone.erb +17 -0
  55. data/lib/rggen/systemverilog/rtl/register_block/protocol/wishbone.rb +26 -0
  56. data/lib/rggen/systemverilog/rtl/register_block/sv_rtl_top.rb +2 -6
  57. data/lib/rggen/systemverilog/rtl/register_index.rb +13 -11
  58. data/lib/rggen/systemverilog/rtl/register_type.rb +4 -3
  59. data/lib/rggen/systemverilog/rtl/setup.rb +2 -4
  60. data/lib/rggen/systemverilog/rtl.rb +6 -6
  61. data/lib/rggen/systemverilog/version.rb +1 -1
  62. metadata +21 -31
  63. data/lib/rggen/systemverilog/ral/bit_field/type/reserved_rof.rb +0 -5
  64. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.erb +0 -18
  65. data/lib/rggen/systemverilog/rtl/bit_field/type/reserved.rb +0 -7
  66. data/lib/rggen/systemverilog/rtl/bit_field/type/ro.rb +0 -22
  67. data/lib/rggen/systemverilog/rtl/bit_field/type/rw_w1_wo_wo1.rb +0 -24
  68. data/lib/rggen/systemverilog/rtl/bit_field/type/rwe.rb +0 -26
  69. data/lib/rggen/systemverilog/rtl/bit_field/type/rwl.rb +0 -26
  70. data/lib/rggen/systemverilog/rtl/global/fold_sv_interface_port.rb +0 -28
@@ -1,12 +1,14 @@
1
1
  rggen_bit_field #(
2
2
  .WIDTH (<%= width %>),
3
3
  .INITIAL_VALUE (<%= initial_value %>),
4
- .SW_READ_ACTION (<%= read_action %>),
5
- .SW_WRITE_ONCE (<%= write_once %>)
4
+ .SW_WRITE_ONCE (<%= write_once %>),
5
+ .TRIGGER (<%= trigger %>)
6
6
  ) u_bit_field (
7
7
  .i_clk (<%= clock %>),
8
8
  .i_rst_n (<%= reset %>),
9
9
  .bit_field_if (<%= bit_field_if %>),
10
+ .o_write_trigger (<%= write_trigger_signal %>),
11
+ .o_read_trigger (<%= read_trigger_signal %>),
10
12
  .i_sw_write_enable ('1),
11
13
  .i_hw_write_enable ('0),
12
14
  .i_hw_write_data ('0),
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:rw, :rwtrg, :w1]) do
4
+ sv_rtl do
5
+ build do
6
+ output :value_out, {
7
+ name: "o_#{full_name}", width: width,
8
+ array_size: array_size, array_format: array_port_format
9
+ }
10
+ if rwtrg?
11
+ output :write_trigger, {
12
+ name: "o_#{full_name}_write_trigger", width: 1,
13
+ array_size: array_size, array_format: array_port_format
14
+ }
15
+ output :read_trigger, {
16
+ name: "o_#{full_name}_read_trigger", width: 1,
17
+ array_size: array_size, array_format: array_port_format
18
+ }
19
+ end
20
+ end
21
+
22
+ main_code :bit_field, from_template: true
23
+
24
+ private
25
+
26
+ def rwtrg?
27
+ bit_field.type == :rwtrg
28
+ end
29
+
30
+ def trigger
31
+ rwtrg? && 1 || 0
32
+ end
33
+
34
+ def write_trigger_signal
35
+ rwtrg? && write_trigger[loop_variables] || nil
36
+ end
37
+
38
+ def read_trigger_signal
39
+ rwtrg? && read_trigger[loop_variables] || nil
40
+ end
41
+
42
+ def write_once
43
+ bit_field.type == :w1 && 1 || 0
44
+ end
45
+ end
46
+ end
@@ -6,6 +6,8 @@ rggen_bit_field #(
6
6
  .i_clk (<%= clock %>),
7
7
  .i_rst_n (<%= reset %>),
8
8
  .bit_field_if (<%= bit_field_if %>),
9
+ .o_write_trigger (),
10
+ .o_read_trigger (),
9
11
  .i_sw_write_enable ('1),
10
12
  .i_hw_write_enable ('0),
11
13
  .i_hw_write_data ('0),
@@ -5,12 +5,12 @@ RgGen.define_list_item_feature(:bit_field, :type, :rwc) do
5
5
  build do
6
6
  unless bit_field.reference?
7
7
  input :clear, {
8
- name: "i_#{full_name}_clear", data_type: :logic, width: 1,
8
+ name: "i_#{full_name}_clear", width: 1,
9
9
  array_size: array_size, array_format: array_port_format
10
10
  }
11
11
  end
12
12
  output :value_out, {
13
- name: "o_#{full_name}", data_type: :logic, width: width,
13
+ name: "o_#{full_name}", width: width,
14
14
  array_size: array_size, array_format: array_port_format
15
15
  }
16
16
  end
@@ -1,12 +1,14 @@
1
1
  rggen_bit_field #(
2
2
  .WIDTH (<%= width %>),
3
3
  .INITIAL_VALUE (<%= initial_value %>),
4
- .SW_WRITE_ENABLE_POLARITY (RGGEN_ACTIVE_LOW)
4
+ .SW_WRITE_ENABLE_POLARITY (<%= polarity %>)
5
5
  ) u_bit_field (
6
6
  .i_clk (<%= clock %>),
7
7
  .i_rst_n (<%= reset %>),
8
8
  .bit_field_if (<%= bit_field_if %>),
9
- .i_sw_write_enable (<%= lock_signal %>),
9
+ .o_write_trigger (),
10
+ .o_read_trigger (),
11
+ .i_sw_write_enable (<%= control_signal %>),
10
12
  .i_hw_write_enable ('0),
11
13
  .i_hw_write_data ('0),
12
14
  .i_hw_set ('0),
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:rwe, :rwl]) do
4
+ sv_rtl do
5
+ build do
6
+ unless bit_field.reference?
7
+ input :control, {
8
+ name: "i_#{full_name}_#{enable_or_lock}", width: 1,
9
+ array_size: array_size, array_format: array_port_format
10
+ }
11
+ end
12
+ output :value_out, {
13
+ name: "o_#{full_name}", width: width,
14
+ array_size: array_size, array_format: array_port_format
15
+ }
16
+ end
17
+
18
+ main_code :bit_field, from_template: true
19
+
20
+ private
21
+
22
+ def enable_or_lock
23
+ { rwe: :enable, rwl: :lock }[bit_field.type]
24
+ end
25
+
26
+ def control_signal
27
+ reference_bit_field || control[loop_variables]
28
+ end
29
+
30
+ def polarity
31
+ { rwe: 'RGGEN_ACTIVE_HIGH', rwl: 'RGGEN_ACTIVE_LOW' }[bit_field.type]
32
+ end
33
+ end
34
+ end
@@ -5,6 +5,8 @@ rggen_bit_field #(
5
5
  .i_clk (<%= clock %>),
6
6
  .i_rst_n (<%= reset %>),
7
7
  .bit_field_if (<%= bit_field_if %>),
8
+ .o_write_trigger (),
9
+ .o_read_trigger (),
8
10
  .i_sw_write_enable ('1),
9
11
  .i_hw_write_enable (<%= set_signal %>),
10
12
  .i_hw_write_data (<%= value_in[loop_variables] %>),
@@ -5,16 +5,16 @@ RgGen.define_list_item_feature(:bit_field, :type, :rws) do
5
5
  build do
6
6
  unless bit_field.reference?
7
7
  input :set, {
8
- name: "i_#{full_name}_set", data_type: :logic, width: 1,
8
+ name: "i_#{full_name}_set", width: 1,
9
9
  array_size: array_size, array_format: array_port_format
10
10
  }
11
11
  end
12
12
  input :value_in, {
13
- name: "i_#{full_name}", data_type: :logic, width: width,
13
+ name: "i_#{full_name}", width: width,
14
14
  array_size: array_size, array_format: array_port_format
15
15
  }
16
16
  output :value_out, {
17
- name: "o_#{full_name}", data_type: :logic, width: width,
17
+ name: "o_#{full_name}", width: width,
18
18
  array_size: array_size, array_format: array_port_format
19
19
  }
20
20
  end
@@ -7,6 +7,8 @@ rggen_bit_field #(
7
7
  .i_clk (<%= clock %>),
8
8
  .i_rst_n (<%= reset %>),
9
9
  .bit_field_if (<%= bit_field_if %>),
10
+ .o_write_trigger (),
11
+ .o_read_trigger (),
10
12
  .i_sw_write_enable ('1),
11
13
  .i_hw_write_enable ('0),
12
14
  .i_hw_write_data ('0),
@@ -6,7 +6,7 @@ RgGen.define_list_item_feature(
6
6
  sv_rtl do
7
7
  build do
8
8
  output :value_out, {
9
- name: "o_#{full_name}", data_type: :logic, width: width,
9
+ name: "o_#{full_name}", width: width,
10
10
  array_size: array_size, array_format: array_port_format
11
11
  }
12
12
  end
@@ -6,6 +6,8 @@ rggen_bit_field #(
6
6
  .i_clk (<%= clock %>),
7
7
  .i_rst_n (<%= reset %>),
8
8
  .bit_field_if (<%= bit_field_if %>),
9
+ .o_write_trigger (),
10
+ .o_read_trigger (),
9
11
  .i_sw_write_enable ('1),
10
12
  .i_hw_write_enable ('0),
11
13
  .i_hw_write_data ('0),
@@ -4,7 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:w0t, :w1t]) do
4
4
  sv_rtl do
5
5
  build do
6
6
  output :value_out, {
7
- name: "o_#{full_name}", data_type: :logic, width: width,
7
+ name: "o_#{full_name}", width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
10
10
  end
@@ -4,7 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:w0trg, :w1trg]) do
4
4
  sv_rtl do
5
5
  build do
6
6
  output :trigger, {
7
- name: "o_#{full_name}_trigger", data_type: :logic, width: width,
7
+ name: "o_#{full_name}_trigger", width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
10
10
  end
@@ -1,12 +1,16 @@
1
1
  rggen_bit_field #(
2
- .WIDTH (<%= width %>),
3
- .INITIAL_VALUE (<%= initial_value %>),
4
- .SW_WRITE_ENABLE_POLARITY (RGGEN_ACTIVE_HIGH)
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>),
4
+ .SW_READ_ACTION (RGGEN_READ_NONE),
5
+ .SW_WRITE_ONCE (<%= write_once %>),
6
+ .TRIGGER (<%= trigger %>)
5
7
  ) u_bit_field (
6
8
  .i_clk (<%= clock %>),
7
9
  .i_rst_n (<%= reset %>),
8
10
  .bit_field_if (<%= bit_field_if %>),
9
- .i_sw_write_enable (<%= enable_signal %>),
11
+ .o_write_trigger (<%= write_trigger_signal %>),
12
+ .o_read_trigger (),
13
+ .i_sw_write_enable ('1),
10
14
  .i_hw_write_enable ('0),
11
15
  .i_hw_write_data ('0),
12
16
  .i_hw_set ('0),
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:wo, :wo1, :wotrg]) do
4
+ sv_rtl do
5
+ build do
6
+ output :value_out, {
7
+ name: "o_#{full_name}", width: width,
8
+ array_size: array_size, array_format: array_port_format
9
+ }
10
+ if wotrg?
11
+ output :write_trigger, {
12
+ name: "o_#{full_name}_write_trigger", width: 1,
13
+ array_size: array_size, array_format: array_port_format
14
+ }
15
+ end
16
+ end
17
+
18
+ main_code :bit_field, from_template: true
19
+
20
+ private
21
+
22
+ def wotrg?
23
+ bit_field.type == :wotrg
24
+ end
25
+
26
+ def trigger
27
+ wotrg? && 1 || 0
28
+ end
29
+
30
+ def write_trigger_signal
31
+ wotrg? && write_trigger[loop_variables] || nil
32
+ end
33
+
34
+ def write_once
35
+ bit_field.type == :wo1 && 1 || 0
36
+ end
37
+ end
38
+ end
@@ -6,6 +6,8 @@ rggen_bit_field #(
6
6
  .i_clk (<%= clock %>),
7
7
  .i_rst_n (<%= reset %>),
8
8
  .bit_field_if (<%= bit_field_if %>),
9
+ .o_write_trigger (),
10
+ .o_read_trigger (),
9
11
  .i_sw_write_enable ('1),
10
12
  .i_hw_write_enable ('0),
11
13
  .i_hw_write_data ('0),
@@ -4,7 +4,7 @@ RgGen.define_list_item_feature(:bit_field, :type, [:wrc, :wrs]) do
4
4
  sv_rtl do
5
5
  build do
6
6
  output :value_out, {
7
- name: "o_#{full_name}", data_type: :logic, width: width,
7
+ name: "o_#{full_name}", width: width,
8
8
  array_size: array_size, array_format: array_port_format
9
9
  }
10
10
  end
@@ -15,8 +15,7 @@ module RgGen
15
15
  end
16
16
 
17
17
  def local_index
18
- index_name = local_index_name
19
- index_name && create_identifier(index_name)
18
+ create_identifier(local_index_name)
20
19
  end
21
20
 
22
21
  def local_indices
@@ -16,10 +16,12 @@ module RgGen
16
16
  InterfaceInstance.new(attributes, &block)
17
17
  end
18
18
 
19
- def create_argument(direction, attributes, &block)
20
- DataObject.new(
21
- :argument, attributes.merge(direction: direction), &block
22
- )
19
+ def create_port(direction, attributes, &block)
20
+ attributes =
21
+ { data_type: 'logic' }
22
+ .merge(attributes)
23
+ .merge(direction: direction)
24
+ DataObject.new(:argument, attributes, &block)
23
25
  end
24
26
 
25
27
  def create_if_port(_, attributes, &block)
@@ -34,8 +36,8 @@ module RgGen
34
36
 
35
37
  define_entity :logic, :create_variable, :variable, -> { component }
36
38
  define_entity :interface, :create_if_instance, :variable, -> { component }
37
- define_entity :input, :create_argument, :port, -> { register_block }
38
- define_entity :output, :create_argument, :port, -> { register_block }
39
+ define_entity :input, :create_port, :port, -> { register_block }
40
+ define_entity :output, :create_port, :port, -> { register_block }
39
41
  define_entity :interface_port, :create_if_port, :port, -> { register_block }
40
42
  define_entity :parameter, :create_parameter, :parameter, -> { register_block }
41
43
  define_entity :localparam, :create_parameter, :parameter, -> { component }
@@ -7,12 +7,11 @@ module RgGen
7
7
  private
8
8
 
9
9
  def partial_sums(operands)
10
- sums =
11
- operands
12
- .chunk(&method(:integer?))
13
- .flat_map(&method(:calc_partial_sum))
14
- .reject { |value| integer?(value) && value.zero? }
15
- sums.empty? && [0] || sums
10
+ operands
11
+ .chunk(&method(:integer?))
12
+ .flat_map(&method(:calc_partial_sum))
13
+ .reject { |value| integer?(value) && value.zero? }
14
+ .tap { |sums| sums.empty? && (sums << 0) }
16
15
  end
17
16
 
18
17
  def calc_partial_sum(kind_ans_values)
@@ -3,71 +3,14 @@
3
3
  RgGen.define_list_item_feature(:register, :type, :external) do
4
4
  sv_rtl do
5
5
  build do
6
- if configuration.fold_sv_interface_port?
7
- interface_port :bus_if, {
8
- name: "#{register.name}_bus_if",
9
- interface_type: 'rggen_bus_if',
10
- modport: 'master'
11
- }
12
- else
13
- output :valid, {
14
- name: "o_#{register.name}_valid",
15
- data_type: :logic, width: 1
16
- }
17
- output :access, {
18
- name: "o_#{register.name}_access",
19
- data_type: :logic, width: '$bits(rggen_access)'
20
- }
21
- output :address, {
22
- name: "o_#{register.name}_address",
23
- data_type: :logic, width: address_width
24
- }
25
- output :write_data, {
26
- name: "o_#{register.name}_data",
27
- data_type: :logic, width: bus_width
28
- }
29
- output :strobe, {
30
- name: "o_#{register.name}_strobe",
31
- data_type: :logic, width: byte_width
32
- }
33
- input :ready, {
34
- name: "i_#{register.name}_ready",
35
- data_type: :logic, width: 1
36
- }
37
- input :status, {
38
- name: "i_#{register.name}_status",
39
- data_type: :logic, width: 2
40
- }
41
- input :read_data, {
42
- name: "i_#{register.name}_data",
43
- data_type: :logic, width: bus_width
44
- }
45
- interface :bus_if, {
46
- name: 'bus_if', interface_type: 'rggen_bus_if',
47
- parameter_values: [address_width, bus_width],
48
- variables: [
49
- 'valid', 'access', 'address', 'write_data', 'strobe',
50
- 'ready', 'status', 'read_data'
51
- ]
52
- }
53
- end
6
+ interface_port :bus_if, {
7
+ name: "#{register.name}_bus_if",
8
+ interface_type: 'rggen_bus_if',
9
+ modport: 'master'
10
+ }
54
11
  end
55
12
 
56
13
  main_code :register, from_template: true
57
- main_code :register do |code|
58
- unless configuration.fold_sv_interface_port?
59
- [
60
- [valid, bus_if.valid],
61
- [access, bus_if.access],
62
- [address, bus_if.address],
63
- [write_data, bus_if.write_data],
64
- [strobe, bus_if.strobe],
65
- [bus_if.ready, ready],
66
- [bus_if.status, "rggen_status'(#{status})"],
67
- [bus_if.read_data, read_data]
68
- ].map { |lhs, rhs| code << assign(lhs, rhs) << nl }
69
- end
70
- end
71
14
 
72
15
  private
73
16
 
@@ -21,68 +21,11 @@ RgGen.define_list_item_feature(:register_block, :protocol, :apb) do
21
21
 
22
22
  sv_rtl do
23
23
  build do
24
- if configuration.fold_sv_interface_port?
25
- interface_port :apb_if, {
26
- name: 'apb_if', interface_type: 'rggen_apb_if', modport: 'slave'
27
- }
28
- else
29
- input :psel, {
30
- name: 'i_psel', data_type: :logic, width: 1
31
- }
32
- input :penable, {
33
- name: 'i_penable', data_type: :logic, width: 1
34
- }
35
- input :paddr, {
36
- name: 'i_paddr', data_type: :logic, width: address_width
37
- }
38
- input :pprot, {
39
- name: 'i_pprot', data_type: :logic, width: 3
40
- }
41
- input :pwrite, {
42
- name: 'i_pwrite', data_type: :logic, width: 1
43
- }
44
- input :pstrb, {
45
- name: 'i_pstrb', data_type: :logic, width: byte_width
46
- }
47
- input :pwdata, {
48
- name: 'i_pwdata', data_type: :logic, width: bus_width
49
- }
50
- output :pready, {
51
- name: 'o_pready', data_type: :logic, width: 1
52
- }
53
- output :prdata, {
54
- name: 'o_prdata', data_type: :logic, width: bus_width
55
- }
56
- output :pslverr, {
57
- name: 'o_pslverr', data_type: :logic, width: 1
58
- }
59
- interface :apb_if, {
60
- name: 'apb_if', interface_type: 'rggen_apb_if',
61
- parameter_values: [address_width, bus_width],
62
- variables: [
63
- 'psel', 'penable', 'paddr', 'pprot', 'pwrite', 'pstrb', 'pwdata',
64
- 'pready', 'prdata', 'pslverr'
65
- ]
66
- }
67
- end
24
+ interface_port :apb_if, {
25
+ name: 'apb_if', interface_type: 'rggen_apb_if', modport: 'slave'
26
+ }
68
27
  end
69
28
 
70
29
  main_code :register_block, from_template: true
71
- main_code :register_block do |code|
72
- unless configuration.fold_sv_interface_port?
73
- [
74
- [apb_if.psel, psel],
75
- [apb_if.penable, penable],
76
- [apb_if.paddr, paddr],
77
- [apb_if.pprot, pprot],
78
- [apb_if.pwrite, pwrite],
79
- [apb_if.pstrb, pstrb],
80
- [apb_if.pwdata, pwdata],
81
- [pready, apb_if.pready],
82
- [prdata, apb_if.prdata],
83
- [pslverr, apb_if.pslverr]
84
- ].each { |lhs, rhs| code << assign(lhs, rhs) << nl }
85
- end
86
- end
87
30
  end
88
31
  end
@@ -19,132 +19,18 @@ RgGen.define_list_item_feature(:register_block, :protocol, :axi4lite) do
19
19
  parameter :write_first, {
20
20
  name: 'WRITE_FIRST', data_type: :bit, default: 1
21
21
  }
22
- if configuration.fold_sv_interface_port?
23
- interface_port :axi4lite_if, {
24
- name: 'axi4lite_if',
25
- interface_type: 'rggen_axi4lite_if', modport: 'slave'
26
- }
27
- else
28
- input :awvalid, {
29
- name: 'i_awvalid', data_type: :logic, width: 1
30
- }
31
- output :awready, {
32
- name: 'o_awready', data_type: :logic, width: 1
33
- }
34
- input :awid, {
35
- name: 'i_awid', data_type: :logic, width: id_port_width
36
- }
37
- input :awaddr, {
38
- name: 'i_awaddr', data_type: :logic, width: address_width
39
- }
40
- input :awprot, {
41
- name: 'i_awprot', data_type: :logic, width: 3
42
- }
43
- input :wvalid, {
44
- name: 'i_wvalid', data_type: :logic, width: 1
45
- }
46
- output :wready, {
47
- name: 'o_wready', data_type: :logic, width: 1
48
- }
49
- input :wdata, {
50
- name: 'i_wdata', data_type: :logic, width: bus_width
51
- }
52
- input :wstrb, {
53
- name: 'i_wstrb', data_type: :logic, width: byte_width
54
- }
55
- output :bvalid, {
56
- name: 'o_bvalid', data_type: :logic, width: 1
57
- }
58
- output :bid, {
59
- name: 'o_bid', data_type: :logic, width: id_port_width
60
- }
61
- input :bready, {
62
- name: 'i_bready', data_type: :logic, width: 1
63
- }
64
- output :bresp, {
65
- name: 'o_bresp', data_type: :logic, width: 2
66
- }
67
- input :arvalid, {
68
- name: 'i_arvalid', data_type: :logic, width: 1
69
- }
70
- output :arready, {
71
- name: 'o_arready', data_type: :logic, width: 1
72
- }
73
- input :arid, {
74
- name: 'i_arid', data_type: :logic, width: id_port_width
75
- }
76
- input :araddr, {
77
- name: 'i_araddr', data_type: :logic, width: address_width
78
- }
79
- input :arprot, {
80
- name: 'i_arprot', data_type: :logic, width: 3
81
- }
82
- output :rvalid, {
83
- name: 'o_rvalid', data_type: :logic, width: 1
84
- }
85
- input :rready, {
86
- name: 'i_rready', data_type: :logic, width: 1
87
- }
88
- output :rid, {
89
- name: 'o_rid', data_type: :logic, width: id_port_width
90
- }
91
- output :rdata, {
92
- name: 'o_rdata', data_type: :logic, width: bus_width
93
- }
94
- output :rresp, {
95
- name: 'o_rresp', data_type: :logic, width: 2
96
- }
97
- interface :axi4lite_if, {
98
- name: 'axi4lite_if', interface_type: 'rggen_axi4lite_if',
99
- parameter_values: [id_width, address_width, bus_width],
100
- variables: [
101
- 'awvalid', 'awready', 'awid', 'awaddr', 'awprot',
102
- 'wvalid', 'wready', 'wdata', 'wstrb',
103
- 'bvalid', 'bready', 'bid', 'bresp',
104
- 'arvalid', 'arready', 'arid', 'araddr', 'arprot',
105
- 'rvalid', 'rready', 'rid', 'rdata', 'rresp'
106
- ]
107
- }
108
- end
22
+ interface_port :axi4lite_if, {
23
+ name: 'axi4lite_if',
24
+ interface_type: 'rggen_axi4lite_if', modport: 'slave'
25
+ }
109
26
  end
110
27
 
111
28
  main_code :register_block, from_template: true
112
- main_code :register_block do |code|
113
- configuration.fold_sv_interface_port? || assign_axi4lite_signals(code)
114
- end
115
29
 
116
30
  private
117
31
 
118
32
  def id_port_width
119
33
  "((#{id_width}>0)?#{id_width}:1)"
120
34
  end
121
-
122
- def assign_axi4lite_signals(code)
123
- [
124
- [axi4lite_if.awvalid, awvalid],
125
- [awready, axi4lite_if.awready],
126
- [axi4lite_if.awid, awid],
127
- [axi4lite_if.awaddr, awaddr],
128
- [axi4lite_if.awprot, awprot],
129
- [axi4lite_if.wvalid, wvalid],
130
- [wready, axi4lite_if.wready],
131
- [axi4lite_if.wdata, wdata],
132
- [axi4lite_if.wstrb, wstrb],
133
- [bvalid, axi4lite_if.bvalid],
134
- [axi4lite_if.bready, bready],
135
- [bid, axi4lite_if.bid],
136
- [bresp, axi4lite_if.bresp],
137
- [axi4lite_if.arvalid, arvalid],
138
- [arready, axi4lite_if.arready],
139
- [axi4lite_if.arid, arid],
140
- [axi4lite_if.araddr, araddr],
141
- [axi4lite_if.arprot, arprot],
142
- [rvalid, axi4lite_if.rvalid],
143
- [axi4lite_if.rready, rready],
144
- [rid, axi4lite_if.rid],
145
- [rdata, axi4lite_if.rdata],
146
- [rresp, axi4lite_if.rresp]
147
- ].each { |lhs, rhs| code << assign(lhs, rhs) << nl }
148
- end
149
35
  end
150
36
  end
@@ -0,0 +1,17 @@
1
+ rggen_wishbone_adapter #(
2
+ .ADDRESS_WIDTH (<%= address_width %>),
3
+ .LOCAL_ADDRESS_WIDTH (<%= local_address_width %>),
4
+ .BUS_WIDTH (<%= bus_width %>),
5
+ .REGISTERS (<%= total_registers %>),
6
+ .PRE_DECODE (<%= pre_decode %>),
7
+ .BASE_ADDRESS (<%= base_address %>),
8
+ .BYTE_SIZE (<%= byte_size %>),
9
+ .ERROR_STATUS (<%= error_status %>),
10
+ .DEFAULT_READ_DATA (<%= default_read_data %>),
11
+ .USE_STALL (<%= use_stall %>)
12
+ ) u_adapter (
13
+ .i_clk (<%= clock %>),
14
+ .i_rst_n (<%= reset %>),
15
+ .wishbone_if (<%= wishbone_if %>),
16
+ .register_if (<%= register_if %>)
17
+ );