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
@@ -0,0 +1,44 @@
1
+ # Array of paths and shell globs (see the Dir.glob method's documentation for
2
+ # details) to source files and directories that contain source files. These
3
+ # source files will be loaded by the simulator before the simulation begins.
4
+ SIMULATOR_SOURCES = FileList[
5
+ 'counter.v',
6
+ '..'
7
+ ]
8
+
9
+ # Command-line arguments for the simulator. These arguments can be
10
+ # specified as a string or an array of strings, as demonstrated below:
11
+ #
12
+ # :cver => "this is a single string argument",
13
+ # :cver => ["these", "are", "separate", "arguments"],
14
+ # :cver => %w[these are also separate arguments],
15
+ #
16
+ SIMULATOR_ARGUMENTS = {
17
+ # GPL Cver
18
+ :cver => "",
19
+
20
+ # Icarus Verilog
21
+ :ivl => "",
22
+
23
+ # Synopsys VCS
24
+ :vcs => "",
25
+
26
+ # Mentor Modelsim
27
+ :vsim => "",
28
+
29
+ # Cadence NC-Sim
30
+ :ncsim => "",
31
+
32
+ }
33
+
34
+ # This task is invoked before the simulator runs. It
35
+ # can be used to make preprations, such as converting
36
+ # Verilog header files into Ruby, for the simulation.
37
+ task :setup do
38
+ # To learn how to write Rake tasks, please see:
39
+ # http://docs.rubyrake.org/read/chapter/4#page16
40
+ end
41
+
42
+ # This command loads the Ruby-VPI runner template,
43
+ # which runs the simulator using the above parameters.
44
+ require 'ruby-vpi/runner'
@@ -1,7 +1,7 @@
1
- # This file is a behavioral specification for the design under test.
1
+ require 'test/unit'
2
2
 
3
3
  # lowest upper bound of counter's value
4
- LIMIT = 2 ** Counter.Size.intVal
4
+ LIMIT = 2 ** Counter::Size
5
5
 
6
6
  # maximum allowed value for a counter
7
7
  MAX = LIMIT - 1
@@ -12,13 +12,13 @@ class ResettedCounterValue < Test::Unit::TestCase
12
12
  end
13
13
 
14
14
  def test_zero
15
- assert_equal 0, Counter.count.intVal
15
+ assert_equal( 0, Counter.count.intVal )
16
16
  end
17
17
 
18
18
  def test_increment
19
19
  LIMIT.times do |i|
20
- assert_equal i, Counter.count.intVal
21
- simulate # increment the counter
20
+ assert_equal( i, Counter.count.intVal )
21
+ Counter.cycle! # increment the counter
22
22
  end
23
23
  end
24
24
  end
@@ -28,12 +28,12 @@ class MaximumCounterValue < Test::Unit::TestCase
28
28
  Counter.reset!
29
29
 
30
30
  # increment the counter to maximum value
31
- MAX.times {simulate}
32
- assert_equal MAX, Counter.count.intVal
31
+ MAX.times { Counter.cycle! }
32
+ assert_equal( MAX, Counter.count.intVal )
33
33
  end
34
34
 
35
35
  def test_overflow
36
- simulate # increment the counter
37
- assert_equal 0, Counter.count.intVal
36
+ Counter.cycle! # increment the counter
37
+ assert_equal( 0, Counter.count.intVal )
38
38
  end
39
39
  end
@@ -1 +1 @@
1
- require 'ruby-vpi/runner_proxy'
1
+ require 'ruby-vpi/runner_proxy'
@@ -2,17 +2,16 @@
2
2
  # Copyright 2006 Suraj N. Kurapati
3
3
  # See the file named LICENSE for details.
4
4
 
5
- require 'InputGenerator'
5
+ require 'int_gen'
6
6
  require 'Hw5UnitModel'
7
7
  require 'test/unit'
8
- require 'pp'
9
8
 
10
9
  class TestHw5UnitModel < Test::Unit::TestCase
11
10
  NUM_VECTORS = 4000
12
11
 
13
12
  def setup
14
13
  @model = Hw5UnitModel.new
