ruby-vpi 9.0.0 → 10.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (250) hide show
  1. data/HISTORY +120 -56
  2. data/MEMO +8 -0
  3. data/README +1 -1
  4. data/Rakefile +2 -2
  5. data/bin/generate_test.rb +11 -12
  6. data/bin/generate_test_tpl/bench.rb +2 -2
  7. data/bin/generate_test_tpl/bench.v +1 -4
  8. data/bin/generate_test_tpl/design.rb +6 -20
  9. data/bin/generate_test_tpl/proto.rb +5 -3
  10. data/bin/generate_test_tpl/runner.rake +2 -1
  11. data/bin/generate_test_tpl/spec.rb +5 -12
  12. data/doc/background.organization.html +1 -1
  13. data/doc/background.running-tests.html +1 -1
  14. data/doc/index.html +2 -2
  15. data/doc/manual.txt +276 -223
  16. data/doc/problem.ivl.html +3 -3
  17. data/doc/problems.html +1 -1
  18. data/doc/problems.ruby.html +1 -1
  19. data/doc/problems.vsim.html +1 -1
  20. data/doc/setup.html +3 -0
  21. data/doc/setup.installation.html +9 -0
  22. data/doc/setup.maintenance.html +3 -0
  23. data/doc/setup.reqs.html +3 -0
  24. data/doc/src/manual.xml +232 -195
  25. data/doc/styles/manual.css +8 -0
  26. data/doc/usage.examples.html +1 -1
  27. data/doc/usage.html +1 -1
  28. data/doc/usage.tools.html +7 -1
  29. data/doc/usage.tutorial.html +50 -56
  30. data/history.html +195 -77
  31. data/history.part.html +195 -77
  32. data/lib/ruby-vpi/vpi.rb +13 -1
  33. data/lib/ruby-vpi.rb +18 -7
  34. data/memo.html +19 -0
  35. data/memo.part.html +19 -0
  36. data/readme.html +1 -1
  37. data/readme.part.html +1 -1
  38. data/samp/counter/counter_rspec_bench.rb +2 -2
  39. data/samp/counter/counter_rspec_bench.v +1 -4
  40. data/samp/counter/counter_rspec_design.rb +4 -18
  41. data/samp/counter/counter_rspec_proto.rb +7 -5
  42. data/samp/counter/counter_rspec_runner.rake +2 -1
  43. data/samp/counter/counter_rspec_spec.rb +8 -12
  44. data/samp/counter/counter_xunit_bench.rb +2 -2
  45. data/samp/counter/counter_xunit_bench.v +1 -4
  46. data/samp/counter/counter_xunit_design.rb +4 -18
  47. data/samp/counter/counter_xunit_proto.rb +7 -5
  48. data/samp/counter/counter_xunit_runner.rake +2 -1
  49. data/samp/counter/counter_xunit_spec.rb +8 -14
  50. data/samp/pipelined_alu/hw5_unit_test_bench.rb +3 -3
  51. data/samp/pipelined_alu/hw5_unit_test_bench.v +1 -4
  52. data/samp/pipelined_alu/hw5_unit_test_design.rb +49 -65
  53. data/samp/pipelined_alu/hw5_unit_test_proto.rb +9 -5
  54. data/samp/pipelined_alu/hw5_unit_test_runner.rake +2 -1
  55. data/samp/pipelined_alu/hw5_unit_test_spec.rb +18 -21
  56. metadata +8 -242
  57. data/doc/usage.installation.html +0 -9
  58. data/doc/usage.recommendations.html +0 -3
  59. data/doc/usage.requirements.html +0 -3
  60. data/ref/c/annotated.html +0 -35
  61. data/ref/c/common_8h.html +0 -146
  62. data/ref/c/doxygen.css +0 -358
  63. data/ref/c/doxygen.png +0 -0
  64. data/ref/c/files.html +0 -34
  65. data/ref/c/functions.html +0 -134
  66. data/ref/c/functions_vars.html +0 -134
  67. data/ref/c/globals.html +0 -55
  68. data/ref/c/globals_0x63.html +0 -86
  69. data/ref/c/globals_0x65.html +0 -55
  70. data/ref/c/globals_0x66.html +0 -55
  71. data/ref/c/globals_0x70.html +0 -71
  72. data/ref/c/globals_0x72.html +0 -62
  73. data/ref/c/globals_0x73.html +0 -65
  74. data/ref/c/globals_0x74.html +0 -55
  75. data/ref/c/globals_0x76.html +0 -472
  76. data/ref/c/globals_0x78.html +0 -55
  77. data/ref/c/globals_defs.html +0 -81
  78. data/ref/c/globals_defs_0x65.html +0 -50
  79. data/ref/c/globals_defs_0x70.html +0 -51
  80. data/ref/c/globals_defs_0x76.html +0 -463
  81. data/ref/c/globals_defs_0x78.html +0 -50
  82. data/ref/c/globals_enum.html +0 -39
  83. data/ref/c/globals_eval.html +0 -40
  84. data/ref/c/globals_func.html +0 -49
  85. data/ref/c/globals_type.html +0 -63
  86. data/ref/c/globals_vars.html +0 -42
  87. data/ref/c/index.html +0 -20
  88. data/ref/c/relay_8c.html +0 -214
  89. data/ref/c/relay_8h.html +0 -129
  90. data/ref/c/structrelay____RubyOptions____def.html +0 -67
  91. data/ref/c/structt__cb__data.html +0 -151
  92. data/ref/c/structt__vpi__delay.html +0 -134
  93. data/ref/c/structt__vpi__error__info.html +0 -151
  94. data/ref/c/structt__vpi__strengthval.html +0 -83
  95. data/ref/c/structt__vpi__systf__data.html +0 -151
  96. data/ref/c/structt__vpi__time.html +0 -100
  97. data/ref/c/structt__vpi__value.html +0 -204
  98. data/ref/c/structt__vpi__vecval.html +0 -66
  99. data/ref/c/structt__vpi__vlog__info.html +0 -100
  100. data/ref/c/swig_8c.html +0 -80
  101. data/ref/c/swig_8h.html +0 -83
  102. data/ref/c/tab_b.gif +0 -0
  103. data/ref/c/tab_l.gif +0 -0
  104. data/ref/c/tab_r.gif +0 -0
  105. data/ref/c/tabs.css +0 -102
  106. data/ref/c/verilog_8h.html +0 -117
  107. data/ref/c/vlog_8c.html +0 -168
  108. data/ref/c/vlog_8h.html +0 -128
  109. data/ref/c/vpi__user_8h.html +0 -8739
  110. data/ref/ruby/classes/ERB.html +0 -158
  111. data/ref/ruby/classes/ERB.src/M000034.html +0 -29
  112. data/ref/ruby/classes/FileUtils.html +0 -165
  113. data/ref/ruby/classes/FileUtils.src/M000089.html +0 -18
  114. data/ref/ruby/classes/FileUtils.src/M000090.html +0 -18
  115. data/ref/ruby/classes/Integer.html +0 -398
  116. data/ref/ruby/classes/Integer.src/M000012.html +0 -25
  117. data/ref/ruby/classes/Integer.src/M000013.html +0 -18
  118. data/ref/ruby/classes/Integer.src/M000014.html +0 -18
  119. data/ref/ruby/classes/Integer.src/M000015.html +0 -18
  120. data/ref/ruby/classes/Integer.src/M000016.html +0 -18
  121. data/ref/ruby/classes/Integer.src/M000017.html +0 -18
  122. data/ref/ruby/classes/Integer.src/M000020.html +0 -22
  123. data/ref/ruby/classes/Integer.src/M000021.html +0 -22
  124. data/ref/ruby/classes/Integer.src/M000022.html +0 -25
  125. data/ref/ruby/classes/Integer.src/M000023.html +0 -31
  126. data/ref/ruby/classes/Integer.src/M000024.html +0 -25
  127. data/ref/ruby/classes/Integer.src/M000025.html +0 -30
  128. data/ref/ruby/classes/OutputInfo.html +0 -299
  129. data/ref/ruby/classes/OutputInfo.src/M000030.html +0 -51
  130. data/ref/ruby/classes/RDoc.html +0 -135
  131. data/ref/ruby/classes/RDoc.src/M000093.html +0 -40
  132. data/ref/ruby/classes/RubyVpi/Config.html +0 -148
  133. data/ref/ruby/classes/RubyVpi.html +0 -186
  134. data/ref/ruby/classes/RubyVpi.src/M000091.html +0 -50
  135. data/ref/ruby/classes/RubyVpi.src/M000092.html +0 -20
  136. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.html +0 -407
  137. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000081.html +0 -18
  138. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000082.html +0 -18
  139. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000083.html +0 -22
  140. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000084.html +0 -44
  141. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000085.html +0 -82
  142. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000086.html +0 -127
  143. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000087.html +0 -26
  144. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000088.html +0 -18
  145. data/ref/ruby/classes/SWIG.html +0 -111
  146. data/ref/ruby/classes/String.html +0 -158
  147. data/ref/ruby/classes/String.src/M000032.html +0 -41
  148. data/ref/ruby/classes/String.src/M000033.html +0 -18
  149. data/ref/ruby/classes/Table.html +0 -191
  150. data/ref/ruby/classes/Table.src/M000026.html +0 -38
  151. data/ref/ruby/classes/Table.src/M000027.html +0 -18
  152. data/ref/ruby/classes/Table.src/M000028.html +0 -18
  153. data/ref/ruby/classes/Table.src/M000029.html +0 -18
  154. data/ref/ruby/classes/Template.html +0 -158
  155. data/ref/ruby/classes/Template.src/M000031.html +0 -18
  156. data/ref/ruby/classes/VerilogParser/Module/Parameter.html +0 -160
  157. data/ref/ruby/classes/VerilogParser/Module/Parameter.src/M000011.html +0 -21
  158. data/ref/ruby/classes/VerilogParser/Module/Port.html +0 -207
  159. data/ref/ruby/classes/VerilogParser/Module/Port.src/M000007.html +0 -21
  160. data/ref/ruby/classes/VerilogParser/Module/Port.src/M000008.html +0 -18
  161. data/ref/ruby/classes/VerilogParser/Module/Port.src/M000009.html +0 -18
  162. data/ref/ruby/classes/VerilogParser/Module/Port.src/M000010.html +0 -18
  163. data/ref/ruby/classes/VerilogParser/Module.html +0 -172
  164. data/ref/ruby/classes/VerilogParser/Module.src/M000006.html +0 -29
  165. data/ref/ruby/classes/VerilogParser.html +0 -187
  166. data/ref/ruby/classes/VerilogParser.src/M000005.html +0 -34
  167. data/ref/ruby/classes/XX/Document.html +0 -295
  168. data/ref/ruby/classes/XX/Document.src/M000072.html +0 -22
  169. data/ref/ruby/classes/XX/Document.src/M000073.html +0 -20
  170. data/ref/ruby/classes/XX/Document.src/M000074.html +0 -20
  171. data/ref/ruby/classes/XX/Document.src/M000075.html +0 -20
  172. data/ref/ruby/classes/XX/Document.src/M000076.html +0 -22
  173. data/ref/ruby/classes/XX/Document.src/M000077.html +0 -21
  174. data/ref/ruby/classes/XX/Document.src/M000078.html +0 -21
  175. data/ref/ruby/classes/XX/Document.src/M000079.html +0 -34
  176. data/ref/ruby/classes/XX/Document.src/M000080.html +0 -98
  177. data/ref/ruby/classes/XX/HTML4/Strict.html +0 -138
  178. data/ref/ruby/classes/XX/HTML4/Strict.src/M000038.html +0 -20
  179. data/ref/ruby/classes/XX/HTML4/Transitional.html +0 -138
  180. data/ref/ruby/classes/XX/HTML4/Transitional.src/M000037.html +0 -20
  181. data/ref/ruby/classes/XX/HTML4.html +0 -145
  182. data/ref/ruby/classes/XX/HTML4.src/M000036.html +0 -20
  183. data/ref/ruby/classes/XX/Markup/ClassMethods.html +0 -236
  184. data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000044.html +0 -22
  185. data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000045.html +0 -20
  186. data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000046.html +0 -25
  187. data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000047.html +0 -20
  188. data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000048.html +0 -27
  189. data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000049.html +0 -20
  190. data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000050.html +0 -27
  191. data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000051.html +0 -22
  192. data/ref/ruby/classes/XX/Markup/Error.html +0 -111
  193. data/ref/ruby/classes/XX/Markup/InstanceMethods.html +0 -474
  194. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000052.html +0 -56
  195. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000053.html +0 -33
  196. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000054.html +0 -31
  197. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000055.html +0 -48
  198. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000056.html +0 -20
  199. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000057.html +0 -31
  200. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000058.html +0 -32
  201. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000059.html +0 -32
  202. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000060.html +0 -28
  203. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000061.html +0 -23
  204. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000062.html +0 -26
  205. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000063.html +0 -20
  206. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000064.html +0 -20
  207. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000065.html +0 -20
  208. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000066.html +0 -20
  209. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000067.html +0 -20
  210. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000068.html +0 -21
  211. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000069.html +0 -20
  212. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000070.html +0 -20
  213. data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000071.html +0 -20
  214. data/ref/ruby/classes/XX/Markup.html +0 -160
  215. data/ref/ruby/classes/XX/Markup.src/M000043.html +0 -28
  216. data/ref/ruby/classes/XX/XHTML/Strict.html +0 -138
  217. data/ref/ruby/classes/XX/XHTML/Strict.src/M000041.html +0 -20
  218. data/ref/ruby/classes/XX/XHTML/Transitional.html +0 -138
  219. data/ref/ruby/classes/XX/XHTML/Transitional.src/M000040.html +0 -20
  220. data/ref/ruby/classes/XX/XHTML.html +0 -145
  221. data/ref/ruby/classes/XX/XHTML.src/M000039.html +0 -36
  222. data/ref/ruby/classes/XX/XML.html +0 -138
  223. data/ref/ruby/classes/XX/XML.src/M000035.html +0 -20
  224. data/ref/ruby/classes/XX/XMLish.html +0 -138
  225. data/ref/ruby/classes/XX/XMLish.src/M000042.html +0 -18
  226. data/ref/ruby/classes/XX.html +0 -138
  227. data/ref/ruby/created.rid +0 -1
  228. data/ref/ruby/files/bin/generate_test_rb.html +0 -245
  229. data/ref/ruby/files/bin/generate_test_rb.src/M000001.html +0 -18
  230. data/ref/ruby/files/bin/generate_test_rb.src/M000002.html +0 -39
  231. data/ref/ruby/files/bin/header_to_ruby_rb.html +0 -125
  232. data/ref/ruby/files/lib/ruby-vpi/erb_rb.html +0 -108
  233. data/ref/ruby/files/lib/ruby-vpi/integer_rb.html +0 -101
  234. data/ref/ruby/files/lib/ruby-vpi/rake_rb.html +0 -108
  235. data/ref/ruby/files/lib/ruby-vpi/rcov_rb.html +0 -111
  236. data/ref/ruby/files/lib/ruby-vpi/rdoc_rb.html +0 -108
  237. data/ref/ruby/files/lib/ruby-vpi/rspec_rb.html +0 -115
  238. data/ref/ruby/files/lib/ruby-vpi/runner_proxy_rb.html +0 -108
  239. data/ref/ruby/files/lib/ruby-vpi/runner_rb.html +0 -208
  240. data/ref/ruby/files/lib/ruby-vpi/runner_rb.src/M000003.html +0 -24
  241. data/ref/ruby/files/lib/ruby-vpi/runner_rb.src/M000004.html +0 -26
  242. data/ref/ruby/files/lib/ruby-vpi/verilog_parser_rb.html +0 -107
  243. data/ref/ruby/files/lib/ruby-vpi/vpi_rb.html +0 -108
  244. data/ref/ruby/files/lib/ruby-vpi/xx_rb.html +0 -148
  245. data/ref/ruby/files/lib/ruby-vpi_rb.html +0 -109
  246. data/ref/ruby/fr_class_index.html +0 -56
  247. data/ref/ruby/fr_file_index.html +0 -40
  248. data/ref/ruby/fr_method_index.html +0 -119
  249. data/ref/ruby/index.html +0 -24
  250. data/ref/ruby/rdoc-style.css +0 -208
