verilog_gen 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -0
  3. data/README.md +22 -1
  4. data/Rakefile +20 -0
  5. data/bin/hdl_equal +82 -0
  6. data/bin/vgen +57 -1
  7. data/bin/vscan +354 -0
  8. data/demos/router/Makefile +11 -0
  9. data/demos/router/build/chip1_router.rb +50 -0
  10. data/demos/router/build/chip2_router.rb +33 -0
  11. data/demos/router/build/generic_router.rb +96 -0
  12. data/demos/router/rtl/fifo_ctrl.v +93 -0
  13. data/demos/router/rtl/flop_delay.v +37 -0
  14. data/demos/router/rtl/generic_mem.v +38 -0
  15. data/demos/router/rtl/router_ctrl.v +73 -0
  16. data/demos/router/rtl/rr_arb.v +55 -0
  17. data/demos/router/vendors/vendor1/mem_16nm_bist_ctrl.v +56 -0
  18. data/demos/router/vendors/vendor1/mem_16nm_ram4x64.v +50 -0
  19. data/demos/router/vendors/vendor1/mem_16nm_ram8x64.v +50 -0
  20. data/demos/router/vendors/vendor2/mem_16nm_bist_ctrl.v +56 -0
  21. data/demos/router/vendors/vendor2/mem_16nm_ram12x73.v +50 -0
  22. data/demos/router/vendors/vendor2/mem_16nm_ram4x73.v +50 -0
  23. data/docs/demo.md +142 -0
  24. data/docs/sst.md +76 -0
  25. data/features/cucumber.yml +1 -0
  26. data/features/hdl_equal/hello.feature +9 -0
  27. data/features/hdl_equal/leaf_compare.feature +11 -0
  28. data/features/hdl_equal/neg_compare.feature +17 -0
  29. data/features/hdl_equal/port_width_compare.feature +17 -0
  30. data/features/sprint1/hello.feature +9 -0
  31. data/features/sprint1/hier_connect_1.feature +81 -0
  32. data/features/sprint1/hier_connect_2.feature +91 -0
  33. data/features/sprint1/hier_connect_3.feature +90 -0
  34. data/features/sprint1/inhibit_port.feature +41 -0
  35. data/features/sprint1/input_connect.feature +79 -0
  36. data/features/sprint1/leaf_rename.feature +41 -0
  37. data/features/sprint1/new_leaf_design.erb +52 -0
  38. data/features/sprint1/output_connect.feature +79 -0
  39. data/features/sprint1/regex_port_rewrites.feature +43 -0
  40. data/features/sprint1/subrange_port.feature +43 -0
  41. data/features/sprint1/swap_leaf.feature +122 -0
  42. data/features/sprint1/tie_port.feature +40 -0
  43. data/features/sprint1/unused_port.feature +41 -0
  44. data/features/sprint1/vector_split.feature +41 -0
  45. data/features/sprint1/wire_connect.feature +46 -0
  46. data/features/sprint2/expression_net.feature +41 -0
  47. data/features/sprint2/fifo.feature +61 -0
  48. data/features/sprint2/wire_expression.feature +48 -0
  49. data/features/step_definitions/vgen_steps.rb +3 -0
  50. data/features/support/env.rb +3 -1
  51. data/features/vgen/add_child.feature +60 -0
  52. data/features/vgen/fifo_ctrl.feature +24 -0
  53. data/features/vgen/hello.feature +9 -0
  54. data/features/vgen/leaf_node.feature +15 -0
  55. data/features/vgen/output_dir.feature +19 -0
  56. data/features/vgen/simple_node.feature +24 -0
  57. data/features/vgen/thin_hookup.feature +22 -0
  58. data/features/vscan/bad_path.feature +9 -0
  59. data/features/vscan/class_override.feature +23 -0
  60. data/features/vscan/class_override_path.feature +23 -0
  61. data/features/vscan/complex_expressions.feature +47 -0
  62. data/features/vscan/data_types_2001.feature +36 -0
  63. data/features/vscan/data_types_sv.feature +53 -0
  64. data/features/vscan/hello.feature +9 -0
  65. data/features/vscan/hiearchy_path.feature +23 -0
  66. data/features/vscan/illegal_argument.feature +9 -0
  67. data/features/vscan/inout.feature +23 -0
  68. data/features/vscan/interface_nested.feature +53 -0
  69. data/features/vscan/interface_nested_no_out.feature +48 -0
  70. data/features/vscan/interface_param_default.feature +41 -0
  71. data/features/vscan/interface_param_override.feature +27 -0
  72. data/features/vscan/interface_port.feature +41 -0
  73. data/features/vscan/interface_sv.feature +35 -0
  74. data/features/vscan/leaf_1995.feature +27 -0
  75. data/features/vscan/leaf_2001.feature +25 -0
  76. data/features/vscan/leaf_negative_1995.feature +24 -0
  77. data/features/vscan/leaf_sv.feature +25 -0
  78. data/features/vscan/localparam_2001.feature +38 -0
  79. data/features/vscan/missing_parameter.feature +24 -0
  80. data/features/vscan/multiple_class.feature +9 -0
  81. data/features/vscan/multiple_flavors.feature +64 -0
  82. data/features/vscan/multiple_modules.feature +60 -0
  83. data/features/vscan/name_mismatch.feature +24 -0
  84. data/features/vscan/net_type.feature +67 -0
  85. data/features/vscan/parameter_override.feature +43 -0
  86. data/features/vscan/parameters_1995.feature +43 -0
  87. data/features/vscan/parameters_2001.feature +38 -0
  88. data/features/vscan/read_only.feature +19 -0
  89. data/features/vscan/reverse_vectors_1995.feature +33 -0
  90. data/features/vscan/single_line_1995.feature +24 -0
  91. data/features/vscan/vectors_1995.feature +33 -0
  92. data/features/vscan/vectors_2001.feature +29 -0
  93. data/features/vscan/vectors_sv.feature +31 -0
  94. data/lib/templates/helpers.rb +85 -0
  95. data/lib/templates/v2k_template.erb +6 -0
  96. data/lib/verilog_gen.rb +8 -3
  97. data/lib/verilog_gen/hdl_module.rb +274 -0
  98. data/lib/verilog_gen/hookup.rb +153 -0
  99. data/lib/verilog_gen/pin.rb +39 -0
  100. data/lib/verilog_gen/port.rb +109 -0
  101. data/lib/verilog_gen/proxy.rb +33 -0
  102. data/lib/verilog_gen/string.rb +38 -0
  103. data/lib/verilog_gen/version.rb +1 -1
  104. data/spec/fixture/generic_mem.v +38 -0
  105. data/spec/hdl_child_array_spec.rb +29 -0
  106. data/spec/hdl_hier_spec.rb +45 -0
  107. data/spec/hdl_hookup.spec +37 -0
  108. data/spec/hdl_module_spec.rb +117 -0
  109. data/spec/hdl_output_spec.rb +88 -0
  110. data/spec/hdl_port_spec.rb +35 -0
  111. data/spec/hdl_remove_child.spec +37 -0
  112. data/spec/pin_spec.rb +37 -0
  113. data/spec/port_spec.rb +90 -0
  114. data/spec/proxy_spec.rb +41 -0
  115. data/spec/spec_helper.rb +2 -0
  116. data/verilog_gen.gemspec +1 -1
  117. metadata +194 -8
  118. data/features/hello.feature +0 -8
  119. data/features/support/aruba.rb +0 -1