15
- @ingen = InputGenerator.new 32
14
+ @ingen = IntegerGenerator.new 32
16
15
  end
17
16
 
18
17
  def test_reset
@@ -28,8 +27,8 @@ class TestHw5UnitModel < Test::Unit::TestCase
28
27
  inputQueue << Hw5UnitModel::Operation.new(
29
28
  Hw5UnitModel::OPERATIONS[rand(Hw5UnitModel::OPERATIONS.size)],
30
29
  i,
31
- @ingen.gen.abs,
32
- @ingen.gen.abs
30
+ @ingen.random.abs,
31
+ @ingen.random.abs
33
32
  )
34
33
  end
35
34
 
@@ -3,161 +3,131 @@
3
3
  See the file named LICENSE for details.
4
4
  */
5
5
 
6
- `define WIDTH 32
7
- `define DATABITS 7
8
- `define OP_NOP 0
9
- `define OP_ADD 1
10
- `define OP_SUB 2
11
- `define OP_MULT 3
12
-
13
- module hw5_unit(
14
- input clk
15
- , input reset
16
-
17
- // inputs
18
- , input [`DATABITS-1:0] in_databits
19
- , input [`WIDTH-1:0] a
20
- , input [`WIDTH-1:0] b
21
- , input [1:0] in_op
22
-
23
- // outputs
24
- , output reg [`WIDTH-1:0] res
25
- , output reg [`DATABITS-1:0] out_databits
26
- , output reg [1:0] out_op
6
+ module hw5_unit
7
+ #(parameter WIDTH = 32,
8
+ parameter DATABITS = 7,
9
+ parameter OP_NOP = 0,
10
+ parameter OP_ADD = 1,
11
+ parameter OP_SUB = 2,
12
+ parameter OP_MULT = 3)
13
+ ( input clk,
14
+ input reset,
15
+
16
+ input [DATABITS-1:0] in_databits,
17
+ input [WIDTH-1:0] a,
18
+ input [WIDTH-1:0] b,
19
+ input [1:0] in_op,
20
+
21
+ output reg [WIDTH-1:0] res,
22
+ output reg [DATABITS-1:0] out_databits,
23
+ output reg [1:0] out_op
27
24
  );
28
25
 
29
26
 
30
27
  /* PHASE 0: perform the ALU operations */
31
28
 
32
29
  // operation ID
33
- reg [`DATABITS-1:0] in_databits_phase0;
34
- reg [1:0] in_op_phase0;
30
+ reg [DATABITS-1:0] in_databits_phase0;
31
+ reg [1:0] in_op_phase0;
35
32
 
36
33
  always @(*) begin
37
- in_databits_phase0 = in_databits;
38
- in_op_phase0 = in_op;
34
+ in_databits_phase0 = in_databits;
35
+ in_op_phase0 = in_op;
39
36
  end
40
37
 
41
38
  // addition
42
- reg [`WIDTH-1:0] add_result_phase0;
39
+ reg [WIDTH-1:0] add_result_phase0;
43
40
 
44
41
  always @(*) begin
45
42
  add_result_phase0 = a + b;
46
43
  end
47
44
 
48
45
  // subtraction
49
- reg [`WIDTH-1:0] sub_result_phase0;
46
+ reg [WIDTH-1:0] sub_result_phase0;
50
47
 
51
48
  always @(*) begin
52
49
  sub_result_phase0 = a - b;
53
50
  end
54
51
 
55
52
  // multiplication
56
- reg [`WIDTH-1:0] mul_result_phase0;
53
+ reg [WIDTH-1:0] mul_result_phase0;
57
54
 
58
55
  always @(*) begin
59
56
  mul_result_phase0 = a * b;
60
57
  end
61
58
 
62
59
 
63
- // always @(posedge clk) begin
64
- // $display("in_databits_phase0 => %d", in_databits_phase0);
65
- // $display("in_op_phase0 => %d", in_op_phase0);
66
- // $display("add_result_phase0 => %d", add_result_phase0);
67
- // $display("sub_result_phase0 => %d", sub_result_phase0);
68
- // $display("mul_result_phase0 => %d", mul_result_phase0);
69
- // end
70
-
71
-
72
60
  /* PHASE 1: delay the ALU results */
73
61
 
74
- reg [`DATABITS-1:0] in_databits_phase1;
75
- reg [1:0] in_op_phase1;
62
+ reg [DATABITS-1:0] in_databits_phase1;
63
+ reg [1:0] in_op_phase1;
76
64
 
77
- reg [`WIDTH-1:0] add_result_phase1;
78
- reg [`WIDTH-1:0] sub_result_phase1;
79
- reg [`WIDTH-1:0] mul_result_phase1;
65
+ reg [WIDTH-1:0] add_result_phase1;
66
+ reg [WIDTH-1:0] sub_result_phase1;
67
+ reg [WIDTH-1:0] mul_result_phase1;
80
68
 
81
69
  always @(posedge clk) begin
82
70
  in_databits_phase1 <= in_databits_phase0;
83
- in_op_phase1 <= in_op_phase0;
71
+ in_op_phase1 <= in_op_phase0;
84
72
 
85
- add_result_phase1 <= add_result_phase0;
86
- sub_result_phase1 <= sub_result_phase0;
87
- mul_result_phase1 <= mul_result_phase0;
73
+ add_result_phase1 <= add_result_phase0;
74
+ sub_result_phase1 <= sub_result_phase0;
75
+ mul_result_phase1 <= mul_result_phase0;
88
76
  end
89
77
 
90
- // always @(posedge clk) begin
91
- // $display("in_databits_phase1 => %d", in_databits_phase1);
92
- // $display("in_op_phase1 => %d", in_op_phase1);
93
- // $display("add_result_phase1 => %d", add_result_phase1);
94
- // $display("sub_result_phase1 => %d", sub_result_phase1);
95
- // $display("mul_result_phase1 => %d", mul_result_phase1);
96
- // end
97
-
98
78
 
99
79
  /* PHASE 2: delay the ALU results */
100
80
 
101
- reg [`DATABITS-1:0] in_databits_phase2;
102
- reg [1:0] in_op_phase2;
81
+ reg [DATABITS-1:0] in_databits_phase2;
82
+ reg [1:0] in_op_phase2;
103
83
 
104
- reg [`WIDTH-1:0] add_result_phase2;
105
- reg [`WIDTH-1:0] sub_result_phase2;
106
- reg [`WIDTH-1:0] mul_result_phase2;
84
+ reg [WIDTH-1:0] add_result_phase2;
85
+ reg [WIDTH-1:0] sub_result_phase2;
86
+ reg [WIDTH-1:0] mul_result_phase2;
107
87
 
108
88
  always @(posedge clk) begin
109
89
  in_databits_phase2 <= in_databits_phase1;
110
- in_op_phase2 <= in_op_phase1;
90
+ in_op_phase2 <= in_op_phase1;
111
91
 
112
- add_result_phase2 <= add_result_phase1;
113
- sub_result_phase2 <= sub_result_phase1;
114
- mul_result_phase2 <= mul_result_phase1;
92
+ add_result_phase2 <= add_result_phase1;
93
+ sub_result_phase2 <= sub_result_phase1;
94
+ mul_result_phase2 <= mul_result_phase1;
115
95
  end
116
96
 
117
- // always @(posedge clk) begin
118
- // $display("in_databits_phase2 => %d", in_databits_phase2);
119
- // $display("in_op_phase2 => %d", in_op_phase2);
120
- // $display("add_result_phase2 => %d", add_result_phase2);
121
- // $display("sub_result_phase2 => %d", sub_result_phase2);
122
- // $display("mul_result_phase2 => %d", mul_result_phase2);
123
- // end
124
-
125
97
 
126
98
  /* PHASE 3: produce the outputs */
127
99
 
128
- reg [`DATABITS-1:0] out_databits_next;
129
- reg [1:0] out_op_next;
130
- reg [`WIDTH-1:0] res_next;
100
+ reg [DATABITS-1:0] out_databits_next;
101
+ reg [1:0] out_op_next;
102
+ reg [WIDTH-1:0] res_next;
131
103
 
132
104
  always @(*) begin
133
- if (reset) begin
134
- out_op_next = `OP_NOP;
135
- end else begin
105
+ if (reset)
106
+ out_op_next = OP_NOP;
107
+ else
136
108
  out_op_next = in_op_phase2;
137
- end
138
109
 
139
110
  out_databits_next = in_databits_phase2;
140
111
 
141
112
  case (in_op_phase2)
142
- `OP_NOP:
113
+ OP_NOP:
143
114
  res_next = 0;
144
115
 
145
- `OP_ADD:
116
+ OP_ADD:
146
117
  res_next = add_result_phase2;
147
118
 
148
- `OP_SUB:
119
+ OP_SUB:
149
120
  res_next = sub_result_phase2;
150
121
 
151
- `OP_MULT:
122
+ OP_MULT:
152
123
  res_next = mul_result_phase2;
153
124
  endcase
154
125
  end
155
126
 
156
127
  always @(posedge clk) begin
157
- res <= res_next;
158
- out_op <= out_op_next;
128
+ res <= res_next;
129
+ out_op <= out_op_next;
159
130
  out_databits <= out_databits_next;
160
131
  end
161
132
 
162
133
  endmodule
163
-
@@ -0,0 +1,51 @@
1
+ # Simulates the design under test for one clock cycle.
2
+ def cycle!
3
+ clk.high!
4
+ advance_time
5
+ clk.low!
6
+ advance_time
7
+ end
8
+
9
+ # Brings the design under test into a blank state.
10
+ def reset!
11
+ clk.x!
12
+ reset.x!
13
+ in_databits.x!
14
+ a.x!
15
+ b.x!
16
+ in_op.x!
17
+
18
+ reset.high!
19
+ 5.times { cycle! }
20
+ reset.low!
21
+ end
22
+
23
+ OPERATIONS = (OP_NOP .. OP_MULT).to_a
24
+
25
+ # Represents an ALU operation.
26
+ class Operation
27
+ attr_accessor :type, :tag, :arg1, :arg2, :result
28
+
29
+ def initialize(type, tag, arg1 = 0, arg2 = 0)
30
+ raise ArgumentError unless OPERATIONS.include? type
31
+
32
+ @type = type
33
+ @tag = tag
34
+ @arg1 = arg1
35
+ @arg2 = arg2
36
+ end
37
+
38
+ # Computes the result of this operation.
39
+ def compute
40
+ case @type
41
+ when OP_ADD
42
+ @arg1 + @arg2
43
+
44
+ when OP_SUB
45
+ @arg1 - @arg2
46
+
47
+ when OP_MULT
48
+ @arg1 * @arg2
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,4 @@
1
+ # Ruby prototype of the design under test's Verilog implementation.
2
+ def feign!
3
+ raise NotImplementedError, "Prototype is not yet implemented."
4
+ end
@@ -0,0 +1,43 @@
1
+ # Array of paths and shell globs (see the Dir.glob method's documentation for
2
+ # details) to source files and directories that contain source files. These
3
+ # source files will be loaded by the simulator before the simulation begins.
4
+ SIMULATOR_SOURCES = FileList[
5
+ 'hw5_unit.v',
6
+ ]
7
+
8
+ # Command-line arguments for the simulator. These arguments can be
9
+ # specified as a string or an array of strings, as demonstrated below:
10
+ #
11
+ # :cver => "this is a single string argument",
12
+ # :cver => ["these", "are", "separate", "arguments"],
13
+ # :cver => %w[these are also separate arguments],
14
+ #
15
+ SIMULATOR_ARGUMENTS = {
16
+ # GPL Cver
17
+ :cver => "",
18
+
19
+ # Icarus Verilog
20
+ :ivl => "",
21
+
22
+ # Synopsys VCS
23
+ :vcs => "",
24
+
25
+ # Mentor Modelsim
26
+ :vsim => "",
27
+
28
+ # Cadence NC-Sim
29
+ :ncsim => "",
30
+
31
+ }
32
+
33
+ # This task is invoked before the simulator runs. It
34
+ # can be used to make preprations, such as converting
35
+ # Verilog header files into Ruby, for the simulation.
36
+ task :setup do
37
+ # To learn how to write Rake tasks, please see:
38
+ # http://docs.rubyrake.org/read/chapter/4#page16
39
+ end
40
+
41
+ # This command loads the Ruby-VPI runner template,
42
+ # which runs the simulator using the above parameters.
43
+ require 'ruby-vpi/runner'
@@ -0,0 +1,64 @@
1
+ require 'test/unit'
2
+ require 'int_gen'
3
+
4
+ class Hw5_unit_spec < Test::Unit::TestCase
5
+ # Number of input sequences to test.
6
+ NUM_TESTS = 4000
7
+
8
+ # Bitmask capable of capturing ALU result.
9
+ ALU_RESULT_MASK = (2 ** Hw5_unit::WIDTH) - 1
10
+
11
+ # Upper limit of values allowed for an operation's tag.
12
+ OPERATION_TAG_LIMIT = 2 ** Hw5_unit::DATABITS
13
+
14
+ def setup
15
+ Hw5_unit.reset!
16
+ @intGen = IntegerGenerator.new(Hw5_unit::WIDTH)
17
+ end
18
+
19
+ def test_pipeline
20
+ issuedOps = []
21
+ numIssued = numVerified = 0
22
+
23
+ until numVerified == NUM_TESTS
24
+ # issue a new operation
25
+ if numIssued < NUM_TESTS
26
+ op = Hw5_unit::Operation.new(
27
+ Hw5_unit::OPERATIONS[rand(Hw5_unit::OPERATIONS.size)],
28
+ numIssued % OPERATION_TAG_LIMIT,
29
+ @intGen.random,
30
+ @intGen.random
31
+ )
32
+
33
+ Hw5_unit.a.intVal = op.arg1
34
+ Hw5_unit.b.intVal = op.arg2
35
+ Hw5_unit.in_op.intVal = op.type
36
+ Hw5_unit.in_databits.intVal = op.tag
37
+
38
+ issuedOps << op
39
+ numIssued += 1
40
+ end
41
+
42
+ Hw5_unit.cycle!
43
+
44
+ # verify result of finished operation
45
+ unless Hw5_unit.out_databits.x?
46
+ finishedOp = Hw5_unit::Operation.new(
47
+ Hw5_unit.out_op.intVal,
48
+ Hw5_unit.out_databits.intVal
49
+ )
50
+ finishedOp.result = Hw5_unit.res.intVal & ALU_RESULT_MASK
51
+
52
+ expectedOp = issuedOps.shift
53
+ assert_equal expectedOp.type, finishedOp.type, "incorrect operation"
54
+ assert_equal expectedOp.tag, finishedOp.tag, "incorrect tag"
55
+
56
+ unless finishedOp.type == Hw5_unit::OP_NOP
57
+ assert_equal expectedOp.compute & ALU_RESULT_MASK, finishedOp.result, "incorrect result"
58
+ end
59
+
60
+ numVerified += 1
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2007 Jacinto Shy II
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,4 @@
1
+ This sample Ruby-VPI test was originally written by Jacinto Shy II:
2
+ http://jacintoshy.blogspot.com/2007/05/hacking-verilog-with-ruby-part-2.html
3
+
4
+ It has undergone some minor changes to work with the latest Ruby-VPI release.
@@ -0,0 +1 @@
1
+ require 'ruby-vpi/runner_proxy'
@@ -0,0 +1,18 @@
1
+ module register_file (
2
+ input wire [1:0] rdReg,
3
+ input wire [1:0] wtReg,
4
+ input wire rw,
5
+ input wire enable,
6
+ input wire [3:0] inBus,
7
+ output reg [3:0] outBus
8
+ );
9
+ reg [3:0] register [0:3];
10
+
11
+ always @(*) begin
12
+ if (rw == 0) begin
13
+ outBus = register[rdReg];
14
+ end else if (enable) begin
15
+ register[wtReg] = inBus;
16
+ end
17
+ end
18
+ endmodule
@@ -0,0 +1,11 @@
1
+ # Simulates the design under test for one clock cycle.
2
+ def cycle!
3
+ advance_time
4
+ end
5
+
6
+ # Brings the design under test into a blank state.
7
+ def reset!
8
+ register.each_memoryWord do |word|
9
+ word.x!
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # Ruby prototype of the design under test's Verilog implementation.
2
+ def feign!
3
+ if rw.low?
4
+ reg = register.memoryWord_a[rdReg.intVal]
5
+ outBus.intVal = reg.intVal
6
+
7
+ elsif enable.high?
8
+ reg = register.memoryWord_a[wtReg.intVal]
9
+ reg.intVal = inBus.intVal
10
+ end
11
+ end
@@ -0,0 +1,43 @@
1
+ # Array of paths and shell globs (see the Dir.glob method's documentation for
2
+ # details) to source files and directories that contain source files. These
3
+ # source files will be loaded by the simulator before the simulation begins.
4
+ SIMULATOR_SOURCES = FileList[
5
+ 'register_file.v',
6
+ ]
7
+
8
+ # Command-line arguments for the simulator. These arguments can be
9
+ # specified as a string or an array of strings, as demonstrated below:
10
+ #
11
+ # :cver => "this is a single string argument",
12
+ # :cver => ["these", "are", "separate", "arguments"],
13
+ # :cver => %w[these are also separate arguments],
14
+ #
15
+ SIMULATOR_ARGUMENTS = {
16
+ # GPL Cver
17
+ :cver => "",
18
+
19
+ # Icarus Verilog
20
+ :ivl => "",
21
+
22
+ # Synopsys VCS
23
+ :vcs => "",
24
+
25
+ # Mentor Modelsim
26
+ :vsim => "",
27
+
28
+ # Cadence NC-Sim
29
+ :ncsim => "",
30
+
31
+ }
32
+
33
+ # This task is invoked before the simulator runs. It
34
+ # can be used to make preprations, such as converting
35
+ # Verilog header files into Ruby, for the simulation.
36
+ task :setup do
37
+ # To learn how to write Rake tasks, please see:
38
+ # http://docs.rubyrake.org/read/chapter/4#page16
39
+ end
40
+
41
+ # This command loads the Ruby-VPI runner template,
42
+ # which runs the simulator using the above parameters.
43
+ require 'ruby-vpi/runner'
@@ -0,0 +1,58 @@
1
+ require 'spec'
2
+
3
+ module RegisterInterface
4
+ MAX_INDEX = Register_file.register.size - 1
5
+
6
+ def set_registers(vals)
7
+ Register_file.rw.intVal = 1
8
+
9
+ 0.upto(MAX_INDEX) do |i|
10
+ Register_file.wtReg.intVal = i
11
+ Register_file.inBus.intVal = vals[i]
12
+ Register_file.cycle!
13
+ end
14
+ end
15
+
16
+ def expect_registers(vals)
17
+ Register_file.rw.intVal = 0
18
+
19
+ MAX_INDEX.downto(0) do |i|
20
+ Register_file.rdReg.intVal = i
21
+ Register_file.cycle!
22
+ Register_file.outBus.intVal.should == vals[i]
23
+ end
24
+ end
25
+ end
26
+
27
+ describe "An enabled register file" do
28
+ include RegisterInterface
29
+
30
+ before do
31
+ Register_file.reset!
32
+ Register_file.enable.intVal = 1
33
+ end
34
+
35
+ it "should be able to write and then read registers" do
36
+ testVals = [1, 7, 3, 12]
37
+
38
+ set_registers(testVals)
39
+ expect_registers(testVals)
40
+ end
41
+ end
42
+
43
+ describe "A disabled register file" do
44
+ include RegisterInterface
45
+
46
+ before do
47
+ Register_file.reset!
48
+ Register_file.enable.intVal = 0
49
+ end
50
+
51
+ it "should not write new values" do
52
+ zeros = [0, 0, 0, 0]
53
+ testVals = [1, 7, 3, 12]
54
+
55
+ set_registers(testVals)
56
+ expect_registers(zeros)
57
+ end
58
+ end