data/doc/manual.txt CHANGED
@@ -16,8 +16,9 @@ in the section entitled "GNU Free Documentation License".
16
16
 
17
17
  Abstract
18
18
 
19
- This manual explains how to use Ruby-VPI. You can find the newest version of
20
- this manual at the Ruby-VPI website.
19
+ This manual explains how to use Ruby-VPI. A plain-text version of this manual
20
+ is also available. Finally, you can find the newest version of this manual at
21
+ the Ruby-VPI website.
21
22
 
22
23
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
23
24
 
@@ -45,20 +46,25 @@ Table of Contents
45
46
  Initialization
46
47
  Execution
47
48
 
48
- 3. Usage
49
+ 3. Setup
49
50
 
50
51
  Requirements
51
- Recommendations
52
- Installation and maintenance
52
+
53
+ Recommendations
54
+
55
+ Installation
53
56
 
54
57
  Installing on Windows
55
58
 
59
+ Maintenance
60
+
61
+ 4. Usage
62
+
56
63
  Tools
57
64
 
58
65
  Automated test generation
59
66
  Verilog to Ruby conversion
60
67
 
61
- Examples
62
68
  Tutorial
63
69
 
64
70
  Start with a design
@@ -69,7 +75,9 @@ Table of Contents
69
75
  Implement the design
