ruby-vpi 16.0.1 → 17.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (247) hide show
  1. data/LICENSE +19 -19
  2. data/README +1 -1
  3. data/Rakefile +35 -32
  4. data/bin/convert.rb +28 -0
  5. data/bin/generate/design.rb +16 -0
  6. data/bin/generate/proto.rb +13 -0
  7. data/bin/generate/runner.rake +33 -0
  8. data/bin/generate/spec.rb +45 -0
  9. data/bin/generate.rb +177 -0
  10. data/bin/ruby-vpi +56 -0
  11. data/doc/Rakefile +20 -4
  12. data/doc/common.css +92 -33
  13. data/doc/common.inc +13 -0
  14. data/doc/common.tpl +42 -28
  15. data/doc/history.doc +11 -11
  16. data/doc/history.html +769 -248
  17. data/doc/history.inc +909 -0
  18. data/doc/history.rb +9 -0
  19. data/doc/history.yaml +69 -0
  20. data/doc/intro.inc +170 -178
  21. data/doc/lib/doc_format.rb +57 -144
  22. data/doc/lib/doc_proxy.rb +504 -88
  23. data/doc/lib/erb_content.rb +8 -8
  24. data/doc/lib/erb_proxy.rb +17 -17
  25. data/doc/manual.doc +626 -777
  26. data/doc/manual.html +1541 -1031
  27. data/doc/memo.doc +38 -36
  28. data/doc/memo.html +64 -28
  29. data/doc/readme.doc +4 -31
  30. data/doc/readme.html +221 -163
  31. data/doc/rss.erb +1 -1
  32. data/doc/rss.xml +73 -1761
  33. data/ext/Rakefile +6 -5
  34. data/ext/main.c +17 -15
  35. data/ext/relay.c +4 -7
  36. data/ext/relay.h +2 -2
  37. data/ext/swig_vpi.h +2 -2
  38. data/ext/swig_vpi.i +1 -2
  39. data/ext/swig_wrap.cin +12 -16
  40. data/ext/vlog.c +5 -5
  41. data/ext/vlog.h +2 -2
  42. data/lib/ruby-vpi/erb.rb +3 -3
  43. data/lib/ruby-vpi/float.rb +2 -2
  44. data/lib/ruby-vpi/rcov.rb +5 -7
  45. data/lib/ruby-vpi/runner.rb +43 -41
  46. data/lib/ruby-vpi/runner_boot_loader.rb +117 -0
  47. data/lib/ruby-vpi/runner_proxy.rb +6 -8
  48. data/lib/ruby-vpi/util.rb +10 -0
  49. data/lib/ruby-vpi/verilog_parser.rb +28 -56
  50. data/lib/ruby-vpi/vpi.rb +168 -123
  51. data/lib/ruby-vpi.rb +22 -143
  52. data/ref/c/annotated.html +1 -1
  53. data/ref/c/common_8h.html +1 -1
  54. data/ref/c/files.html +1 -1
  55. data/ref/c/functions.html +1 -1
  56. data/ref/c/functions_vars.html +1 -1
  57. data/ref/c/globals.html +1 -1
  58. data/ref/c/globals_0x63.html +1 -1
  59. data/ref/c/globals_0x65.html +1 -1
  60. data/ref/c/globals_0x66.html +1 -1
  61. data/ref/c/globals_0x6d.html +1 -1
  62. data/ref/c/globals_0x70.html +1 -1
  63. data/ref/c/globals_0x72.html +1 -1
  64. data/ref/c/globals_0x73.html +1 -1
  65. data/ref/c/globals_0x74.html +1 -1
  66. data/ref/c/globals_0x76.html +1 -1
  67. data/ref/c/globals_0x78.html +1 -1
  68. data/ref/c/globals_defs.html +1 -1
  69. data/ref/c/globals_defs_0x65.html +1 -1
  70. data/ref/c/globals_defs_0x70.html +1 -1
  71. data/ref/c/globals_defs_0x76.html +1 -1
  72. data/ref/c/globals_defs_0x78.html +1 -1
  73. data/ref/c/globals_enum.html +1 -1
  74. data/ref/c/globals_eval.html +1 -1
  75. data/ref/c/globals_func.html +1 -1
  76. data/ref/c/globals_type.html +1 -1
  77. data/ref/c/globals_vars.html +1 -1
  78. data/ref/c/index.html +1 -1
  79. data/ref/c/main_8c.html +1 -1
  80. data/ref/c/main_8h.html +1 -1
  81. data/ref/c/relay_8c.html +1 -1
  82. data/ref/c/relay_8h.html +1 -1
  83. data/ref/c/structt__cb__data.html +1 -1
  84. data/ref/c/structt__vpi__delay.html +1 -1
  85. data/ref/c/structt__vpi__error__info.html +1 -1
  86. data/ref/c/structt__vpi__strengthval.html +1 -1
  87. data/ref/c/structt__vpi__systf__data.html +1 -1
  88. data/ref/c/structt__vpi__time.html +1 -1
  89. data/ref/c/structt__vpi__value.html +1 -1
  90. data/ref/c/structt__vpi__vecval.html +1 -1
  91. data/ref/c/structt__vpi__vlog__info.html +1 -1
  92. data/ref/c/verilog_8h.html +1 -1
  93. data/ref/c/vlog_8c.html +1 -1
  94. data/ref/c/vlog_8h.html +1 -1
  95. data/ref/c/vpi__user_8h.html +1 -1
  96. data/ref/ruby/classes/ERB.html +5 -5
  97. data/ref/ruby/classes/ERB.src/{M000024.html → M000026.html} +0 -0
  98. data/ref/ruby/classes/FileUtils.html +11 -11
  99. data/ref/ruby/classes/FileUtils.src/{M000025.html → M000027.html} +0 -0
  100. data/ref/ruby/classes/FileUtils.src/{M000026.html → M000028.html} +0 -0
  101. data/ref/ruby/classes/Float.html +6 -6
  102. data/ref/ruby/classes/Float.src/{M000020.html → M000021.html} +0 -0
  103. data/ref/ruby/classes/Integer.html +65 -65
  104. data/ref/ruby/classes/Integer.src/M000009.html +12 -5
  105. data/ref/ruby/classes/Integer.src/M000010.html +5 -5
  106. data/ref/ruby/classes/Integer.src/M000011.html +5 -5
  107. data/ref/ruby/classes/Integer.src/M000012.html +5 -5
  108. data/ref/ruby/classes/Integer.src/M000013.html +5 -5
  109. data/ref/ruby/classes/Integer.src/M000014.html +18 -0
  110. data/ref/ruby/classes/Integer.src/M000017.html +12 -18
  111. data/ref/ruby/classes/Integer.src/M000018.html +18 -12
  112. data/ref/ruby/classes/Integer.src/M000019.html +12 -17
  113. data/ref/ruby/classes/Integer.src/M000020.html +30 -0
  114. data/ref/ruby/classes/RDoc.html +5 -5
  115. data/ref/ruby/classes/RDoc.src/{M000053.html → M000058.html} +0 -0
  116. data/ref/ruby/classes/{RubyVpi/Config.html → RubyVPI.html} +20 -6
  117. data/ref/ruby/classes/String.html +34 -15
  118. data/ref/ruby/classes/String.src/M000022.html +5 -28
  119. data/ref/ruby/classes/String.src/M000023.html +5 -5
  120. data/ref/ruby/classes/String.src/{M000021.html → M000024.html} +0 -0
  121. data/ref/ruby/classes/String.src/M000025.html +41 -0
  122. data/ref/ruby/classes/VerilogParser/Module/Port.html +16 -36
  123. data/ref/ruby/classes/VerilogParser/Module/Port.src/M000006.html +10 -5
  124. data/ref/ruby/classes/VerilogParser/Module/Port.src/{M000004.html → M000007.html} +4 -4
  125. data/ref/ruby/classes/VerilogParser/Module/Port.src/{M000005.html → M000008.html} +4 -4
  126. data/ref/ruby/classes/VerilogParser/Module.html +28 -9
  127. data/ref/ruby/classes/VerilogParser/Module.src/M000005.html +29 -0
  128. data/ref/ruby/classes/VerilogParser.html +5 -39
  129. data/ref/ruby/classes/VerilogParser.src/M000004.html +26 -0
  130. data/ref/ruby/classes/Vpi/Handle.html +179 -77
  131. data/ref/ruby/classes/Vpi/Handle.src/M000035.html +18 -0
  132. data/ref/ruby/classes/Vpi/Handle.src/M000036.html +5 -5
  133. data/ref/ruby/classes/Vpi/Handle.src/M000037.html +5 -5
  134. data/ref/ruby/classes/Vpi/Handle.src/M000038.html +5 -5
  135. data/ref/ruby/classes/Vpi/Handle.src/M000039.html +5 -5
  136. data/ref/ruby/classes/Vpi/Handle.src/M000040.html +5 -8
  137. data/ref/ruby/classes/Vpi/Handle.src/M000041.html +5 -8
  138. data/ref/ruby/classes/Vpi/Handle.src/M000042.html +5 -9
  139. data/ref/ruby/classes/Vpi/Handle.src/M000043.html +8 -31
  140. data/ref/ruby/classes/Vpi/Handle.src/M000044.html +8 -74
  141. data/ref/ruby/classes/Vpi/Handle.src/M000045.html +9 -17
  142. data/ref/ruby/classes/Vpi/Handle.src/M000046.html +31 -11
  143. data/ref/ruby/classes/Vpi/Handle.src/M000047.html +86 -0
  144. data/ref/ruby/classes/Vpi/Handle.src/M000048.html +17 -18
  145. data/ref/ruby/classes/Vpi/Handle.src/M000050.html +18 -0
  146. data/ref/ruby/classes/Vpi/Handle.src/M000051.html +24 -0
  147. data/ref/ruby/classes/Vpi/Handle.src/M000053.html +31 -0
  148. data/ref/ruby/classes/Vpi/Handle.src/M000054.html +89 -0
  149. data/ref/ruby/classes/Vpi/S_vpi_time.html +16 -16
  150. data/ref/ruby/classes/Vpi/S_vpi_time.src/{M000050.html → M000055.html} +4 -4
  151. data/ref/ruby/classes/Vpi/S_vpi_time.src/{M000051.html → M000056.html} +5 -5
  152. data/ref/ruby/classes/Vpi/S_vpi_value.html +15 -15
  153. data/ref/ruby/classes/Vpi/S_vpi_value.src/{M000035.html → M000032.html} +5 -5
  154. data/ref/ruby/classes/Vpi/S_vpi_value.src/M000033.html +5 -5
  155. data/ref/ruby/classes/Vpi/S_vpi_value.src/M000034.html +5 -5
  156. data/ref/ruby/classes/Vpi.html +6 -42
  157. data/ref/ruby/classes/Vpi.src/M000029.html +15 -5
  158. data/ref/ruby/classes/Vpi.src/M000030.html +24 -24
  159. data/ref/ruby/classes/Vpi.src/M000031.html +6 -8
  160. data/ref/ruby/created.rid +1 -1
  161. data/ref/ruby/files/bin/{header_to_ruby_rb.html → convert_rb.html} +5 -5
  162. data/ref/ruby/files/bin/{generate_test_rb.html → generate_rb.html} +8 -21
  163. data/ref/ruby/files/lib/ruby-vpi/erb_rb.html +1 -1
  164. data/ref/ruby/files/lib/ruby-vpi/float_rb.html +1 -1
  165. data/ref/ruby/files/lib/ruby-vpi/integer_rb.html +1 -1
  166. data/ref/ruby/files/lib/ruby-vpi/rake_rb.html +1 -1
  167. data/ref/ruby/files/lib/ruby-vpi/rcov_rb.html +1 -1
  168. data/ref/ruby/files/lib/ruby-vpi/rdoc_rb.html +1 -1
  169. data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.html +197 -0
  170. data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.src/M000001.html +17 -0
  171. data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.src/M000002.html +18 -0
  172. data/ref/ruby/files/lib/ruby-vpi/runner_proxy_rb.html +1 -1
  173. data/ref/ruby/files/lib/ruby-vpi/runner_rb.html +6 -19
  174. data/ref/ruby/files/lib/ruby-vpi/util_rb.html +101 -0
  175. data/ref/ruby/files/lib/ruby-vpi/verilog_parser_rb.html +8 -1
  176. data/ref/ruby/files/lib/ruby-vpi/vpi_rb.html +1 -1
  177. data/ref/ruby/files/lib/ruby-vpi_rb.html +2 -14
  178. data/ref/ruby/fr_class_index.html +1 -3
  179. data/ref/ruby/fr_file_index.html +4 -2
  180. data/ref/ruby/fr_method_index.html +56 -51
  181. data/ref/ruby/index.html +1 -1
  182. data/samp/counter/RSpec/Rakefile +1 -0
  183. data/samp/counter/RSpec/counter_design.rb +15 -0
  184. data/samp/counter/RSpec/counter_proto.rb +10 -0
  185. data/samp/counter/RSpec/counter_runner.rake +44 -0
  186. data/samp/counter/RSpec/counter_spec.rb +39 -0
  187. data/samp/counter/Rakefile +1 -1
  188. data/samp/counter/counter.v +7 -7
  189. data/samp/counter/xUnit/Rakefile +1 -0
  190. data/samp/counter/xUnit/counter_bench.rb +95 -0
  191. data/samp/counter/{counter_xunit_bench.v → xUnit/counter_bench.v} +0 -0
  192. data/samp/counter/xUnit/counter_design.rb +15 -0
  193. data/samp/counter/xUnit/counter_proto.rb +10 -0
  194. data/samp/counter/xUnit/counter_runner.rake +44 -0
  195. data/samp/counter/{counter_xunit_spec.rb → xUnit/counter_spec.rb} +9 -9
  196. data/samp/pipelined_alu/Rakefile +1 -1
  197. data/samp/pipelined_alu/TestHw5UnitModel.rb +4 -5
  198. data/samp/pipelined_alu/hw5_unit.v +55 -85
  199. data/samp/pipelined_alu/hw5_unit_design.rb +51 -0
  200. data/samp/pipelined_alu/hw5_unit_proto.rb +4 -0
  201. data/samp/pipelined_alu/hw5_unit_runner.rake +43 -0
  202. data/samp/pipelined_alu/hw5_unit_spec.rb +64 -0
  203. data/samp/register_file/LICENSE +20 -0
  204. data/samp/register_file/README +4 -0
  205. data/samp/register_file/Rakefile +1 -0
  206. data/samp/register_file/register_file.v +18 -0
  207. data/samp/register_file/register_file_design.rb +11 -0
  208. data/samp/register_file/register_file_proto.rb +11 -0
  209. data/samp/register_file/register_file_runner.rake +43 -0
  210. data/samp/register_file/register_file_spec.rb +58 -0
  211. metadata +78 -66
  212. data/bin/generate_test.rb +0 -200
  213. data/bin/generate_test_tpl/bench.rb +0 -89
  214. data/bin/generate_test_tpl/bench.v +0 -26
  215. data/bin/generate_test_tpl/design.rb +0 -11
  216. data/bin/generate_test_tpl/proto.rb +0 -16
  217. data/bin/generate_test_tpl/runner.rake +0 -42
  218. data/bin/generate_test_tpl/spec.rb +0 -37
  219. data/bin/header_to_ruby.rb +0 -27
  220. data/ref/ruby/classes/Integer.src/M000008.html +0 -25
  221. data/ref/ruby/classes/Integer.src/M000016.html +0 -25
  222. data/ref/ruby/classes/RubyVpi.html +0 -199
  223. data/ref/ruby/classes/RubyVpi.src/M000027.html +0 -121
  224. data/ref/ruby/classes/VerilogParser/Module/Parameter.html +0 -160
  225. data/ref/ruby/classes/VerilogParser/Module/Parameter.src/M000007.html +0 -19
  226. data/ref/ruby/classes/VerilogParser/Module/Port.src/M000003.html +0 -21
  227. data/ref/ruby/classes/VerilogParser/Module.src/M000002.html +0 -34
  228. data/ref/ruby/classes/VerilogParser.src/M000001.html +0 -34
  229. data/ref/ruby/classes/Vpi/Handle.src/M000049.html +0 -69
  230. data/ref/ruby/classes/Vpi.src/M000028.html +0 -28
  231. data/ref/ruby/classes/Vpi.src/M000032.html +0 -22
  232. data/samp/counter/counter_rspec_bench.rb +0 -86
  233. data/samp/counter/counter_rspec_bench.v +0 -9
  234. data/samp/counter/counter_rspec_design.rb +0 -8
  235. data/samp/counter/counter_rspec_proto.rb +0 -13
  236. data/samp/counter/counter_rspec_runner.rake +0 -52
  237. data/samp/counter/counter_rspec_spec.rb +0 -39
  238. data/samp/counter/counter_xunit_bench.rb +0 -86
  239. data/samp/counter/counter_xunit_design.rb +0 -8
  240. data/samp/counter/counter_xunit_proto.rb +0 -13
  241. data/samp/counter/counter_xunit_runner.rake +0 -52
  242. data/samp/pipelined_alu/hw5_unit_test_bench.rb +0 -86
  243. data/samp/pipelined_alu/hw5_unit_test_bench.v +0 -14
  244. data/samp/pipelined_alu/hw5_unit_test_design.rb +0 -61
  245. data/samp/pipelined_alu/hw5_unit_test_proto.rb +0 -7
  246. data/samp/pipelined_alu/hw5_unit_test_runner.rake +0 -52
  247. data/samp/pipelined_alu/hw5_unit_test_spec.rb +0 -68
