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,11 @@
1
+ rggen_bit_field_ro #(
2
+ .WIDTH (<%= width %>)
3
+ ) u_bit_field (
4
+ .i_bit_field_valid (<%= bit_field_valid %>),
5
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
6
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
7
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
8
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
9
+ .o_bit_field_value (<%= bit_field_value %>),
10
+ .i_value (<%= initial_value %>)
11
+ );
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rof) do
4
+ verilog do
5
+ main_code :bit_field, from_template: true
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ <%= module_name %> #(
2
+ <% if bit_field.type != :rs %>
3
+ .SET_VALUE (<%= set_value %>),
4
+ .WRITE_ONLY (<%= write_only %>),
5
+ <% end %>
6
+ .WIDTH (<%= width %>),
7
+ .INITIAL_VALUE (<%= initial_value %>)
8
+ ) u_bit_field (
9
+ .i_clk (<%= clock %>),
10
+ .i_rst_n (<%= reset %>),
11
+ .i_bit_field_valid (<%= bit_field_valid %>),
12
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
13
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
14
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
15
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
16
+ .o_bit_field_value (<%= bit_field_value %>),
17
+ .i_clear (<%= clear[loop_variables] %>),
18
+ .o_value (<%= value_out[loop_variables] %>)
19
+ );
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:rs, :w0s, :w1s, :ws, :wos]) do
4
+ verilog do
5
+ build do
6
+ input :clear, {
7
+ name: "i_#{full_name}_clear", width: width, array_size: array_size
8
+ }
9
+ output :value_out, {
10
+ name: "o_#{full_name}", width: width, array_size: array_size
11
+ }
12
+ end
13
+
14
+ main_code :bit_field, from_template: true
15
+
16
+ private
17
+
18
+ def module_name
19
+ bit_field.type == :rs && 'rggen_bit_field_rs' || 'rggen_bit_field_w01s_ws_wos'
20
+ end
21
+
22
+ def set_value
23
+ value = { w0s: 0b00, w1s: 0b01, ws: 0b10, wos: 0b10 }[bit_field.type]
24
+ bin(value, 2)
25
+ end
26
+
27
+ def write_only
28
+ bit_field.write_only? && 1 || 0
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,16 @@
1
+ rggen_bit_field_rw_wo #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>),
4
+ .WRITE_ONLY (<%= write_only %>),
5
+ .WRITE_ONCE (<%= write_once %>)
6
+ ) u_bit_field (
7
+ .i_clk (<%= clock %>),
8
+ .i_rst_n (<%= reset %>),
9
+ .i_bit_field_valid (<%= bit_field_valid %>),
10
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
11
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
12
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
13
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
14
+ .o_bit_field_value (<%= bit_field_value %>),
15
+ .o_value (<%= value_out[loop_variables] %>)
16
+ );
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:rw, :w1, :wo, :wo1]) 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
+
13
+ private
14
+
15
+ def write_only
16
+ bit_field.write_only? && 1 || 0
17
+ end
18
+
19
+ def write_once
20
+ [:w1, :wo1].include?(bit_field.type) && 1 || 0
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ rggen_bit_field_rwc #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>)
4
+ ) u_bit_field (
5
+ .i_clk (<%= clock %>),
6
+ .i_rst_n (<%= reset %>),
7
+ .i_bit_field_valid (<%= bit_field_valid %>),
8
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
9
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
10
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
11
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
12
+ .o_bit_field_value (<%= bit_field_value %>),
13
+ .i_clear (<%= clear_signal %>),
14
+ .o_value (<%= value_out[loop_variables] %>)
15
+ );
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rwc) do
4
+ verilog do
5
+ build do
6
+ unless bit_field.reference?
7
+ input :clear, {
8
+ name: "i_#{full_name}_clear", width: 1, array_size: array_size
9
+ }
10
+ end
11
+ output :value_out, {
12
+ name: "o_#{full_name}", width: width, array_size: array_size
13
+ }
14
+ end
15
+
16
+ main_code :bit_field, from_template: true
17
+
18
+ private
19
+
20
+ def clear_signal
21
+ reference_bit_field || clear[loop_variables]
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ rggen_bit_field_rwe #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>)
4
+ ) u_bit_field (
5
+ .i_clk (<%= clock %>),
6
+ .i_rst_n (<%= reset %>),
7
+ .i_bit_field_valid (<%= bit_field_valid %>),
8
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
9
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
10
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
11
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
12
+ .o_bit_field_value (<%= bit_field_value %>),
13
+ .i_enable (<%= enable_signal %>),
14
+ .o_value (<%= value_out[loop_variables] %>)
15
+ );
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rwe) do
4
+ verilog do
5
+ build do
6
+ unless bit_field.reference?
7
+ input :enable, {
8
+ name: "i_#{full_name}_enable", width: 1, array_size: array_size
9
+ }
10
+ end
11
+ output :value_out, {
12
+ name: "o_#{full_name}", width: width, array_size: array_size
13
+ }
14
+ end
15
+
16
+ main_code :bit_field, from_template: true
17
+
18
+ private
19
+
20
+ def enable_signal
21
+ reference_bit_field || enable[loop_variables]
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ rggen_bit_field_rwl #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>)
4
+ ) u_bit_field (
5
+ .i_clk (<%= clock %>),
6
+ .i_rst_n (<%= reset %>),
7
+ .i_bit_field_valid (<%= bit_field_valid %>),
8
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
9
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
10
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
11
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
12
+ .o_bit_field_value (<%= bit_field_value %>),
13
+ .i_lock (<%= lock_signal %>),
14
+ .o_value (<%= value_out[loop_variables] %>)
15
+ );
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rwl) do
4
+ verilog do
5
+ build do
6
+ unless bit_field.reference?
7
+ input :lock, {
8
+ name: "i_#{full_name}_lock", width: 1, array_size: array_size
9
+ }
10
+ end
11
+ output :value_out, {
12
+ name: "o_#{full_name}", width: width, array_size: array_size
13
+ }
14
+ end
15
+
16
+ main_code :bit_field, from_template: true
17
+
18
+ private
19
+
20
+ def lock_signal
21
+ reference_bit_field || lock[loop_variables]
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ rggen_bit_field_rws #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>)
4
+ ) u_bit_field (
5
+ .i_clk (<%= clock %>),
6
+ .i_rst_n (<%= reset %>),
7
+ .i_bit_field_valid (<%= bit_field_valid %>),
8
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
9
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
10
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
11
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
12
+ .o_bit_field_value (<%= bit_field_value %>),
13
+ .i_set (<%= set_signal %>),
14
+ .i_value (<%= value_in[loop_variables] %>),
15
+ .o_value (<%= value_out[loop_variables] %>)
16
+ );
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, :rws) do
4
+ verilog do
5
+ build do
6
+ unless bit_field.reference?
7
+ input :set, {
8
+ name: "i_#{full_name}_set", width: 1, array_size: array_size
9
+ }
10
+ end
11
+ input :value_in, {
12
+ name: "i_#{full_name}", width: width, array_size: array_size
13
+ }
14
+ output :value_out, {
15
+ name: "o_#{full_name}", width: width, array_size: array_size
16
+ }
17
+ end
18
+
19
+ main_code :bit_field, from_template: true
20
+
21
+ private
22
+
23
+ def set_signal
24
+ reference_bit_field || set[loop_variables]
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ rggen_bit_field_w01crs_wcrs #(
2
+ .CLEAR_VALUE (<%= clear_value %>),
3
+ .WIDTH (<%= width %>),
4
+ .INITIAL_VALUE (<%= initial_value %>)
5
+ ) u_bit_field (
6
+ .i_clk (<%= clock %>),
7
+ .i_rst_n (<%= reset %>),
8
+ .i_bit_field_valid (<%= bit_field_valid %>),
9
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
10
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
11
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
12
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
13
+ .o_bit_field_value (<%= bit_field_value %>),
14
+ .o_value (<%= value_out[loop_variables] %>)
15
+ );
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:w0crs, :w1crs, :wcrs]) 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
+
13
+ private
14
+
15
+ def clear_value
16
+ value = { w0crs: 0b00, w1crs: 0b01, wcrs: 0b10 }[bit_field.type]
17
+ bin(value, 2)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ rggen_bit_field_w01src_wsrc #(
2
+ .SET_VALUE (<%= set_value %>),
3
+ .WIDTH (<%= width %>),
4
+ .INITIAL_VALUE (<%= initial_value %>)
5
+ ) u_bit_field (
6
+ .i_clk (<%= clock %>),
7
+ .i_rst_n (<%= reset %>),
8
+ .i_bit_field_valid (<%= bit_field_valid %>),
9
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
10
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
11
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
12
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
13
+ .o_bit_field_value (<%= bit_field_value %>),
14
+ .o_value (<%= value_out[loop_variables] %>)
15
+ );
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:w0src, :w1src, :wsrc]) 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
+
13
+ private
14
+
15
+ def set_value
16
+ value = { w0src: 0b00, w1src: 0b01, wsrc: 0b10 }[bit_field.type]
17
+ bin(value, 2)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ rggen_bit_field_w01t #(
2
+ .TOGGLE_VALUE (<%= toggle_value %>),
3
+ .WIDTH (<%= width %>),
4
+ .INITIAL_VALUE (<%= initial_value %>)
5
+ ) u_bit_field (
6
+ .i_clk (<%= clock %>),
7
+ .i_rst_n (<%= reset %>),
8
+ .i_bit_field_valid (<%= bit_field_valid %>),
9
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
10
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
11
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
12
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
13
+ .o_bit_field_value (<%= bit_field_value %>),
14
+ .o_value (<%= value_out[loop_variables] %>)
15
+ );
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:w0t, :w1t]) 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
+
13
+ private
14
+
15
+ def toggle_value
16
+ bin({ w0t: 0, w1t: 1 }[bit_field.type], 1)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ rggen_bit_field_w01trg #(
2
+ .TRIGGER_VALUE (<%= trigger_value %>),
3
+ .WIDTH (<%= width %>)
4
+ ) u_bit_field (
5
+ .i_clk (<%= clock %>),
6
+ .i_rst_n (<%= reset %>),
7
+ .i_bit_field_valid (<%= bit_field_valid %>),
8
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
9
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
10
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
11
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
12
+ .o_bit_field_value (<%= bit_field_value %>),
13
+ .o_trigger (<%= trigger[loop_variables] %>)
14
+ );
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ RgGen.define_list_item_feature(:bit_field, :type, [:w0trg, :w1trg]) do
4
+ verilog do
5
+ build do
6
+ output :trigger, {
7
+ name: "o_#{full_name}_trigger", width: width, array_size: array_size
8
+ }
9
+ end
10
+
11
+ main_code :bit_field, from_template: true
12
+
13
+ private
14
+
15
+ def trigger_value
16
+ bin({ w0trg: 0, w1trg: 1 }[bit_field.type], 1)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ rggen_bit_field_<%= bit_field.type %> #(
2
+ .WIDTH (<%= width %>),
3
+ .INITIAL_VALUE (<%= initial_value %>)
4
+ ) u_bit_field (
5
+ .i_clk (<%= clock %>),
6
+ .i_rst_n (<%= reset %>),
7
+ .i_bit_field_valid (<%= bit_field_valid %>),
8
+ .i_bit_field_read_mask (<%= bit_field_read_mask %>),
9
+ .i_bit_field_write_mask (<%= bit_field_write_mask %>),
10
+ .i_bit_field_write_data (<%= bit_field_write_data %>),
11
+ .o_bit_field_read_data (<%= bit_field_read_data %>),
12
+ .o_bit_field_value (<%= bit_field_value %>),
13
+ .o_value (<%= value_out[loop_variables] %>)
14
+ );