70
76
  Verify the design
71
77
 
72
- 4. Known problems
78
+ Examples
79
+
80
+ 5. Known problems
73
81
 
74
82
  Ruby
75
83
 
@@ -107,17 +115,17 @@ List of Figures
107
115
  2.2. Detailed organization of a test
108
116
  2.3. Initialization of a test
109
117
  2.4. Execution of a test
110
- 3.1. Declaration of a simple up-counter with synchronous reset
111
- 3.2. Generating a test with specification in rSpec format
112
- 3.3. Generating a test with specification in xUnit format
113
- 3.4. Specification implemented in rSpec format
114
- 3.5. Specification implemented in xUnit format
115
- 3.6. Ruby prototype of our Verilog design
116
- 3.7. Running a test with specification in rSpec format
117
- 3.8. Running a test with specification in xUnit format
118
- 3.9. Implementation of a simple up-counter with synchronous reset
119
- 3.10. Running a test with specification in rSpec format
120
- 3.11. Running a test with specification in xUnit format
118
+ 4.1. Declaration of a simple up-counter with synchronous reset
119
+ 4.2. Generating a test with specification in rSpec format
120
+ 4.3. Generating a test with specification in xUnit format
121
+ 4.4. Specification implemented in rSpec format
122
+ 4.5. Specification implemented in xUnit format
123
+ 4.6. Ruby prototype of our Verilog design
124
+ 4.7. Running a test with specification in rSpec format
125
+ 4.8. Running a test with specification in xUnit format
126
+ 4.9. Implementation of a simple up-counter with synchronous reset
127
+ 4.10. Running a test with specification in rSpec format
128
+ 4.11. Running a test with specification in xUnit format
121
129
 
122
130
  List of Tables
123
131
 
@@ -127,9 +135,9 @@ List of Tables
127
135
  List of Examples
128
136
 
129
137
  2.1. Accessing a handle's VPI properties