@@ -0,0 +1,40 @@
1
+ Feature: Tie a child instance port to a fixed value.
2
+
3
+ Scenario: Tie input port of a child to a constant value.
4
+ Given a file named "leaf.rb" with:
5
+ """
6
+ class Leaf < HdlModule
7
+ def build
8
+ add_port "in1", direction: "input", width: 10
9
+ add_port "out1", direction: "output"
10
+ end
11
+ end
12
+ """
13
+ And a file named "dut.rb" with:
14
+ """
15
+ class Dut < HdlModule
16
+
17
+ def build
18
+ add_instance Leaf, "leaf1"
19
+ leaf1.in1.tie_to 48 #Tied port to a constant value
20
+ leaf1.out1.connect_pin "out"
21
+ end
22
+
23
+ end
24
+ """
25
+
26
+ When I run `vgen leaf.rb dut.rb `
27
+ Then the file "dut.v" should contain:
28
+ """
29
+
30
+ module dut(out);
31
+ output out;
32
+
33
+ wire out;
34
+
35
+ Leaf leaf1(.in1(10'd48),
36
+ .out1(out));
37
+
38
+ endmodule
39
+ """
40
+
@@ -0,0 +1,41 @@
1
+ Feature: Force a port to be unconnected.
2
+
3
+ Scenario: Leave a port of a leaf unconnected
4
+ Given a file named "leaf.rb" with:
5
+ """
6
+ class Leaf < HdlModule
7
+ def build
8
+ add_port "in1", direction: "input", width: 10
9
+ add_port "out1", direction: "output"
10
+ end
11
+ end
12
+ """
13
+ And a file named "dut.rb" with:
14
+ """
15
+ class Dut < HdlModule
16
+
17
+ def build
18
+ add_instance Leaf, "leaf1"
19
+ leaf1.in1.unused
20
+ leaf1.out1.connect_pin "out"
21
+ end
22
+
23
+ end
24
+ """
25
+
26
+ When I run `vgen leaf.rb dut.rb `
27
+ Then the file "dut.v" should contain:
28
+ """
29
+
30
+ module dut(out);
31
+ output out;
32
+
33
+ wire [9:0] unused_leaf1_in1
34
+ wire out;
35
+
36
+ Leaf leaf1(.in1(unused_leaf1_in1),
37
+ .out1(out));
38
+
39
+ endmodule
40
+ """
41
+
@@ -0,0 +1,41 @@
1
+ Feature: Rename a vector port to separate pins
2
+
3
+ Scenario: connect one leaf
4
+ Given a file named "leaf.rb" with:
5
+ """
6
+ class Leaf < HdlModule
7
+ def build
8
+ add_port "in1", width: 10
9
+ add_port "out1", direction: "output", width: 5
10
+ end
11
+ end
12
+ """
13
+ And a file named "dut.rb" with:
14
+ """
15
+ class Dut < HdlModule
16
+ def build
17
+ add_instance Leaf "leaf1"
18
+ leaf1.in1.range(5,0).connect_pin("sub_in1")
19
+ leaf1.in1.range(9,6).connect_pin("sub_in2")
20
+ leaf1.out1.connect_pint("out")
21
+ end
22
+ end
23
+ """
24
+
25
+ When I run `vgen leaf.rb dut.rb `
26
+ Then the file "dut.v" should contain:
27
+ """
28
+
29
+ module dut(in, out);
30
+ input [9:0] in;
31
+ output [4:0] out1;
32
+
33
+ wire [5:0] sub_in1;
34
+ wire [3:0] sub_in2;
35
+ wire [4:0] out1;
36
+
37
+ Leaf leaf1(.in1({sub_in2, sub_in1}),
38
+ .out1(out1));
39
+
40
+ endmodule
41
+ """
@@ -0,0 +1,46 @@
1
+ Feature: Internal connections do not become primary input/output ports.
2
+
3
+ Scenario: Internal pin not connected to port
4
+ Given a file named "producer.rb" with:
5
+ """
6
+ class Producer < HdlModule
7
+ def build
8
+ add_port "out1", width: 10, direction: "output"
9
+ end
10
+ end
11
+ """
12
+ And a file named "consumer.rb" with:
13
+ """
14
+ class Consumer < HdlModule
15
+ def build
16
+ add_port "in1", width: 10, direction: "input"
17
+ end
18
+ end
19
+ """
20
+ And a file named "dut.rb" with:
21
+ """
22
+ class Dut < HdlModule
23
+
24
+ def build
25
+ add_instance Producer, "producer"
26
+ add_instance Consumer, "consumer"
27
+ producer.out1.connect "data"
28
+ consumer.in1.connect "data"
29
+ end
30
+
31
+ end
32
+ """
33
+ When I run `vgen leaf.rb dut.rb `
34
+ Then the file "dut.v" should contain:
35
+ """
36
+
37
+ module dut;
38
+
39
+ wire[9:0] data;
40
+
41
+ producer producer(.out1(data))
42
+ consumer consumer(.in1(data))
43
+
44
+ endmodule
45
+ """
46
+
@@ -0,0 +1,41 @@
1
+ Feature: Rename the input and output pins
2
+
3
+ Scenario: connect one leaf
4
+ Given a file named "leaf.rb" with:
5
+ """
6
+ class Leaf < HdlModule
7
+ def build
8
+ add_port "in1"
9
+ add_port "out1", direction: "output"
10
+ end
11
+ end
12
+ """
13
+ And a file named "dut.rb" with:
14
+ """
15
+ class Dut < HdlModule
16
+
17
+ def build
18
+ add_instance Leaf, "leaf1"
19
+ connect_port_to_pin leaf1.in1, "in"
20
+ connect_port_to_pin leaf1.out1, "out"
21
+ end
22
+
23
+ end
24
+ """
25
+
26
+ When I run `vgen leaf.rb dut.rb `
27
+ Then the file "dut.v" should contain:
28
+ """
29
+
30
+ module dut(in, out);
31
+ input in;
32
+ output out;
33
+
34
+ wire in;
35
+ wire out;
36
+
37
+ Leaf leaf1(.in1(in),
38
+ .out1(out));
39
+
40
+ endmodule
41
+ """
@@ -0,0 +1,61 @@
1
+ Feature: Create a simple fifo.
2
+
3
+ Scenario: Create a logical view
4
+ Given a file named "cntlr.rb" with:
5
+ """
6
+ class Cntlr < HdlModule
7
+ def build
8
+ add_port "rst"
9
+ add_port "clk"
10
+ add_port "push"
11
+ add_port "wena"
12
+ end
13
+ end
14
+ """
15
+ And a file named "memory.rb" with:
16
+ """
17
+ class Memory < HdlModule
18
+ def build
19
+ add_port Port.new("rst")
20
+ add_port Port.new("clk")
21
+ add_port Port.new("write_enable")
22
+ end
23
+ end
24
+ """
25
+ And a file named "fifo.rb" with:
26
+ """
27
+ class Fifo < HdlModule
28
+ def build
29
+ add_instance Cntlr, "cntlr1"
30
+ add_instance Memory, "memory1"
31
+ end
32
+
33
+ def connect
34
+ #Create the pin
35
+ connect cntlr1.wen, "write_enable"
36
+ end
37
+ end
38
+ """
39
+
40
+ When I run `vgen fifo.rb memory.rb fifo.rb `
41
+ Then the file "fifo.v" should contain:
42
+ """
43
+
44
+ module fifo(rst, clk, push);
45
+ input rst;
46
+ input clk;
47
+ input push;
48
+
49
+ wire rst;
50
+ wire clk;
51
+
52
+ Cntlr cntlr1(.rst(rst),
53
+ .clk(clk),
54
+ .wen(write_enable));
55
+
56
+ Memory memory1(.rst(rst),
57
+ .clk(clk),
58
+ .write_enable(write_enable));
59
+
60
+ endmodule
61
+ """
@@ -0,0 +1,48 @@
1
+ Feature: Invert the output pin and connect to input pin.
2
+
3
+ Scenario: Invert output
4
+ Given a file named "producer.rb" with:
5
+ """
6
+ class Producer < HdlModule
7
+ def build
8
+ add_port "out1", width: 10, direction: "output"
9
+ end
10
+ end
11
+ """
12
+ And a file named "consumer.rb" with:
13
+ """
14
+ class Consumer < HdlModule
15
+ def build
16
+ add_port "in1", width: 10, direction: "input"
17
+ end
18
+ end
19
+ """
20
+ And a file named "dut.rb" with:
21
+ """
22
+ class Dut < HdlModule
23
+
24
+ def build
25
+ add_instance Producer, "producer"
26
+ add_instance Consumer, "consumer"
27
+ producer.out1.connect "data"
28
+ add_instance InvGate, output: "data_inv", input: "data"
29
+ consumer.in1.connect "data_inv"
30
+ end
31
+
32
+ end
33
+ """
34
+ When I run `vgen leaf.rb dut.rb `
35
+ Then the file "dut.v" should contain:
36
+ """
37
+
38
+ module dut;
39
+
40
+ wire[9:0] data;
41
+
42
+ producer producer(.out1(data));
43
+ assign data_inv = ~data;
44
+ consumer consumer(.in1(data_inv));
45
+
46
+ endmodule
47
+ """
48
+
@@ -1,5 +1,7 @@
1
1
  require 'pathname'