@@ -1,86 +0,0 @@
1
- # This file is the Ruby side of the bench.
2
-
3
- require 'rubygems'
4
- require 'ruby-vpi'
5
-
6
- RubyVpi.init_bench :Hw5_unit, :xUnit do
7
- ##
8
- # This block is executed whenever Vpi::simulate is invoked.
9
- #
10
- # It simulates the design under test by (typically) toggling
11
- # the clock signal, as demonstrated below.
12
- ##
13
-
14
- ##
15
- # We are currently here (marked by the ! signs):
16
- #
17
- # !
18
- # !
19
- # ! ____ ____ ____ ____
20
- # ___!/ \____/ \____/ \____/ \
21
- # !
22
- # !
23
- #
24
- ##
25
-
26
- Hw5_unit.clk.intVal = 1
27
-
28
- ##
29
- # After setting the clock signal to high, we are here:
30
- #
31
- # !
32
- # !
33
- # !____ ____ ____ ____
34
- # ____/! \____/ \____/ \____/ \
35
- # !
36
- # !
37
- #
38
- ##
39
-
40
- advance_time
41
-
42
- ##
43
- # After advancing the time, we are here:
44
- #
45
- # !
46
- # !
47
- # ____! ____ ____ ____
48
- # ____/ !\____/ \____/ \____/ \
49
- # !
50
- # !
51
- #
52
- ##
53
-
54
- Hw5_unit.clk.intVal = 0
55
-
56
- ##
57
- # After setting the clock signal to low, we are here:
58
- #
59
- # !
60
- # !
61
- # ____ ! ____ ____ ____
62
- # ____/ \!____/ \____/ \____/ \
63
- # !
64
- # !
65
- #
66
- ##
67
-
68
- advance_time
69
-
70
- ##
71
- # After advancing the time, we are here:
72
- #
73
- #
74
- # !
75
- # !
76
- # ____ ! ____ ____ ____
77
- # ____/ \____!/ \____/ \____/ \
78
- # !
79
- # !
80
- #
81
- ##
82
-
83
- ##
84
- # This process repeats when Vpi::simulate is invoked again.
85
- ##
86
- end
@@ -1,14 +0,0 @@
1
- // This file is the Verilog side of the bench.
2
- module hw5_unit_test_bench;
3
- reg clk;
4
- reg reset;
5
- reg [`DATABITS-1:0] in_databits;
6
- reg [`WIDTH-1:0] a;
7
- reg [`WIDTH-1:0] b;
8
- reg [1:0] in_op;
9
- wire [`WIDTH-1:0] res;
10
- wire [`DATABITS-1:0] out_databits;
11
- wire [1:0] out_op;
12
-
13
- hw5_unit hw5_unit_test_bench_design(.clk(clk), .reset(reset), .in_databits(in_databits), .a(a), .b(b), .in_op(in_op), .res(res), .out_databits(out_databits), .out_op(out_op));
14
- endmodule
@@ -1,61 +0,0 @@
1
- # This is a Ruby interface to the design under test.
2
-
3
- WIDTH = 32
4
- DATABITS = 7
5
- OP_NOP = 0
6
- OP_ADD = 1
7
- OP_SUB = 2
8
- OP_MULT = 3
9
- OPERATIONS = (OP_NOP..OP_MULT).to_a
10
-
11
- # Number of cycles needed to reset this design.
12
- RESET_DELAY = 5
13
-
14
- # This method resets the design under test.
15
- def Hw5_unit.reset!
16
- reset.hexStrVal = 'x'
17
- in_databits.hexStrVal = 'x'
18
- a.hexStrVal = 'x'
19
- b.hexStrVal = 'x'
20
- in_op.hexStrVal = 'x'
21
-
22
-
23
- reset.intVal = 1
24
-
25
- RESET_DELAY.times do
26
- simulate
27
- end
28
-
29
- reset.intVal = 0
30
- end
31
-
32
-
33
- # Represents an ALU operation.
34
- class Operation
35
- attr_accessor :type, :tag, :arg1, :arg2, :stage, :result
36
-
37
- def initialize(type, tag, arg1 = 0, arg2 = 0)
38
- raise ArgumentError unless OPERATIONS.include? type
39
-
40
- @type = type
41
- @tag = tag
42
- @arg1 = arg1
43
- @arg2 = arg2
44
-
45
- @stage = 0
46
- end
47
-
48
- # Computes the result of this operation.
49
- def compute
50
- case @type
51
- when OP_ADD
52
- @arg1 + @arg2
53
-
54
- when OP_SUB
55
- @arg1 - @arg2
56
-
57
- when OP_MULT
58
- @arg1 * @arg2
59
- end
60
- end
61
- end
@@ -1,7 +0,0 @@
1
- # This is a prototype of the design under test.
2
-
3
- # When prototyping is enabled, Vpi::advance_time invokes this
4
- # method instead of transferring control to the Verilog simulator.
5
- def Hw5_unit.simulate!
6
- raise NotImplementedError, "Prototype is not yet implemented."
7
- end
@@ -1,52 +0,0 @@
1
- # This file runs the test.
2
-
3
- # These are Verilog source files that need to be loaded
4
- # by the simulator before they can be simulated.
5
- SIMULATOR_SOURCES = [
6
- 'hw5_unit.v',
7
- 'hw5_unit_test_bench.v',
8
- ]
9
-
10
- # These are paths to directories which contain the
11
- # sources listed above, the files they `include, or both.
12
- SIMULATOR_INCLUDES = []
13
-
14
- # This specifies the "top module" that is to be simulated.
15
- SIMULATOR_TARGET = 'hw5_unit_test_bench'
16
-
17
- # These are command-line arguments for the simulator.
18
- # They can be specified as a string or an array of strings:
19
- #
20
- # :cver => "this is one single argument",
21
- # :cver => ['these', 'are', 'separate', 'arguments'],
22
- # :cver => %w[these are also separate arguments],
23
- #
24
- SIMULATOR_ARGUMENTS = {
25
- # GPL Cver
26
- :cver => '',
27
-
28
- # Icarus Verilog
29
- :ivl => '',
30
-
31
- # Synopsys VCS
32
- :vcs => '',
33
-
34
- # Mentor Modelsim
35
- :vsim => '',
36
-
37
- # Cadence NC-Sim
38
- :ncsim => '',
39
-
40
- }
41
-
42
- # This task is invoked _before_ the simulator runs.
43
- # It can be used to make preprations, such as converting
44
- # Verilog header files into Ruby, for the simulation.
45
- task :setup do
46
- # To learn how to write Rake tasks, please see:
47
- # http://docs.rubyrake.org/read/chapter/4#page16
48
- end
49
-
50
- # This command loads the Ruby-VPI runner template, which
51
- # runs the simulator according to the information above.
52
- require 'ruby-vpi/runner'
@@ -1,68 +0,0 @@
1
- # This file is a behavioral specification for the design under test.
2
- #--
3
- # Copyright 2006 Suraj N. Kurapati
4
- # See the file named LICENSE for details.
5
-
6
- require 'int_gen'
7
-
8
- class Hw5_unit_test_spec < Test::Unit::TestCase
9
- # Number of input sequences to test.
10
- NUM_TESTS = 4000
11
-
12
- # Bitmask capable of capturing ALU result.
13
- ALU_RESULT_MASK = (2 ** WIDTH) - 1
14
-
15
- # Upper limit of values allowed for an operation's tag.
16
- OPERATION_TAG_LIMIT = 2 ** DATABITS
17
-
18
- def setup
19
- Hw5_unit.reset!
20
- @intGen = IntegerGenerator.new(WIDTH)
21
- end
22
-
23
- def test_pipeline
24
- issuedOps = []
25
- numIssued = numVerified = 0
26
-
27
- until numVerified == NUM_TESTS
28
- # issue a new operation
29
- if numIssued < NUM_TESTS
30
- op = Operation.new(
31
- OPERATIONS[rand(OPERATIONS.size)],
32
- numIssued % OPERATION_TAG_LIMIT,
33
- @intGen.random,
34
- @intGen.random
35
- )
36
-
37
- Hw5_unit.a.intVal = op.arg1
38
- Hw5_unit.b.intVal = op.arg2
39
- Hw5_unit.in_op.intVal = op.type
40
- Hw5_unit.in_databits.intVal = op.tag
41
-
42
- issuedOps << op
43
- numIssued += 1
44
- end
45
-
46
- simulate
47
-
48
- # verify result of finished operation
49
- unless Hw5_unit.out_databits.x?
50
- finishedOp = Operation.new(
51
- Hw5_unit.out_op.intVal,
52
- Hw5_unit.out_databits.intVal
53
- )
54
- finishedOp.result = Hw5_unit.res.intVal & ALU_RESULT_MASK
55
-
56
- expectedOp = issuedOps.shift
57
- assert_equal expectedOp.type, finishedOp.type, "incorrect operation"
58
- assert_equal expectedOp.tag, finishedOp.tag, "incorrect tag"
59
-
60
- unless finishedOp.type == OP_NOP
61
- assert_equal expectedOp.compute & ALU_RESULT_MASK, finishedOp.result, "incorrect result"
62
- end
63
-
64
- numVerified += 1
65
- end
66
- end
67
- end
68
- end