130
- 4.1. Part of a bench which instantiates a Verilog design
131
- 4.2. Bad design with unconnected registers
132
- 4.3. Fixed design with wired registers
138
+ 5.1. Part of a bench which instantiates a Verilog design
139
+ 5.2. Bad design with unconnected registers
140
+ 5.3. Fixed design with wired registers
133
141
 
134
142
  Chapter 1. Introduction
135
143
 
@@ -356,7 +364,17 @@ VPI utility layer
356
364
 
357
365
  From a user's perspective, the VPI utility layer greatly enhances the ability
358
366
  to interact with handles. One simply invokes a handle's methods, which are
359
- carefully named in the following manner, to access its VPI properties.
367
+ carefully named in the following manner, to access either (1) its children or
368
+ (2) its VPI properties.
369
+
370
+ The children of a handle are simply the handles that are immediately contained
371
+ within it in. For example, suppose that you had a Verilog module that contains
372
+ some registers. The children, of a handle to the module, would be handles to
373
+ the registers.
374
+
375
+ In the event that a child handle has the same name as a VPI property, the child
376
+ is given priority. However, you can always access VPI properties explicitly via
377
+ the get_value and put_value methods.
360
378
 
361
379
  Table 2.1. Naming format for accessing a handle's VPI properties
362
380
 
@@ -560,31 +578,19 @@ Procedure 2.2. Execution of a test
560
578
  3. When the Ruby interpreter invokes the Vpi::relay_verilog method, it is
561
579
  paused and the Verilog simulator is given control.
562
580
 
563
- Chapter 3. Usage
581
+ Chapter 3. Setup
564
582
 
565
583
  Table of Contents
566
584
 
567
585
  Requirements
568
- Recommendations
569
- Installation and maintenance
570
586
 
571
- Installing on Windows
572
-
573
- Tools
587
+ Recommendations
574
588
 
575
- Automated test generation
576
- Verilog to Ruby conversion
589
+ Installation
577
590
 
578
- Examples
579
- Tutorial
591
+ Installing on Windows
580
592
 
581
- Start with a design
582
- Generate a test
583
- Specify your expectations
584
- Implement the prototype
585
- Verify the prototype
586
- Implement the design
587
- Verify the design
593
+ Maintenance
588
594
 
589
595
  Requirements
590
596
 
@@ -644,13 +650,9 @@ Text merging tool
644
650
 
645
651
  An interactive text merging tool can greatly simplify the process of
646
652
  transferring wanted changes from one file to another. In particular, such
647
- tools are especially beneficial when using the automated test generator.
648
- Below are a list of popular text merging tools.
649
-
650
- imediff2
651
-
652
- A textual, fullscreen two-way merging tool, which works in a terminal.
653
- Useful when working remotely via SSH.
653
+ tools are especially beneficial when using the automated test generator. A
654
+ handful of the currently available open-source text merging tools are
655
+ listed below.
654
656
 
655
657
  kdiff3
656
658
 
@@ -669,7 +671,12 @@ Text merging tool
669
671
 
670
672
  A graphical, three-way merging tool.
671
673
 
672
- Installation and maintenance
674
+ imediff2
675
+
676
+ A textual, fullscreen two-way merging tool. This tool is useful when
677
+ you are working remotely via SSH.
678
+
679
+ Installation
673
680
 
674
681
  Once you have satisfied the necessary requirements, you can install Ruby-VPI by
675
682
  running the command gem install ruby-vpi. RubyGems will install Ruby-VPI into
@@ -683,11 +690,6 @@ $ gem env gemdir
683
690
  $ ls -d /usr/lib/ruby/gems/1.8/gems/ruby-vpi-*
684
691
  /usr/lib/ruby/gems/1.8/gems/ruby-vpi-7.0.0/
685
692
 
686
- You can uninstall Ruby-VPI by running the command gem uninstall ruby-vpi.
687
- Furthermore, you can upgrade to the latest release of Ruby-VPI by running the
688
- command gem update ruby-vpi. Finally, you can learn more about using and
689
- manipulating RubyGems in the RubyGems user manual.
690
-
691
693
  Installing on Windows
692
694
 
693
695
  1. Install Cygwin, the Linux-like environment for Windows.
@@ -700,20 +702,61 @@ Installing on Windows
700
702
  x in *.{o,so,dll}; do nm $x | grep -q '[Tt] _vpi' > /dev/null && echo $x;
701
703
  done in Cygwin.
702
704
 
703
- If you are using Mentor Modelsim, the desired object file can be found at a
704
- path similar to C:\Modeltech\win32\libvsim.dll.
705
+ [Tip] Tip
706
+ If you are using Mentor Modelsim, the desired object file can be
707
+ found at a path similar to C:\Modeltech\win32\libvsim.dll.
705
708
 
706
- If you are using GPL Cver, the desired object file can be found at a path
707
- similar to C:\gplcver\objs\v_vpi.o.
709
+ [Tip] Tip
710
+ If you are using GPL Cver, the desired object file can be found at a
711
+ path similar to C:\gplcver\objs\v_vpi.o.
708
712
 
709
713
  4. Assign the path of the object file (determined in the previous step) to the
710
714
  LDFLAGS environment variable. For example, if the object file's path is /
711
- life/long/journey, then you would run the command export LDFLAGS=/life/long
712
- /journey in Cygwin.
715
+ foo/bar/vpi.so, then you would run the command export LDFLAGS=/foo/bar/
716
+ vpi.so in Cygwin.
713
717
 
714
718
  5. You may now install Ruby-VPI by running the command gem install ruby-vpi in
715
719
  Cygwin.
716
720
 
721
+ Maintenance
722
+
723
+ You can uninstall Ruby-VPI by running the command gem uninstall ruby-vpi.
724
+ Furthermore, you can upgrade to the latest release of Ruby-VPI by running the
725
+ command gem update ruby-vpi. Finally, you can learn more about using and
726
+ manipulating RubyGems in the RubyGems user manual.
727
+
728
+
729
+ ━━━━━━━━━━━━━━
730
+
731
+ ^[1] Because Ruby-VPI makes use of the VPI C-language interface, it links to
732
+ symbols whose names begin with _vpi. It is possible for these symbols to be
733
+ undefined when Ruby-VPI is compiled under GNU/Linux and similar operating
734
+ systems. In contrast, one cannot compile a shared object file with references
735
+ to undefined symbols under Windows. Thus, we must find a Verilog simulator's
736
+ shared object file, which contains definitions of all VPI symbols, and give
737
+ this file to the linker when compiling Ruby-VPI.
738
+
739
+ Chapter 4. Usage
740
+
741
+ Table of Contents
742
+
743
+ Tools
744
+
745
+ Automated test generation
746
+ Verilog to Ruby conversion
747
+
748
+ Tutorial
749
+
750
+ Start with a design
751
+ Generate a test
752
+ Specify your expectations
753
+ Implement the prototype
754
+ Verify the prototype
755
+ Implement the design
756
+ Verify the design
757
+
758
+ Examples
759
+
717
760
  Tools