2
+ require 'aruba/cucumber'
2
3
  root = Pathname.new(__FILE__).parent.parent.parent
3
4
 
4
5
  ENV['PATH'] = "#{root.join('bin').to_s}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
5
- puts ENV['PATH']
6
+
7
+ puts "done loading support env"
@@ -0,0 +1,60 @@
1
+ Feature: Add a leaf node.
2
+
3
+ Scenario: No ports in leaf
4
+ Given a file named "node.rb" with:
5
+ """
6
+ class Leaf < VerilogGen::HdlModule
7
+ set_module_name "leaf_module"
8
+ set_proxy true
9
+ end
10
+ class Node1 < VerilogGen::HdlModule
11
+ set_module_name "node1_module"
12
+ add_port "in", direction: "input", packed: "[3:0]", type: "wire"
13
+ add_port "out", direction: "output", packed: "[2:0]",type: "reg"
14
+ add_child_instance "leaf", Leaf
15
+ end
16
+ """
17
+ When I run `vgen -t Node1 node.rb`
18
+ Then a file named "node1_module.v" should exist
19
+ And a file named "leaf_module.v" should not exist
20
+
21
+ Scenario: Ports in leaf
22
+ Given a file named "node.rb" with:
23
+ """
24
+ class Leaf < VerilogGen::HdlModule
25
+ set_module_name "leaf_module"
26
+ set_proxy true
27
+ add_port "in", direction: "input", packed: "[3:0]", type: "wire"
28
+ add_port "out", direction: "output", packed: "[2:0]",type: "reg"
29
+ end
30
+ class Node1 < VerilogGen::HdlModule
31
+ set_module_name "node1_module"
32
+ add_port "in", direction: "input", packed: "[3:0]", type: "wire"
33
+ add_port "out", direction: "output", packed: "[2:0]",type: "reg"
34
+ add_child_instance "leaf", Leaf
35
+ end
36
+ """
37
+ When I run `vgen -t Node1 node.rb`
38
+ Then a file named "node1_module.v" should exist
39
+ And a file named "leaf_module.v" should not exist
40
+
41
+ Scenario: Multiple leaves
42
+ Given a file named "node.rb" with:
43
+ """
44
+ class Leaf < VerilogGen::HdlModule
45
+ set_module_name "leaf_module"
46
+ set_proxy true
47
+ add_port "in", direction: "input", packed: "[3:0]", type: "wire"
48
+ add_port "out", direction: "output", packed: "[2:0]",type: "reg"
49
+ end
50
+ class Node1 < VerilogGen::HdlModule
51
+ set_module_name "node1_module"
52
+ add_port "in", direction: "input", packed: "[3:0]", type: "wire"
53
+ add_port "out", direction: "output", packed: "[2:0]",type: "reg"
54
+ add_child_instance "leaf0", Leaf
55
+ add_child_instance "leaf1", Leaf
56
+ end
57
+ """
58
+ When I run `vgen -t Node1 node.rb`
59
+ Then a file named "node1_module.v" should exist
60
+ And a file named "leaf_module.v" should not exist
@@ -0,0 +1,24 @@
1
+ Feature: Generate a v2k code for demo fifo ctrl
2
+
3
+ Scenario: Demo fifo ctrl
4
+ Given a file named "fifo_ctrl.rb" with:
5
+ """
6
+ class Fifo_ctrl_4d < VerilogGen::HdlModule
7
+ set_file_name "fifo_ctrl.v"
8
+ set_module_name "fifo_ctrl_4d"
9
+ set_parameter DEPTH: 4
10
+ add_port "clk", direction: "input", type: "wire"
11
+ add_port "empty", direction: "output", type: "reg"
12
+ add_port "full", direction: "output", type: "reg"
13
+ add_port "mem_rd_addr", direction: "output", type: "reg", packed: "[1:0]", lhs: 1, rhs: 0
14
+ add_port "mem_rd_en", direction: "output", type: "wire"
15
+ add_port "mem_wr_addr", direction: "output", type: "reg", packed: "[1:0]", lhs: 1, rhs: 0
16
+ add_port "mem_wr_en", direction: "output", type: "wire"
17
+ add_port "pop", direction: "input", type: "wire"
18
+ add_port "push", direction: "input", type: "wire"
19
+ add_port "reset", direction: "input", type: "wire"
20
+ end
21
+
22
+ """
23
+ When I run `vgen -t Fifo_ctrl_4d fifo_ctrl.rb`
24
+ Then a file named "fifo_ctrl_4d.v" should exist
@@ -0,0 +1,9 @@
1
+ Feature: Hello World
2
+
3
+ Scenario: print banner
4
+ When I run `vgen`
5
+ Then it should fail with:
6
+ """
7
+ error: you must supply the top level class name.
8
+
9
+ """
@@ -0,0 +1,15 @@
1
+ Feature: Should not output leaf nodes.
2
+
3
+ Scenario: Leaf node
4
+ Given a file named "leaf.rb" with:
5
+ """
6
+ class Leaf < VerilogGen::HdlModule
7
+ set_proxy true
8
+ end
9
+ class Node < VerilogGen::HdlModule
10
+ set_proxy false
11
+ end
12
+ """
13
+ When I run `vgen -t Leaf leaf.rb`
14
+ Then a file named "leaf_module.v" should not exist
15
+ And a file named "node.v" should exist