718
761
 
719
762
  The bin directory contains various utilities which ease the process of writing
@@ -722,28 +765,61 @@ option.
722
765
 
723
766
  Automated test generation
724
767
 
725
- The generate_test.rb tool can be used to automatically generate tests from
726
- Verilog 2001 module declarations (see the section called “Generate a test”).
727
- You can try it by running the command generate_test.rb --help.
768
+ The automated test generator (generate_test.rb) generates tests from Verilog
769
+ 2001 module declarations, as demonstrated in the section called “Generate a
770
+ test”. A generated test is composed of the following parts:
728
771
 
729
- Verilog to Ruby conversion
772
+ Runner
730
773
 
731
- The header_to_ruby.rb tool can be used to convert Verilog header files into
732
- Ruby. You can try it by running the command header_to_ruby.rb --help.
774
+ Written in Rake, this file builds and runs the test.
733
775
 
734
- Examples
776
+ Bench
735
777
 
736
- The samp directory contains several example tests which illustrate how Ruby-VPI
737
- can be used. Each example has an associated Rakefile which simplifies the
738
- process of running it. Therefore, simply navigate into an example directory and
739
- run the command rake to get started.
778
+ Written in Verilog and Ruby, these files define the testing environment.
740
779
 
741
- Also, some example specifications make use of BDD through the rSpec library.
742
- See the the section called “Methodology” for a discussion of rSpec.
780
+ Design
781
+
782
+ Written in Ruby, this file provides an interface to the design being
783
+ verified.
784
+
785
+ Prototype
786
+
787
+ Written in Ruby, this file defines a prototype of the design being
788
+ verified.
789
+
790
+ Specification
791
+
792
+ Written in Ruby, this file verifies the design.
793
+
794
+ The reason for dividing a single test into these parts is mainly to decouple
795
+ the design from the specification. This allows you to focus on writing the
796
+ specification while the remainder is automatically generated by the tool. For
797
+ example, when the interface of a Verilog module changes, you would simply
798
+ re-run this tool and incorporate those changes (using a text merging tool) into
799
+ the test without diverting your focus from the specification.
800
+
801
+ [Tip] Using kdiff3 with the automated test generator
802
+ Create a file named merge2 with the content below, make it executable,
803
+ and put it somewhere accessible by your PATH environment variable. Next,
804
+ update the MERGER environment variable by executing export MERGER=merge2.
805
+
806
+ #!/bin/sh
807
+ # args: old file, new file
808
+ kdiff3 --auto --merge --output "$2" "$@" 2>/dev/null
809
+
810
+ From now on, kdiff3 will be invoked to help you transfer your changes
811
+ between generated files. When you are finished transferring changes,
812
+ simply issue the "save the file" command and terminate kdiff3. Or, if you
813
+ do not want to transfer any changes, simply terminate kdiff3.
814
+
815
+ Verilog to Ruby conversion
816
+
817
+ The header_to_ruby.rb tool can be used to convert Verilog header files into
818
+ Ruby. You can try it by running the command header_to_ruby.rb --help.
743
819
 
744
820
  Tutorial
745
821
 
746
- Procedure 3.2. Typical way of using Ruby-VPI
822
+ Procedure 4.1. Typical way of using Ruby-VPI
747
823
 
748
824
  1. Declare the design, which is a Verilog module, using Verilog 2001 syntax.
749
825
 
@@ -762,7 +838,7 @@ Procedure 3.2. Typical way of using Ruby-VPI
762
838
 
763
839
  Start with a design
764
840
 
765
- First, we need a Design to verify. In this tutorial, Figure 3.1, “Declaration
841
+ First, we need a Design to verify. In this tutorial, Figure 4.1, “Declaration
766
842
  of a simple up-counter with synchronous reset” will serve as our design. Its
767
843
  interface is composed of the following parts:
768
844
 
@@ -783,11 +859,7 @@ count
783
859
 
784
860
  This register contains the counter's value.
785
861
 
786
- [Important] Before we continue…
787
- Save the source code shown in Figure 3.1, “Declaration of a simple
788
- up-counter with synchronous reset” into a file named counter.v.
789
-
790
- Figure 3.1. Declaration of a simple up-counter with synchronous reset
862
+ Figure 4.1. Declaration of a simple up-counter with synchronous reset
791
863
 
792
864
  module counter #(parameter Size = 5) (
793
865
  input clock,
@@ -796,54 +868,25 @@ module counter #(parameter Size = 5) (
796
868
  );
797
869
  endmodule
798
870
 
871
+ [Important] Before we continue…
872
+ Save the source code shown in Figure 4.1, “Declaration of a simple
873
+ up-counter with synchronous reset” into a file named counter.v.
874
+
799
875
  Generate a test
800
876
 
801
877
  Now that we have a Design to verify, let us generate a Test for it using the
802
- automated test generator tool. This tool allows us to implement our
803
- Specification in either rSpec, xUnit, or our very own format. Each format
804
- represents a different software development methodology: rSpec represents BDD,
805
- xUnit represents TDD, and our own format can represent another methodology.
806
-
807
- [Note] Note
808
- In this tutorial, you will see how specifications are implemented in
809
- both rSpec and xUnit formats.
878
+ automated test generator. This tool allows us to implement our Specification in
879
+ either rSpec, xUnit, or our very own format. Each format represents a different
880
+ software development methodology: rSpec represents BDD, xUnit represents TDD,
881
+ and our own format can represent another methodology. Both rSpec and xUnit are
882
+ presented in this tutorial.
810
883
 
811
884
  Once we have decided how we want to implement our specification, we can proceed
812
- to generate a test for our design. Figure 3.2, “Generating a test with
813
- specification in rSpec format” and Figure 3.3, “Generating a test with
814
- specification in xUnit format” illustrate this process. Here, the test
815
- generation tool produces a test composed of the following parts:
816
-
817
- Runner
818
-
819
- Written in Rake, this file builds and runs the test.
820
-
821
- Bench
822
-
823
- Written in Verilog and Ruby, these files define the testing environment.
824
-
825
- Design
826
-
827
- Written in Ruby, this file provides an interface to the design being
828
- verified.
829
-
830
- Prototype
831
-
832
- Written in Ruby, this file defines a prototype of the design being
833
- verified.
834
-
835
- Specification
836
-
837
- Written in Ruby, this file verifies the design.
838
-
839
- The reason for dividing a single test into these parts is mainly to decouple
840
- the design from the specification. This allows you to focus on writing the
841
- specification while the remainder is automatically generated by the tool. For
842
- example, when the interface of a Verilog module changes, you would simply
843
- re-run this tool and incorporate those changes into the test without diverting
844
- your focus from the specification.
885
+ to generate a test for our design. Figure 4.2, “Generating a test with
886
+ specification in rSpec format” and Figure 4.3, “Generating a test with
887
+ specification in xUnit format” illustrate this process.
845
888
 
846
- Figure 3.2. Generating a test with specification in rSpec format
889
+ Figure 4.2. Generating a test with specification in rSpec format
847
890
 
848
891
  $ generate_test.rb counter.v --rspec --name rspec
849
892
 
@@ -859,7 +902,7 @@ $ generate_test.rb counter.v --rspec --name rspec
859
902
  create counter_rspec_spec.rb
860
903
 
861
904
 
862
- Figure 3.3. Generating a test with specification in xUnit format
905
+ Figure 4.3. Generating a test with specification in xUnit format
863
906
 
864
907
  $ generate_test.rb counter.v --xunit --name xunit
865
908
 
@@ -892,51 +935,31 @@ The following is a reasonable set of expectations for our simple counter:
892
935
  ● A counter with the maximum value should overflow upon increment.
893
936
 
894
937
  Now that we have identified a set of expectations for our design, we are ready
895
- to implement them in our specification. Figure 3.4, “Specification implemented
896
- in rSpec format” and Figure 3.5, “Specification implemented in xUnit format”
938
+ to implement them in our specification. Figure 4.4, “Specification implemented
939
+ in rSpec format” and Figure 4.5, “Specification implemented in xUnit format”
897
940
  illustrate this process. Note the striking similarities between our
898
941
  expectations and their implementation.
899
942
 
900
- [Important] Before we continue…
901
- ● Append the following code to the files named
902
- counter_rspec_design.rb and counter_xunit_design.rb.
943
+ Figure 4.4. Specification implemented in rSpec format
903
944
 
904
- class Counter
905
- def reset!
906
- @reset.intVal = 1
907
- relay_verilog # advance the clock
908
- @reset.intVal = 0
909
- end
910
- end
911
-
912
- ● Replace the contents of the file named counter_rspec_spec.rb
913
- with the source code shown in Figure 3.4, “Specification
914
- implemented in rSpec format”.
915
-
916
- ● Replace the contents of the file named counter_xunit_spec.rb
917
- with the source code shown in Figure 3.5, “Specification
918
- implemented in xUnit format”.
945
+ # lowest upper bound of counter's value
946
+ LIMIT = 2 ** Counter.Size.intVal
919
947
 
920
- Figure 3.4. Specification implemented in rSpec format
921
-
922
- LIMIT = 2 ** Counter::Size # lowest upper bound of counter's value
923
- MAX = LIMIT - 1 # maximum allowed value for a counter
924
-
925
- include Vpi
948
+ # maximum allowed value for a counter
949
+ MAX = LIMIT - 1
926
950
 
927
951
  context "A resetted counter's value" do
928
952
  setup do
929
- @design = Counter.new
930
- @design.reset!
953
+ Counter.reset!
931
954
  end
932
955
 
933
956
  specify "should be zero" do
934
- @design.count.intVal.should_equal 0
957
+ Counter.count.intVal.should_equal 0
935
958
  end
936
959
 
937
960
  specify "should increment by one count upon each rising clock edge" do
938
961
  LIMIT.times do |i|
939
- @design.count.intVal.should_equal i
962
+ Counter.count.intVal.should_equal i
940
963
  relay_verilog # advance the clock
941
964
  end
942
965
  end
@@ -944,107 +967,129 @@ end
944
967
 
945
968
  context "A counter with the maximum value" do
946
969
  setup do
947
- @design = Counter.new
948
- @design.reset!
970
+ Counter.reset!
949
971
 
950
972
  # increment the counter to maximum value
951
973
  MAX.times do relay_verilog end
952
- @design.count.intVal.should_equal MAX
974
+ Counter.count.intVal.should_equal MAX
953
975
  end
954
976
 
955
977
  specify "should overflow upon increment" do
956
978
  relay_verilog # increment the counter
957
- @design.count.intVal.should_equal 0
979
+ Counter.count.intVal.should_equal 0
958
980
  end
959
981
  end
960
982
 
961
- Figure 3.5. Specification implemented in xUnit format
983
+ Figure 4.5. Specification implemented in xUnit format
962
984
 
963
- LIMIT = 2 ** Counter::Size # lowest upper bound of counter's value
964
- MAX = LIMIT - 1 # maximum allowed value for a counter
985
+ # lowest upper bound of counter's value
986
+ LIMIT = 2 ** Counter.Size.intVal
965
987
 
966
- class ResettedCounterValue < Test::Unit::TestCase
967
- include Vpi
988
+ # maximum allowed value for a counter
989
+ MAX = LIMIT - 1
968
990
 
991
+ class ResettedCounterValue < Test::Unit::TestCase
969
992
  def setup
970
- @design = Counter.new
971
- @design.reset!
993
+ Counter.reset!
972
994
  end
973
995
 
974
996
  def test_zero
975
- assert_equal 0, @design.count.intVal
997
+ assert_equal 0, Counter.count.intVal
976
998
  end
977
999
 
978
1000
  def test_increment
979
1001
  LIMIT.times do |i|
980
- assert_equal i, @design.count.intVal
1002
+ assert_equal i, Counter.count.intVal
981
1003
  relay_verilog # advance the clock
982
1004
  end
983
1005
  end
984
1006
  end
985
1007
 
986
1008
  class MaximumCounterValue < Test::Unit::TestCase
987
- include Vpi
988
-
989
1009
  def setup
990
- @design = Counter.new
991
- @design.reset!
1010
+ Counter.reset!
992
1011
 
993
1012
  # increment the counter to maximum value
994
1013
  MAX.times do relay_verilog end
995
- assert_equal MAX, @design.count.intVal
1014
+ assert_equal MAX, Counter.count.intVal
996
1015
  end
997
1016
 
998
1017
  def test_overflow
999
1018
  relay_verilog # increment the counter
1000
- assert_equal 0, @design.count.intVal
1019
+ assert_equal 0, Counter.count.intVal
1001
1020
  end
1002
1021
  end
1003
1022
 
1023
+ [Important] Before we continue…
1024
+ ● Replace the contents of the file named counter_rspec_spec.rb
1025
+ with the source code shown in Figure 4.4, “Specification
1026
+ implemented in rSpec format”.
1027
+
1028
+ ● Replace the contents of the file named counter_xunit_spec.rb
1029
+ with the source code shown in Figure 4.5, “Specification
1030
+ implemented in xUnit format”.
1031
+
1032
+ ● Replace the contents of the files named counter_rspec_design.rb
1033
+ and counter_xunit_design.rb with the following code. This code
1034
+ defines the reset! method which resets our Verilog design.
1035
+
1036
+ class << Counter
1037
+ def reset!
1038
+ reset.intVal = 1
1039
+ relay_verilog # advance the clock
1040
+ reset.intVal = 0
1041
+ end
1042
+ end
1043
+
1044
+
1004
1045
  Implement the prototype
1005
1046
 
1006
1047
  Now that we have a Specification against which to verify our Design, let us
1007
1048
  build a prototype of our design. By doing so, we exercise our specification,
1008
1049
  experience potential problems that may arise when we later implement our design
1009
- in Verilog, and gain confidence in our work. Figure 3.6, “Ruby prototype of our
1050
+ in Verilog, and gain confidence in our work. Figure 4.6, “Ruby prototype of our
1010
1051
  Verilog design” shows the completed prototype for our design.
1011
1052
 
1012
- [Important] Before we continue…
1013
- Replace the contents of the files named counter_rspec_proto.rb and
1014
- counter_xunit_proto.rb with the source code shown in Figure 3.6,
1015
- “Ruby prototype of our Verilog design”.
1016
-
1017
- Figure 3.6. Ruby prototype of our Verilog design
1053
+ Figure 4.6. Ruby prototype of our Verilog design
1018
1054
 
1019
- class CounterPrototype < Counter
1055
+ class << Counter
1020
1056
  def simulate!
1021
- if @reset.intVal == 1
1022
- @count.intVal = 0
1057
+ if reset.intVal == 1
1058
+ count.intVal = 0
1023
1059
  else
1024
- @count.intVal += 1
1060
+ count.intVal += 1
1025
1061
  end
1026
1062
  end
1027
1063
  end
1028
1064
 
1065
+ [Important] Before we continue…
1066
+ Replace the contents of the files named counter_rspec_proto.rb and
1067
+ counter_xunit_proto.rb with the source code shown in Figure 4.6,
1068
+ “Ruby prototype of our Verilog design”.
1069
+
1029
1070
  Verify the prototype
1030
1071
 
1031
1072
  Now that we have implemented our prototype, we are ready to verify it against
1032
- our Specification by running the Test. Figure 3.7, “Running a test with
1033
- specification in rSpec format” and Figure 3.8, “Running a test with
1073
+ our Specification by running the Test. Figure 4.7, “Running a test with
1074
+ specification in rSpec format” and Figure 4.8, “Running a test with
1034
1075
  specification in xUnit format” illustrate this process.
1035
1076
 
1036
- [Tip] Tip
1077
+ [Tip] Reuse your past efforts!
1037
1078
  The same specification can be used to verify both prototype and design.
1038
1079
 
1039
1080
  Here, the PROTOTYPE environment variable is assigned a non-empty value while
1040
1081
  running the test, so that, instead of our design, our prototype is verified
1041
1082
  against our specification. You can also assign a value to PROTOTYPE before
1042
1083
  running the test, by using your shell's export or setenv command. Finally, the
1043
- Icarus Verilog simulator, denoted by ivl, is used to run the simulation.
1084
+ Icarus Verilog simulator, denoted by cver, is used to run the simulation.
1044
1085
 
1045
- Figure 3.7. Running a test with specification in rSpec format
1086
+ [Tip] What can the test runner do?
1087
+ If you invoke the test runner (1) without any arguments or (2) with the
1088
+ -T option, it will show you a list of tasks that it can perform for you.
1046
1089
 
1047
- $ rake -f counter_rspec_runner.rake ivl PROTOTYPE=1
1090
+ Figure 4.7. Running a test with specification in rSpec format
1091
+
1092
+ $ rake -f counter_rspec_runner.rake cver PROTOTYPE=1
1048
1093
  counter_rspec: verifying prototype instead of design
1049
1094
 
1050
1095
  A resetted counter's value
@@ -1058,9 +1103,9 @@ Finished in 0.018199 seconds
1058
1103
 
1059
1104
  3 specifications, 0 failures
1060
1105
 
1061
- Figure 3.8. Running a test with specification in xUnit format
1106
+ Figure 4.8. Running a test with specification in xUnit format
1062
1107
 
1063
- $ rake -f counter_xunit_runner.rake ivl PROTOTYPE=1
1108
+ $ rake -f counter_xunit_runner.rake cver PROTOTYPE=1
1064
1109
  counter_xunit: verifying prototype instead of design
1065
1110
 
1066
1111
  Loaded suite counter_xunit_bench
@@ -1074,17 +1119,12 @@ Implement the design
1074
1119
 
1075
1120
  Now that we have implemented and verified our prototype, we are ready to
1076
1121
  implement our Design. This is often quite simple because we translate existing
1077
- code from Ruby (our prototype) into Verilog (our design). Figure 3.9,
1122
+ code from Ruby (our prototype) into Verilog (our design). Figure 4.9,
1078
1123
  “Implementation of a simple up-counter with synchronous reset” illustrates the
1079
1124
  result of this process. Once again, note the striking similarities between the
1080
1125
  implementation of our prototype and design.
1081
1126
 
1082
- [Important] Before we continue…
1083
- Replace the contents of the file named counter.v with the source
1084
- code shown in Figure 3.9, “Implementation of a simple up-counter
1085
- with synchronous reset”.
1086
-
1087
- Figure 3.9. Implementation of a simple up-counter with synchronous reset
1127
+ Figure 4.9. Implementation of a simple up-counter with synchronous reset
1088
1128
 
1089
1129
  module counter #(parameter Size = 5) (
1090
1130
  input clock,
@@ -1099,22 +1139,35 @@ module counter #(parameter Size = 5) (
1099
1139
  end
1100
1140
  endmodule
1101
1141
 
1142
+ [Important] Before we continue…
1143
+ Replace the contents of the file named counter.v with the source
1144
+ code shown in Figure 4.9, “Implementation of a simple up-counter
1145
+ with synchronous reset”.
1146
+
1102
1147
  Verify the design
1103
1148
 
1104
1149
  Now that we have implemented our Design, we are ready to verify it against our
1105
- Specification by running the Test. Figure 3.10, “Running a test with
1106
- specification in rSpec format” and Figure 3.11, “Running a test with
1150
+ Specification by running the Test. Figure 4.10, “Running a test with
1151
+ specification in rSpec format” and Figure 4.11, “Running a test with
1107
1152
  specification in xUnit format” illustrate this process.
1108
1153
 
1109
1154
  Here, the PROTOTYPE environment variable is not specified while running the
1110
1155
  test, so that our design, instead of our prototype, is verified against our
1111
1156
  specification. You can also achieve this effect by assigning an empty value to
1112
- PROTOTYPE, or by using your shell's unset command. Finally, the Icarus Verilog
1113
- simulator, denoted by ivl, is used to run the simulation.
1157
+ PROTOTYPE, or by using your shell's unset command. Finally, the GPL Cver
1158
+ Verilog simulator, denoted by cver, is used to run the simulation.
1159
+
1160
+ [Tip] Running multiple tests
1161
+ Create a file named Rakefile containing the following line.
1162
+
1163
+ require 'ruby-vpi/runner_proxy'
1114
1164
 
1115
- Figure 3.10. Running a test with specification in rSpec format
1165
+ Now you can invoke all test runners in the current directory simply by
1166
+ executing rake cver (where cver denotes the GPL Cver simulator).
1116
1167
 
1117
- $ rake -f counter_rspec_runner.rake ivl
1168
+ Figure 4.10. Running a test with specification in rSpec format
1169
+
1170
+ $ rake -f counter_rspec_runner.rake cver
1118
1171
  A resetted counter's value
1119
1172
  - should be zero
1120
1173
  - should increment by one count upon each rising clock edge
@@ -1126,9 +1179,9 @@ Finished in 0.005628 seconds
1126
1179
 
1127
1180
  3 specifications, 0 failures
1128
1181
 
1129
- Figure 3.11. Running a test with specification in xUnit format
1182
+ Figure 4.11. Running a test with specification in xUnit format
1130
1183
 
1131
- $ rake -f counter_xunit_runner.rake ivl
1184
+ $ rake -f counter_xunit_runner.rake cver
1132
1185
  Loaded suite counter_xunit_bench
1133
1186
  Started
1134
1187
  ...
@@ -1136,18 +1189,17 @@ Finished in 0.006766 seconds.
1136
1189
 
1137
1190
  3 tests, 35 assertions, 0 failures, 0 errors
1138
1191
 
1192
+ Examples
1139
1193
 
1140
- ━━━━━━━━━━━━━━
1194
+ The samp directory contains several example tests which illustrate how Ruby-VPI
1195
+ can be used. Each example has an associated Rakefile which simplifies the
1196
+ process of running it. Therefore, simply navigate into an example directory and
1197
+ run the command rake to get started.
1141
1198
 
1142
- ^[1] Because Ruby-VPI makes use of the Verilog VPI C-language interface, it
1143
- links to symbols whose names begin with _vpi. It is possible for these symbols
1144
- to be undefined when Ruby-VPI is compiled under GNU/Linux and similar operating
1145
- systems. In contrast, one cannot compile a shared object file with references
1146
- to undefined symbols under Windows. Thus, we must find a Verilog simulator's
1147
- shared object file, which contains definitions of all VPI symbols, and give
1148
- this file to the linker when compiling Ruby-VPI.
1199
+ Also, some example specifications make use of BDD through the rSpec library.
1200
+ See the the section called “Methodology” for a discussion of rSpec.
1149
1201
 
1150
- Chapter 4. Known problems
1202
+ Chapter 5. Known problems
1151
1203
 
1152
1204
  Table of Contents
1153
1205
 
@@ -1195,15 +1247,16 @@ vpi_handle_by_name
1195
1247
 
1196
1248
  Give full paths to Verilog objects
1197
1249
 
1198
- In version 0.8 of Icarus Verilog, the vpi_handle_by_name function requires an
1199
- absolute path (including the name of the bench which instantiates the design)
1200
- to a Verilog object.
1250
+ In version 0.8 and snapshot 20061009 of Icarus Verilog, the vpi_handle_by_name
1251
+ function requires an absolute path (including the name of the bench which
1252
+ instantiates the design) to a Verilog object. In addition, vpi_handle_by_name
1253
+ is unable to retrieve the handle for a module parameter.
1201
1254
 
1202
- For example, consider Example 4.1, “Part of a bench which instantiates a
1255
+ For example, consider Example 5.1, “Part of a bench which instantiates a
1203
1256
  Verilog design”. Here, one needs to specify TestFoo.my_foo.clk instead of
1204
1257
  my_foo.clk in order to access the clk input of the my_foo module instance.
1205
1258
 
1206
- Example 4.1. Part of a bench which instantiates a Verilog design
1259
+ Example 5.1. Part of a bench which instantiates a Verilog design
1207
1260
 
1208
1261
  module TestFoo;
1209
1262
  reg clk_reg;
@@ -1218,17 +1271,17 @@ a parameter to a module instantiation). Otherwise, you will get a nil value as
1218
1271
  the result of vpi_handle_by_name method.
1219
1272
 
1220
1273
  For example, suppose you wanted to access the clk_reg register, from the bench
1221
- shown in Example 4.2, “Bad design with unconnected registers”. If you execute
1274
+ shown in Example 5.2, “Bad design with unconnected registers”. If you execute
1222
1275
  the statement clk_reg = vpi_handle_by_name("TestFoo.clk_reg", nil) in a
1223
1276
  specification, then you will discover that the vpi_handle_by_name method
1224
1277
  returns nil instead of a handle to the clk_reg register.
1225
1278
 
1226
1279
  The solution is to change the design such that it appears like the one shown in
1227
- Example 4.3, “Fixed design with wired registers” where the register is
1228
- connected to a wire, or Example 4.1, “Part of a bench which instantiates a
1280
+ Example 5.3, “Fixed design with wired registers” where the register is
1281
+ connected to a wire, or Example 5.1, “Part of a bench which instantiates a
1229
1282
  Verilog design” where the register is connected to a module instantiation.
1230
1283
 
1231
- Example 4.2. Bad design with unconnected registers
1284
+ Example 5.2. Bad design with unconnected registers
1232
1285
 
1233
1286
  Here the clk_reg register is not connected to anything.
1234
1287
 
@@ -1236,7 +1289,7 @@ module TestFoo;
1236
1289
  reg clk_reg;
1237
1290
  endmodule
1238
1291
 
1239
- Example 4.3. Fixed design with wired registers
1292
+ Example 5.3. Fixed design with wired registers
1240
1293
 
1241
1294
  Here the clk_reg register is connected to the clk_wire wire.
1242
1295