ruby-vpi 18.0.2 → 19.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (232) hide show
  1. data/Rakefile +15 -19
  2. data/bin/generate/proto.rb +15 -10
  3. data/bin/ruby-vpi +2 -0
  4. data/doc/README +3 -5
  5. data/doc/Rakefile +3 -3
  6. data/doc/common.css +24 -136
  7. data/doc/common.tpl +48 -37
  8. data/doc/figures/figures.dia +19 -19
  9. data/doc/figures/ruby_relay.png +0 -0
  10. data/doc/history.html +252 -67
  11. data/doc/history.inc +98 -1
  12. data/doc/history.yaml +105 -0
  13. data/doc/intro.inc +43 -32
  14. data/doc/lib/doc_format.rb +19 -13
  15. data/doc/lib/doc_proxy.rb +7 -7
  16. data/doc/manual.doc +156 -117
  17. data/doc/manual.html +601 -560
  18. data/doc/memo.html +29 -25
  19. data/doc/print.css +63 -4
  20. data/doc/readme.doc +4 -6
  21. data/doc/readme.html +129 -111
  22. data/doc/rss.xml +168 -7
  23. data/doc/screen.css +146 -0
  24. data/doc/spacing.css +57 -0
  25. data/{samp → examples}/counter/RSpec/Rakefile +0 -0
  26. data/{samp → examples}/counter/RSpec/counter_design.rb +0 -0
  27. data/examples/counter/RSpec/counter_proto.rb +9 -0
  28. data/{samp → examples}/counter/RSpec/counter_runner.rake +0 -0
  29. data/{samp → examples}/counter/RSpec/counter_spec.rb +0 -0
  30. data/{samp → examples}/counter/Rakefile +0 -0
  31. data/{samp → examples}/counter/counter.v +0 -0
  32. data/{samp → examples}/counter/xUnit/Rakefile +0 -0
  33. data/{samp → examples}/counter/xUnit/counter_bench.rb +0 -0
  34. data/{samp → examples}/counter/xUnit/counter_bench.v +0 -0
  35. data/{samp → examples}/counter/xUnit/counter_design.rb +0 -0
  36. data/examples/counter/xUnit/counter_proto.rb +9 -0
  37. data/{samp → examples}/counter/xUnit/counter_runner.rake +0 -0
  38. data/{samp → examples}/counter/xUnit/counter_spec.rb +0 -0
  39. data/{samp → examples}/pipelined_alu/Hw5UnitModel.rb +0 -0
  40. data/{samp → examples}/pipelined_alu/README +0 -0
  41. data/{samp → examples}/pipelined_alu/Rakefile +0 -0
  42. data/{samp → examples}/pipelined_alu/TestHw5UnitModel.rb +0 -0
  43. data/{samp → examples}/pipelined_alu/hw5_unit.v +0 -0
  44. data/{samp → examples}/pipelined_alu/hw5_unit_design.rb +0 -7
  45. data/examples/pipelined_alu/hw5_unit_proto.rb +2 -0
  46. data/{samp → examples}/pipelined_alu/hw5_unit_runner.rake +0 -0
  47. data/{samp → examples}/pipelined_alu/hw5_unit_spec.rb +0 -0
  48. data/{samp → examples}/pipelined_alu/int_gen.rb +0 -0
  49. data/{samp → examples}/register_file/LICENSE +0 -0
  50. data/{samp → examples}/register_file/README +0 -0
  51. data/{samp → examples}/register_file/Rakefile +0 -0
  52. data/{samp → examples}/register_file/register_file.v +0 -0
  53. data/{samp → examples}/register_file/register_file_design.rb +0 -0
  54. data/examples/register_file/register_file_proto.rb +11 -0
  55. data/{samp → examples}/register_file/register_file_runner.rake +0 -0
  56. data/{samp → examples}/register_file/register_file_spec.rb +0 -0
  57. data/ext/main.c +5 -5
  58. data/ext/swig_vpi.i +6 -2
  59. data/lib/ruby-vpi/core/callback.rb +142 -0
  60. data/lib/ruby-vpi/core/edge.rb +128 -0
  61. data/lib/ruby-vpi/core/handle.rb +421 -0
  62. data/lib/ruby-vpi/core/scheduler.rb +244 -0
  63. data/lib/ruby-vpi/core/struct.rb +123 -0
  64. data/lib/ruby-vpi/core.rb +41 -0
  65. data/lib/ruby-vpi/rcov.rb +25 -12
  66. data/lib/ruby-vpi/runner.rb +30 -26
  67. data/lib/ruby-vpi/runner_boot_loader.rb +67 -37
  68. data/lib/ruby-vpi.rb +2 -2
  69. data/ref/c/annotated.html +1 -1
  70. data/ref/c/common_8h.html +1 -1
  71. data/ref/c/files.html +1 -1
  72. data/ref/c/functions.html +1 -1
  73. data/ref/c/functions_vars.html +1 -1
  74. data/ref/c/globals.html +1 -1
  75. data/ref/c/globals_0x63.html +1 -1
  76. data/ref/c/globals_0x65.html +1 -1
  77. data/ref/c/globals_0x66.html +1 -1
  78. data/ref/c/globals_0x6d.html +1 -1
  79. data/ref/c/globals_0x70.html +1 -1
  80. data/ref/c/globals_0x72.html +1 -1
  81. data/ref/c/globals_0x73.html +1 -1
  82. data/ref/c/globals_0x74.html +1 -1
  83. data/ref/c/globals_0x76.html +1 -1
  84. data/ref/c/globals_0x78.html +1 -1
  85. data/ref/c/globals_defs.html +1 -1
  86. data/ref/c/globals_defs_0x65.html +1 -1
  87. data/ref/c/globals_defs_0x70.html +1 -1
  88. data/ref/c/globals_defs_0x76.html +1 -1
  89. data/ref/c/globals_defs_0x78.html +1 -1
  90. data/ref/c/globals_enum.html +1 -1
  91. data/ref/c/globals_eval.html +1 -1
  92. data/ref/c/globals_func.html +1 -1
  93. data/ref/c/globals_type.html +1 -1
  94. data/ref/c/globals_vars.html +1 -1
  95. data/ref/c/index.html +1 -1
  96. data/ref/c/main_8c.html +1 -1
  97. data/ref/c/main_8h.html +1 -1
  98. data/ref/c/relay_8c.html +1 -1
  99. data/ref/c/relay_8h.html +1 -1
  100. data/ref/c/structt__cb__data.html +1 -1
  101. data/ref/c/structt__vpi__delay.html +1 -1
  102. data/ref/c/structt__vpi__error__info.html +1 -1
  103. data/ref/c/structt__vpi__strengthval.html +1 -1
  104. data/ref/c/structt__vpi__systf__data.html +1 -1
  105. data/ref/c/structt__vpi__time.html +1 -1
  106. data/ref/c/structt__vpi__value.html +1 -1
  107. data/ref/c/structt__vpi__vecval.html +1 -1
  108. data/ref/c/structt__vpi__vlog__info.html +1 -1
  109. data/ref/c/verilog_8h.html +1 -1
  110. data/ref/c/vlog_8c.html +1 -1
  111. data/ref/c/vlog_8h.html +1 -1
  112. data/ref/c/vpi__user_8h.html +1 -1
  113. data/ref/ruby/classes/ERB.html +7 -5
  114. data/ref/ruby/classes/ERB.src/{M000026.html → M000024.html} +0 -0
  115. data/ref/ruby/classes/FileUtils.html +11 -11
  116. data/ref/ruby/classes/FileUtils.src/{M000027.html → M000025.html} +0 -0
  117. data/ref/ruby/classes/FileUtils.src/{M000028.html → M000026.html} +0 -0
  118. data/ref/ruby/classes/Float.html +8 -6
  119. data/ref/ruby/classes/Float.src/{M000021.html → M000019.html} +0 -0
  120. data/ref/ruby/classes/Integer.html +67 -65
  121. data/ref/ruby/classes/Integer.src/M000007.html +25 -0
  122. data/ref/ruby/classes/Integer.src/{M000014.html → M000008.html} +5 -5
  123. data/ref/ruby/classes/Integer.src/M000009.html +5 -12
  124. data/ref/ruby/classes/Integer.src/M000010.html +5 -5
  125. data/ref/ruby/classes/Integer.src/M000011.html +5 -5
  126. data/ref/ruby/classes/Integer.src/M000012.html +5 -5
  127. data/ref/ruby/classes/Integer.src/M000015.html +25 -0
  128. data/ref/ruby/classes/Integer.src/M000016.html +31 -0
  129. data/ref/ruby/classes/Integer.src/M000017.html +12 -12
  130. data/ref/ruby/classes/Integer.src/M000018.html +17 -18
  131. data/ref/ruby/classes/Object.html +126 -0
  132. data/ref/ruby/classes/RDoc.html +5 -5
  133. data/ref/ruby/classes/RDoc.src/{M000061.html → M000081.html} +0 -0
  134. data/ref/ruby/classes/RubyVPI.html +50 -9
  135. data/ref/ruby/classes/String.html +22 -20
  136. data/ref/ruby/classes/String.src/M000020.html +36 -0
  137. data/ref/ruby/classes/String.src/M000021.html +41 -0
  138. data/ref/ruby/classes/String.src/M000022.html +5 -23
  139. data/ref/ruby/classes/String.src/M000023.html +5 -28
  140. data/ref/ruby/classes/{Vpi → VPI}/Handle.html +442 -140
  141. data/ref/ruby/classes/{Vpi/Handle.src/M000042.html → VPI/Handle.src/M000037.html} +4 -4
  142. data/ref/ruby/classes/VPI/Handle.src/M000038.html +21 -0
  143. data/ref/ruby/classes/VPI/Handle.src/M000039.html +18 -0
  144. data/ref/ruby/classes/{Vpi/Handle.src/M000036.html → VPI/Handle.src/M000040.html} +5 -5
  145. data/ref/ruby/classes/VPI/Handle.src/M000045.html +18 -0
  146. data/ref/ruby/classes/{Vpi/Handle.src/M000038.html → VPI/Handle.src/M000046.html} +5 -5
  147. data/ref/ruby/classes/VPI/Handle.src/M000057.html +18 -0
  148. data/ref/ruby/classes/{Vpi/Handle.src/M000040.html → VPI/Handle.src/M000058.html} +5 -5
  149. data/ref/ruby/classes/VPI/Handle.src/M000061.html +18 -0
  150. data/ref/ruby/classes/VPI/Handle.src/M000062.html +18 -0
  151. data/ref/ruby/classes/{Vpi/Handle.src/M000054.html → VPI/Handle.src/M000065.html} +11 -11
  152. data/ref/ruby/classes/VPI/Handle.src/M000067.html +21 -0
  153. data/ref/ruby/classes/VPI/Handle.src/M000068.html +28 -0
  154. data/ref/ruby/classes/VPI/Handle.src/M000069.html +50 -0
  155. data/ref/ruby/classes/{Vpi/Handle.src/M000048.html → VPI/Handle.src/M000070.html} +6 -6
  156. data/ref/ruby/classes/{Vpi/Handle.src/M000049.html → VPI/Handle.src/M000071.html} +6 -6
  157. data/ref/ruby/classes/{Vpi/Handle.src/M000050.html → VPI/Handle.src/M000072.html} +5 -5
  158. data/ref/ruby/classes/{Vpi/Handle.src/M000051.html → VPI/Handle.src/M000073.html} +17 -17
  159. data/ref/ruby/classes/VPI/Handle.src/M000075.html +18 -0
  160. data/ref/ruby/classes/VPI/Handle.src/M000076.html +40 -0
  161. data/ref/ruby/classes/{Vpi/Handle.src/M000056.html → VPI/Handle.src/M000077.html} +18 -18
  162. data/ref/ruby/classes/{Vpi → VPI}/S_vpi_time.html +22 -20
  163. data/ref/ruby/classes/VPI/S_vpi_time.src/M000078.html +18 -0
  164. data/ref/ruby/classes/VPI/S_vpi_time.src/M000079.html +19 -0
  165. data/ref/ruby/classes/{Vpi → VPI}/S_vpi_value.html +37 -23
  166. data/ref/ruby/classes/VPI/S_vpi_value.src/M000034.html +35 -0
  167. data/ref/ruby/classes/VPI/S_vpi_value.src/M000035.html +42 -0
  168. data/ref/ruby/classes/VPI/S_vpi_value.src/M000036.html +42 -0
  169. data/ref/ruby/classes/{Vpi.html → VPI.html} +129 -34
  170. data/ref/ruby/classes/VPI.src/M000027.html +19 -0
  171. data/ref/ruby/classes/VPI.src/M000028.html +18 -0
  172. data/ref/ruby/classes/VPI.src/M000029.html +19 -0
  173. data/ref/ruby/classes/VPI.src/M000031.html +25 -0
  174. data/ref/ruby/classes/VPI.src/M000032.html +26 -0
  175. data/ref/ruby/classes/VerilogParser/Module/Port.html +17 -15
  176. data/ref/ruby/classes/VerilogParser/Module/Port.src/M000004.html +23 -0
  177. data/ref/ruby/classes/VerilogParser/Module/Port.src/{M000007.html → M000005.html} +0 -0
  178. data/ref/ruby/classes/VerilogParser/Module/Port.src/M000006.html +5 -10
  179. data/ref/ruby/classes/VerilogParser/Module.html +7 -5
  180. data/ref/ruby/classes/VerilogParser/Module.src/{M000005.html → M000003.html} +0 -0
  181. data/ref/ruby/classes/VerilogParser.html +7 -5
  182. data/ref/ruby/classes/VerilogParser.src/{M000004.html → M000002.html} +0 -0
  183. data/ref/ruby/created.rid +1 -1
  184. data/ref/ruby/files/bin/generate_rb.html +2 -2
  185. data/ref/ruby/files/lib/ruby-vpi/{vpi_rb.html → core/callback_rb.html} +7 -8
  186. data/ref/ruby/files/lib/ruby-vpi/core/edge_rb.html +114 -0
  187. data/ref/ruby/files/lib/ruby-vpi/core/handle_rb.html +107 -0
  188. data/ref/ruby/files/lib/ruby-vpi/core/scheduler_rb.html +114 -0
  189. data/ref/ruby/files/lib/ruby-vpi/core/struct_rb.html +108 -0
  190. data/ref/ruby/files/lib/ruby-vpi/core_rb.html +121 -0
  191. data/ref/ruby/files/lib/ruby-vpi/rcov_rb.html +1 -1
  192. data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.html +5 -41
  193. data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.src/M000001.html +3 -3
  194. data/ref/ruby/files/lib/ruby-vpi/runner_rb.html +1 -1
  195. data/ref/ruby/files/lib/ruby-vpi_rb.html +1 -1
  196. data/ref/ruby/fr_class_index.html +5 -4
  197. data/ref/ruby/fr_file_index.html +6 -1
  198. data/ref/ruby/fr_method_index.html +80 -60
  199. metadata +126 -103
  200. data/ext/swig_vpi.h +0 -924
  201. data/ext/swig_wrap.cin +0 -7083
  202. data/lib/ruby-vpi/vpi.rb +0 -651
  203. data/ref/ruby/classes/Integer.src/M000013.html +0 -18
  204. data/ref/ruby/classes/Integer.src/M000019.html +0 -25
  205. data/ref/ruby/classes/Integer.src/M000020.html +0 -30
  206. data/ref/ruby/classes/String.src/M000024.html +0 -18
  207. data/ref/ruby/classes/String.src/M000025.html +0 -18
  208. data/ref/ruby/classes/VerilogParser/Module/Port.src/M000008.html +0 -18
  209. data/ref/ruby/classes/Vpi/Handle.src/M000035.html +0 -18
  210. data/ref/ruby/classes/Vpi/Handle.src/M000037.html +0 -18
  211. data/ref/ruby/classes/Vpi/Handle.src/M000039.html +0 -18
  212. data/ref/ruby/classes/Vpi/Handle.src/M000041.html +0 -18
  213. data/ref/ruby/classes/Vpi/Handle.src/M000043.html +0 -21
  214. data/ref/ruby/classes/Vpi/Handle.src/M000044.html +0 -21
  215. data/ref/ruby/classes/Vpi/Handle.src/M000045.html +0 -22
  216. data/ref/ruby/classes/Vpi/Handle.src/M000046.html +0 -50
  217. data/ref/ruby/classes/Vpi/Handle.src/M000047.html +0 -91
  218. data/ref/ruby/classes/Vpi/Handle.src/M000053.html +0 -18
  219. data/ref/ruby/classes/Vpi/Handle.src/M000057.html +0 -40
  220. data/ref/ruby/classes/Vpi/S_vpi_time.src/M000058.html +0 -18
  221. data/ref/ruby/classes/Vpi/S_vpi_time.src/M000059.html +0 -19
  222. data/ref/ruby/classes/Vpi/S_vpi_value.src/M000032.html +0 -18
  223. data/ref/ruby/classes/Vpi/S_vpi_value.src/M000033.html +0 -18
  224. data/ref/ruby/classes/Vpi/S_vpi_value.src/M000034.html +0 -18
  225. data/ref/ruby/classes/Vpi.src/M000029.html +0 -28
  226. data/ref/ruby/classes/Vpi.src/M000030.html +0 -39
  227. data/ref/ruby/classes/Vpi.src/M000031.html +0 -20
  228. data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.src/M000002.html +0 -18
  229. data/samp/counter/RSpec/counter_proto.rb +0 -10
  230. data/samp/counter/xUnit/counter_proto.rb +0 -10
  231. data/samp/pipelined_alu/hw5_unit_proto.rb +0 -4
  232. data/samp/register_file/register_file_proto.rb +0 -11
data/doc/manual.doc CHANGED
@@ -1,10 +1,12 @@
1
1
  <doc_proxy_include common.inc>
2
2
 
3
- <% front_cover "Ruby-VPI #{version} user manual" do %>
3
+ <% front_cover "Ruby-VPI user manual" do %>
4
4
  h2(author). Suraj N. Kurapati
5
5
 
6
6
  h3(date). <%= Time.now.strftime("%d %B %Y") %>
7
7
 
8
+ p=. "Version <%= version %>":history.html#<%= version.to_html_anchor %>
9
+
8
10
 
9
11
  <% paragraph "About this manual" do %>
10
12
  This manual is meant to be read in conjunction with the "reference documentation for Ruby-VPI":../ref/ruby/index.html. In addition, if you are new to "the Ruby language":http://www.ruby-lang.org, you are encouraged to "explore its documentation":http://www.ruby-lang.org/en/documentation/ as necessary.
@@ -13,7 +15,9 @@
13
15
 
14
16
  In addition, this manual is distributed as one big HTML file so that you can easily search for a particular topic using nothing more than your web browser's built-in text search mechanism. This facilitates offline reading, where an Internet search engine is not available.
15
17
 
16
- You can give feedback about this manual and, in general, any aspect of the Ruby-VPI project on the "project forums":<%= forumURL %>. Furthermore, you can <%= xref "hacking.manual", "edit this manual" %> and contribute your improvements to the "project patches":<%= trackerURL %>. Finally, you can find the newest version of this manual at the "Ruby-VPI project website":<%= projectURL %>.
18
+ Finally, this manual comes equipped with a stylesheet that makes it suitable for printing. In particular, users of the "Mozilla":http://mozilla.org family of web browsers will be pleasantly surprised to notice that all hyperlinks have been expanded to include their target URL next to the link text. So try using the "print preview" function of a graphical web browser to see how this manual will appear when printed.
19
+
20
+ You can give feedback about this manual and, in general, any aspect of the Ruby-VPI project on the "project forums":<%= forumURL %>. Furthermore, you can <%= xref "hacking.manual", "edit this manual" %> yourself and contribute your improvements to the "project patches":<%= trackerURL %> tracker. Finally, you can find the newest version of this manual at the "Ruby-VPI project website":<%= projectURL %>.
17
21
  <% end %>
18
22
 
19
23
  <% paragraph "Legal notice" do %>
@@ -36,7 +40,7 @@
36
40
  * <tt>ext</tt> contains source code, written in the C language, for the <%= xref "organization", "core of Ruby-VPI" %>
37
41
  * <tt>lib</tt> contains Ruby libraries provided by Ruby-VPI.
38
42
  * <tt>bin</tt> contains various tools. See <%= xref "usage.tools" %> for more information.
39
- * <tt>samp</tt> contains example tests. See <%= xref "usage.examples" %> for more information.
43
+ * <tt>examples</tt> contains example tests. See <%= xref "usage.examples" %> for more information.
40
44
  <% end %>
41
45
 
42
46
  <% section "Requirements", "setup.reqs" do %>
@@ -118,28 +122,6 @@
118
122
 
119
123
  As <%= xref "fig:organization.detail" %> shows, Ruby-VPI is composed of two complementary parts: one interacts with VPI through the C language, while the other interacts with an executable specification written in the Ruby language. The former is complied during installation to produce dynamically loadable C libraries---each tailored to accommodate the quirks of its respective Verilog simulator. The latter is not compiled because Ruby programs are interpreted dynamically.
120
124
 
121
- <% section "Ruby/Verilog interaction", "overview.relay" do %>
122
- In a typical VPI application written in C, the _Verilog simulator_ is in charge. Verilog code temporarily transfers control to C by invoking C functions, which return control to Verilog when they finish.
123
-
124
- In contrast, Ruby-VPI puts the _specification_ in charge. The specification temporarily transfers control to the Verilog simulator by invoking the @advance_time@ method, which returns control to the specification when it finishes. This process is illustrated in <%= xref "fig:ruby_relay" %>.
125
-
126
- Ruby-VPI's approach is the same as any software testing framework, where the _specification_ drives the design under test. Whereas, the typical VPI & C approach is literally _backwards_ because the design under test drives the specification.
127
-
128
- <% figure "Interaction between Ruby and Verilog", "fig:ruby_relay" do %>
129
- !figures/ruby_relay.png!
130
-
131
- # The current simulation time is _X_.
132
- # The specification invokes the @Vpi::advance_time@ method with parameter _Y_, which specifies the number of simulation time steps to be simulated.
133
- # The Verilog simulator is now in control (temporarily).
134
- # The current simulation time has _not_ changed; it is still _X_.
135
- # The Verilog simulator simulates _Y_ simulation time steps.
136
- # The current simulation time is now _X + Y_.
137
- # The Verilog simulator returns control back to the specification.
138
- <% end %>
139
-
140
- Another means of transferring control from the specification to the Verilog simulator is the <%= xref "vpi.callbacks", "VPI callback" %>.
141
- <% end %>
142
-
143
125
  <% section "Tests", "organization.tests" do %>
144
126
  In Ruby-VPI, the process of functional verification is neatly packaged into self-contained, executable tests. As <%= xref "fig:organization" %> illustrates, a test is composed of a *bench*, a *design*, and a *specification*.
145
127
 
@@ -153,38 +135,42 @@
153
135
 
154
136
  *The specification* is a Ruby program. In the electronics laboratory analogy, it corresponds to the engineer who inspects, manipulates, and verifies the electronic component. In terms of specification-driven functional verification, it corresponds to the executable specification.
155
137
  <% end %>
138
+ <% end %>
156
139
 
140
+ <% chapter "Usage", "usage" do %>
141
+ <% section "Interacting with the Verilog simulator", "overview.relay" do %>
142
+ In a typical VPI application written in C, the _Verilog simulator_ is in charge. Verilog code temporarily transfers control to C by invoking C functions, which return control to Verilog when they finish.
157
143
 
158
- <% section "VPI in Ruby" do %>
159
- <% section "Deviations from the VPI standard" do %>
160
- Ruby-VPI makes the entire IEEE Std 1364-2005 VPI interface available to Ruby, but with the following minor differences.
161
-
144
+ In contrast, Ruby-VPI puts the _specification_ in charge. The specification temporarily transfers control to the Verilog simulator by invoking the @advance_time@ method, which returns control to the specification after a given number of time steps. This process is illustrated in <%= xref "fig:ruby_relay" %>. You can also use the @wait@ method, which is just an alias to the @advance_time@ method, if you prefer.
162
145
 
163
- <% section "Names are capitalized" do %>
164
- The names of all VPI types, structures, and constants become _capitalized_ because Ruby requires that the names of constants begin with a capital letter. However, note that Ruby's capitalization rule does _not_ apply to VPI functions.
146
+ Ruby-VPI's approach is the same as any software testing framework, where the _specification_ drives the design under test. Whereas, the typical VPI & C approach is literally _backwards_ because the design under test drives the specification.
165
147
 
166
- For example, the @s_vpi_value@ structure becomes the @S_vpi_value@ class in Ruby. Likewise, the @vpiIntVal@ constant becomes the @VpiIntVal@ constant in Ruby. However, the @vpi_handle@ function remains as @vpi_handle@ in Ruby.
167
- <% end %>
148
+ <% figure "Interaction between Ruby and Verilog", "fig:ruby_relay" do %>
149
+ !figures/ruby_relay.png!
168
150
 
151
+ # The current simulation time is _X_.
152
+ # The specification invokes the @advance_time@ method with parameter _Y_, which specifies the number of simulation time steps to be simulated.
153
+ # The Verilog simulator is now in control (temporarily).
154
+ # The current simulation time has _not_ changed; it is still _X_.
155
+ # The Verilog simulator simulates _Y_ simulation time steps.
156
+ # The current simulation time is now _X + Y_.
157
+ # The Verilog simulator returns control back to the specification.
158
+ <% end %>
169
159
 
170
- <% section "@vprintf@ is @printf@" do %>
171
- The @vpi_vprintf@ and @vpi_mcd_vprintf@ VPI functions are aliased to @vpi_printf@ and @vpi_mcd_printf@ respectively because:
160
+ Another means of transferring control from the specification to the Verilog simulator is the <%= xref "vpi.callbacks", "VPI callback" %>.
161
+ <% end %>
172
162
 
173
- * Ruby represents "variable argument lists as arrays":http://phrogz.net/ProgrammingRuby/tut_methods.html#variablelengthargumentlists instead of defining a special datatype, such as @va_list@, for them.
163
+ <% section "VPI in Ruby", "vpi" do %>
164
+ Ruby-VPI provides the _entire_ IEEE Std 1364-2005 VPI interface to Ruby. This section will show you how to make use of it.
174
165
 
175
- * Some C compilers have trouble with pointers to the @va_list@ type. For these compilers, the third line of source code shown below causes a "type mismatch" error.
166
+ <% note "Constants are capitalized in Ruby" do %>
167
+ In the remainder of this manual, you may be surprised to see that VPI constants such as @vpiIntVal@ are written with a captialized name, as @VpiIntVal@. The reason for this discrepancy is that in Ruby, the names of constants are capitalized.
176
168
 
177
- <code lang="c">
178
- #include <stdarg.h>
179
- void foo(va_list ap) {
180
- va_list *p = &ap;
181
- }
182
- </code>
183
- <% end %>
169
+ However, keep in mind that Ruby-VPI provides all VPI constants in both (1) their original, uncapitalized form and (2) their capitalized Ruby form. You may use either version according to your preference; they are functionally equivalent.
184
170
  <% end %>
185
171
 
186
172
  <% section "Handles", "vpi.handles" do %>
187
- A *handle* is a reference to an object (such as a module, register, wire, and so on) inside the Verilog simulation. Handles allows you to inspect and manipulate the design under test and its internal components. They are instances of the @Vpi::Handle@ class (see "reference documentation":../ref/ruby/classes/Vpi/Handle.html for details) in Ruby-VPI.
173
+ A *handle* is a reference to an object (such as a module, register, wire, and so on) inside the Verilog simulation. Handles allows you to inspect and manipulate the design under test and its internal components. They are instances of the @VPI::Handle@ class (see "reference documentation":../ref/ruby/classes/VPI/Handle.html for details) in Ruby-VPI.
188
174
 
189
175
  Handles have various *properties*, listed in the second column of <%= xref "tbl:accessors" %>, which provide different kinds of information about the underlying Verilog objects they represent. These properties are accessed through the VPI functions listed in the last column of <%= xref "tbl:accessors" %>.
190
176
 
@@ -311,29 +297,29 @@
311
297
  Callbacks are added using the @vpi_register_cb@ function and removed using the @vpi_remove_cb@ function. However, instead of storing the address of a C function in the @cb_rtn@ field of the @s_cb_data@ structure (as you would do in C) you pass a block of code to the @vpi_register_cb@ method in Ruby. This block will be executed whenever the callback occurs.
312
298
 
313
299
  <% example "Using a callback for value change notification", "ex:callback" do %>
314
- This example shows how to use a callback for notification of changes in a handle's @VpiIntVal@ property. When you no longer need this callback, you can tear it down using @vpi_remove_cb(cb_handle)@.
300
+ This example shows how to use a callback for notification of changes in a handle's @VpiIntVal@ property. When you no longer need this callback, you can tear it down using @vpi_remove_cb@.
315
301
 
316
302
  In this example, the handle being monitored is the @Counter.count@ signal from <%= xref "fig:counter.v_decl" %>.
317
303
 
318
304
  <code>
319
- cbTime = S_vpi_time.new
320
- cbTime.type = VpiSimTime
321
- cbTime.low = 0
322
- cbTime.high = 0
323
-
324
- cbValue = S_vpi_value.new
325
- cbValue.format = VpiIntVal
326
-
327
- cbData = S_cb_data.new
328
- cbData.reason = CbValueChange
329
- cbData.obj = Counter.count
330
- cbData.time = cbTime
331
- cbData.value = cbValue
332
- cbData.index = 0
333
-
334
- cbHandle = vpi_register_cb(cbData) do |data|
335
- time = (data.time.high << 32) | data.time.low
336
- count = data.value.value.integer
305
+ time = S_vpi_time.new
306
+ time.type = VpiSimTime
307
+ time.low = 0
308
+ time.high = 0
309
+
310
+ value = S_vpi_value.new
311
+ value.format = VpiIntVal
312
+
313
+ alarm = S_cb_data.new
314
+ alarm.reason = CbValueChange
315
+ alarm.obj = Counter.count
316
+ alarm.time = time
317
+ alarm.value = value
318
+ alarm.index = 0
319
+
320
+ vpi_register_cb( alarm ) do |info|
321
+ time = info.time.integer
322
+ count = info.value.value.integer
337
323
  puts "hello from callback! time=#{time} count=#{count}"
338
324
  end
339
325
  </code>
@@ -342,20 +328,83 @@
342
328
  <% end %>
343
329
  <% end %>
344
330
  <% end %>
345
- <% end %>
346
331
 
347
- <% chapter "Usage", "usage" do %>
332
+ <% section "Concurrency", "usage.concurrency" do %>
333
+ Ruby-VPI provides a concurrency model that allows you to run blocks of code in parallel. These blocks of code are known as _concurrent processes_ and they represent the same idea as "initial", "always", and "forever" blocks do in Verilog.
334
+
335
+ Ruby-VPI's concurrency model imposes two important constraints, which are inspired by "GPGPU and fragment/vertex shader programming":http://en.wikipedia.org/wiki/GPGPU, in order to avoid race conditions and to make parallel programming simpler.
336
+
337
+ First, *all processes execute in the same time step*. That is, we only advance the _entire_ simulation to the next time step when _all_ processes are finished with the current time step. In this manner, we avoid race conditions where a process advances the entire simulation to a future time step but the other processes still think they are executing in the original time step (because they were not notified of the advancement).
338
+
339
+ Second, *all processes see the same input* (the state of the simulation database at the start of the current time step) while executing in a time step. That is, when a process modifies the simulation database, say, by changing the logic value of a register, the modification only takes effect at the _end_ of the current time step. In this manner, we avoid race conditions where one process modifies the simulation midflight but some/all of other processes are unaware of that modification (because they were not notified of its occurence).
340
+
341
+ Note that these constraints are automatically enforced "under the hood", so to speak, by Ruby-VPI. As a user, you need not do anything extra to implement or support these constraints; they are already taken care of.
342
+
343
+ <% paragraph "Creating a concurrent process" do %>
344
+ You can create a concurrent proceess by passing a block of code to the @process@ method.
345
+
346
+ You can also create concurrent processes that loop forever using the @always@ and @forever@ methods, which mimic the "always" and "forever" blocks, respectively, of the Verilog language. However, due to the constraints of the concurrency model (see above), there is one limitation: all assignments are treated like Verilog's non-blocking assignments.
347
+
348
+ <% example 'An edge-triggered "always" block' do %>
349
+ Suppose you have the following Verilog code:
350
+
351
+ <code lang="verilog">
352
+ always @(posedge clock1 and negedge clock2) begin
353
+ foo <= foo + 1;
354
+ bar = bar + 5;
355
+ end
356
+ </code>
357
+
358
+ In Ruby-VPI, this code would be written as:
359
+
360
+ <code>
361
+ always do
362
+ wait until clock.posedge? and clock2.negedge?
363
+
364
+ foo.intVal += 1
365
+ bar.intVal += 5 # this is a NON-blocking assignment!
366
+ end
367
+ </code>
368
+ <% end %>
369
+
370
+ <% example 'A change-triggered (combinational) "always" block' do %>
371
+ Suppose you have the following Verilog code:
372
+
373
+ <code lang="verilog">
374
+ always @(apple, banana, cherry, date) begin
375
+ $display("Yum! Fruits are good for health!");
376
+ end
377
+ </code>
378
+
379
+ In Ruby-VPI, this code would be written as:
380
+
381
+ <code>
382
+ always do
383
+ wait until apple.change? or banana.change? and cherry.change? or date.change?
384
+ puts "Yum! Fruits are good for health!"
385
+ end
386
+ </code>
387
+
388
+ Or, if you are lazy like I am, you can express the sensitivity list programatically:
389
+
390
+ <code>
391
+ always do
392
+ wait until [apple, banana, cherry, date].any? {|x| x.change?}
393
+ puts "Yum! Fruits are good for health!"
394
+ end
395
+ </code>
396
+ <% end %>
397
+ <% end %>
398
+ <% end %>
399
+
348
400
  <% section "Prototyping", "usage.prototyping" do %>
349
401
  Ruby-VPI enables you to rapidly prototype your designs in Ruby without having to do full-scale implementations in Verilog. This lets you explore and evaluate different design choices quickly.
350
402
 
351
- The prototyping process is completely transparent: there is absolutely no difference, in the eyes of your executable specification, between a real Verilog design or its Ruby prototype.
352
-
353
- In addition, the prototyping process is completely standard-based: Ruby prototypes emulate the behavior of real Verilog designs using _nothing more_ than the VPI itself.
403
+ The prototyping process is completely transparent: there is absolutely no difference, in the eyes of your executable specification, between a real Verilog design or its Ruby prototype. In addition, the prototyping process is completely standard-based: Ruby prototypes emulate the behavior of real Verilog designs using _nothing more_ than the VPI itself.
354
404
 
355
405
  For example, compare the Verilog design shown in <%= xref "fig:counter.v_impl" %> with its Ruby prototype shown in figure <%= xref "fig:counter_proto.rb" %>. The prototype uses only VPI to (1) detect changes in its inputs and (2) manipulate its outputs accordingly. In addition, notice how well the prototype's syntax reflects the intended behavior of the Verilog design. This similarity facilitates rapid translation of a prototype from Ruby into Verilog later in the design process.
356
406
 
357
- <% paragraph "Getting started" do %>
358
- To create a prototype,
407
+ <% paragraph "Creating a prototype" do %>
359
408
  # Start with a <%= xref "usage.tutorial.declare-design", "Verilog module declaration" %> for your design.
360
409
  # <%= xref "usage.tutorial.generate-test", "Generate a test" %> using that module declaration.
361
410
  # <%= xref "usage.tutorial.implement-proto", "Implement the prototype" %> in the generated <tt>proto.rb</tt> file.
@@ -363,20 +412,14 @@
363
412
 
364
413
  Once you are satisfied with your prototype, you can proceed to <%= xref "usage.tutorial.implement-design", "implement your design in Verilog" %>. This process is often a simple translation your Ruby prototype into your Verilog. At the very least, your prototype serves as a reference while you are implementing your Verilog design.
365
414
 
366
- Once your design has been implemented in Verilog, you can use the _same_ specification, which was originally used to verify your prototype, to verify your Verilog design (see <%= xref "usage.test-runner" %> for details).
367
- <% end %>
368
-
369
- <% section "How does prototyping work?" do %>
370
- The @advance_time@ method normally transfers control from the executable specification to the Verilog simulator. However, when prototyping is enabled, Ruby-VPI redefines it so that the @feign!@ method (which is defined in a test's <tt>proto.rb</tt> file) is invoked on the design under test. The @feign!@ method artificially simulates the behavior of the real Verilog design.
371
-
372
- In this manner, control is kept within the Ruby interpreter when prototyping is enabled. An advantage of this approach is that it reduces the total execution time of a Ruby-VPI test by allowing Ruby's POSIX thread to commandeer the Verilog simulator's process. A disadvantage of this approach is that callbacks, which require the transfer of control to the Verilog simulator, must be ignored.
415
+ Once your design has been implemented in Verilog, you can use the _same_ specification, which was originally used to verify your prototype, to verify your Verilog design (see <%= xref "usage.runner" %> for details).
373
416
  <% end %>
374
417
  <% end %>
375
418
 
376
- <% section "Debugging", "usage.debugger" do %>
419
+ <% section "Interactive debugging", "usage.debugger" do %>
377
420
  The "ruby-debug project":http://www.datanoise.com/articles/category/ruby-debug serves as the interactive debugger for Ruby-VPI.
378
421
 
379
- # Enable the debugger by activating the @DEBUGGER@ environment variable (see <%= xref "usage.test-runner" %> for details).
422
+ # Enable the debugger by activating the @DEBUGGER@ environment variable (see <%= xref "usage.runner" %> for details).
380
423
  # Put the @debugger@ command in your code -- anywhere you wish to activate an interactive debugging session. These commands are automatically ignored when the debugger is disabled; so you can safely leave them in your code, if you wish.
381
424
 
382
425
  <% section "Advanced initialization", "usage.debugger.init" do %>
@@ -387,34 +430,35 @@
387
430
  <% end %>
388
431
  <% end %>
389
432
 
390
- <% section "Test runner", "usage.test-runner" do %>
433
+ <% section "Test runner", "usage.runner" do %>
391
434
  A test runner is a file, generated by the <%= xref "usage.tools.generate", "automated test generator" %> whose name ends with <tt>.rake</tt>. It helps you run generated tests -- you can think of it as a _makefile_ if you are familiar with C programming in a UNIX environment.
392
435
 
393
436
  When you invoke a test runner without any arguments, it will show you a list of available tasks:
394
- <pre>$ rake -f your_test_runner.rake
437
+ <pre>% rake -f your_test_runner.rake
395
438
 
396
- <%= `rake -f ../samp/counter/RSpec/counter_runner.rake` %></pre>
439
+ <%= `rake -f ../examples/counter/RSpec/counter_runner.rake` %></pre>
397
440
 
398
- <% section "Environment variables", "usage.test-runner.env-vars" do %>
441
+ <% section "Environment variables", "usage.runner.env-vars" do %>
399
442
  Test runners support the following _environment_ variables, which allow you to easily change the behavior of the test runner.
400
443
 
444
+ * @PROTOTYPE@ enables the Ruby prototype for the design under test so that the prototype, rather than the real Verilog design, is verified by the specification.
401
445
  * @COVERAGE@ enables code coverage analysis and generation of code coverage reports.
446
+ * @PROFILER@ enables the "ruby-prof":http://ruby-prof.rubyforge.org Ruby code profiler, which collects statistics on the runtime usage of the source code. This data allows you to identify performance bottlenecks.
402
447
  * @DEBUGGER@ enables the <%= xref "usage.debugger", "interactive debugger" %> in its "post-mortem debugging mode":http://www.datanoise.com/articles/2006/12/20/post-mortem-debugging.
403
- * @PROTOTYPE@ enables the Ruby prototype for the design under test so that the prototype, rather than the real Verilog design, is verified by the specification.
404
448
 
405
- To activate these variables, simply assign the number 1 to them. For example, @DEBUG=1@ activates the @DEBUG@ variable.
449
+ To activate these variables, simply assign the number 1 to them. For example, @DEBUGGER=1@ activates the @DEBUGGER@ variable.
406
450
 
407
- To deactivate these variables, simply assign a different value to them or *unset* them in your shell. For example, both @DEBUG=0@ and @DEBUG=@ dectivate the @DEBUG@ variable.
451
+ To deactivate these variables, simply assign a different value to them or *unset* them in your shell. For example, both @DEBUGGER=0@ and @DEBUGGER=@ dectivate the @DEBUGGER@ variable.
408
452
 
409
453
  <% paragraph "Variables as command-line arguments" do %>
410
- You can specify variable assignments as arguments to the *rake* command. For example, <pre>rake DEBUG=1</pre> is equivalent to
454
+ You can specify variable assignments as arguments to the *rake* command. For example, <pre>rake DEBUGGER=1</pre> is equivalent to
411
455
  <pre>
412
- DEBUG=1
413
- export DEBUG
456
+ DEBUGGER=1
457
+ export DEBUGGER
414
458
  rake
415
459
  </pre> in Bourne shell or
416
460
  <pre>
417
- setenv DEBUG 1
461
+ setenv DEBUGGER 1
418
462
  rake
419
463
  </pre> in C shell.
420
464
  <% end %>
@@ -478,8 +522,8 @@
478
522
  <% end %>
479
523
  <% end %>
480
524
 
481
- <% section "Sample tests", "usage.examples" do %>
482
- The <tt>samp</tt> directory ("browse it online":<%= codeURL %>/samp/) contains several sample tests which illustrate how Ruby-VPI can be used. Each sample has an associated <tt>Rakefile</tt> which simplifies the process of running it. Therefore, simply navigate into an example directory and run the <pre>rake</pre> command to get started.
525
+ <% section "Example tests", "usage.examples" do %>
526
+ The <tt>examples</tt> directory ("browse it online":<%= codeURL %>/examples/) contains several example tests which illustrate how Ruby-VPI can be used. Each example has an associated <tt>Rakefile</tt> which simplifies the process of running it. Therefore, simply navigate into an example directory and run the <pre>rake</pre> command to get started.
483
527
  <% end %>
484
528
 
485
529
  <% section "Tutorial", "usage.tutorial" do %>
@@ -525,9 +569,9 @@
525
569
 
526
570
  In this tutorial, you will see how both RSpec and xUnit formats are used. So let us make separate directories for both formats to avoid generated tests from overwriting each other:
527
571
  <pre>
528
- $ mkdir RSpec xUnit
529
- $ cp counter.v RSpec
530
- $ cp counter.v xUnit
572
+ mkdir RSpec xUnit
573
+ cp counter.v RSpec
574
+ cp counter.v xUnit
531
575
  </pre>
532
576
 
533
577
  Once we have decided how we want to implement our specification, we can proceed to generate a test for our design. This process is illustrated by <%= xref "fig:generate-test.RSpec" %> and <%= xref "fig:generate-test.xUnit" %>.
@@ -571,11 +615,11 @@
571
615
  Now that we have identified a set of expectations for our design, we are ready to implement them in our specification. This process is illustrated by <%= xref "fig:RSpec/counter_spec.rb" %> and <%= xref "fig:xUnit/counter_spec.rb" %>.
572
616
 
573
617
  <% example "Specification implemented in RSpec format", "fig:RSpec/counter_spec.rb" do %>
574
- <code><%= File.read '../samp/counter/RSpec/counter_spec.rb' %></code>
618
+ <code><%= File.read '../examples/counter/RSpec/counter_spec.rb' %></code>
575
619
  <% end %>
576
620
 
577
621
  <% example "Specification implemented in xUnit format", "fig:xUnit/counter_spec.rb" do %>
578
- <code><%= File.read '../samp/counter/xUnit/counter_spec.rb' %></code>
622
+ <code><%= File.read '../examples/counter/xUnit/counter_spec.rb' %></code>
579
623
  <% end %>
580
624
 
581
625
  Before we continue,
@@ -588,7 +632,7 @@
588
632
  Now that we have a specification against which to verify our design let us build a prototype of our design. By doing so, we exercise our specification, experience potential problems that may arise when we later implement our design in Verilog, and gain confidence in our work. The result of this proceess is illustrated by <%= xref "fig:counter_proto.rb" %>.
589
633
 
590
634
  <% example "Ruby prototype of our Verilog design", "fig:counter_proto.rb" do %>
591
- <code><%= File.read '../samp/counter/RSpec/counter_proto.rb' %></code>
635
+ <code><%= File.read '../examples/counter/RSpec/counter_proto.rb' %></code>
592
636
  <% end %>
593
637
 
594
638
  Before we continue, replace the contents of the files named <tt>RSpec/counter_proto.rb</tt> and <tt>xUnit/counter_proto.rb</tt> with the source code shown in <%= xref "fig:counter_proto.rb" %>.
@@ -598,7 +642,7 @@
598
642
  <% section "Verify the prototype", "usage.tutorial.test-proto" do %>
599
643
  Now that we have implemented our prototype, we are ready to verify it against our specification by running the test This process is illustrated by <%= xref "fig:test-proto.RSpec" %> and <%= xref "fig:test-proto.unit-test" %>.
600
644
 
601
- In these examples, the @PROTOTYPE@ environment variable is assigned the value 1 while running the test so that, instead of our design, our prototype is verified against our specification (see <%= xref "usage.test-runner.env-vars" %> for details). Also, the <%= xref "setup.reqs", "GPL Cver simulator" %> denoted by _cver_, is used to run the simulation.
645
+ In these examples, the @PROTOTYPE@ environment variable is assigned the value 1 while running the test so that, instead of our design, our prototype is verified against our specification (see <%= xref "usage.runner.env-vars" %> for details). Also, the <%= xref "setup.reqs", "GPL Cver simulator" %> denoted by _cver_, is used to run the simulation.
602
646
 
603
647
  <% example "Running a test with specification in RSpec format", "fig:test-proto.RSpec" do %>
604
648
  <pre>
@@ -640,7 +684,7 @@
640
684
  Now that we have implemented and verified our prototype, we are ready to implement our design This is often quite simple because we translate _existing_ code from Ruby (our prototype) into Verilog (our design). The result of this process is illustrated by <%= xref "fig:counter.v_impl" %>.
641
685
 
642
686
  <% example "Implementation of a simple up-counter with synchronous reset", "fig:counter.v_impl" do %>
643
- <code lang="verilog"><%= File.read '../samp/counter/counter.v' %></code>
687
+ <code lang="verilog"><%= File.read '../examples/counter/counter.v' %></code>
644
688
  <% end %>
645
689
 
646
690
  Before we continue, replace the contents of the files named <tt>RSpec/counter.v</tt> and <tt>xUnit/counter.v</tt> with the source code shown in <%= xref "fig:counter.v_impl" %>
@@ -683,17 +727,23 @@
683
727
  <% end %>
684
728
 
685
729
  <% chapter "Hacking", "hacking" do %>
686
- <% section "Getting the source code", "hacking.scm" do %>
730
+ <% section "Getting the latest source code", "hacking.scm" do %>
687
731
  Check out the source code using "Darcs":http://darcs.net from the project repository:
688
732
 
689
733
  darcs get http://ruby-vpi.rubyforge.org/src/ruby-vpi
690
734
  <% end %>
691
735
 
692
736
 
737
+ <% section "Installing without really installing" do %>
738
+ After you've obtained the latest source code (see <%= xref "hacking.scm" %>), you can use it immediately without having to build or install a Ruby-VPI gem. To do this, set the @RUBYLIB@ environment variable to the path where you checked out the source code _plus_ the <tt>lib/</tt> directory.
739
+
740
+ For example, if you checked out the source code into <tt>/home/foo/ruby-vpi/</tt> then you would set the value of the @RUBYLIB@ environment variable to <tt>/home/foo/ruby-vpi/lib/</tt>. Henceforth, any Ruby-VPI tests you run will use the checked-out source code directly.
741
+ <% end %>
742
+
743
+
693
744
  <% section "Building release packages", "hacking.release-packages" do %>
694
745
  In addition to the <%= xref "setup.reqs", "normal requirements" %> you need the following software to build release packages:
695
746
 
696
- * "SWIG":http://www.swig.org/
697
747
  * "RedCloth":http://rubyforge.org/projects/redcloth/
698
748
  * "CodeRay":http://rubyforge.org/projects/coderay/
699
749
 
@@ -703,6 +753,8 @@
703
753
 
704
754
  <% section "Editing this manual", "hacking.manual" do %>
705
755
  The "doc" files inside the <tt>doc/</tt> directory are really _plain text_ files that contain the source code of this manual. You can edit these files and run the <pre>rake</pre> command to automatically generate the HTML documentation you are currently viewing.
756
+
757
+ In addition, the <tt>doc/README</tt> file says: <blockquote><%= File.read 'README' %></blockquote>
706
758
  <% end %>
707
759
  <% end %>
708
760
 
@@ -757,23 +809,10 @@
757
809
  <% end %>
758
810
  <% end %>
759
811
 
760
- <% section "Vpi::reset", "problems.ivl.vpi_reset" do %>
812
+ <% section "VPI::reset", "problems.ivl.vpi_reset" do %>
761
813
  In version 0.8 of Icarus Verilog, the @vpi_control(vpiReset)@ VPI function causes an assertion to fail inside the simulator. As a result, the simulation terminates and a core dump is produced.
762
814
  <% end %>
763
815
  <% end %>
764
-
765
- <% section "Cadence NC-Sim", "problem.ncsim" do %>
766
- The following sections describe problems that occur when Cadence NC-Sim (version 05.83-s003) is used with Ruby-VPI.
767
-
768
- <% section "Cannot force values onto handles", "problem.ncsim.vpiForceFlag" do %>
769
- When you write to a handle's value using @vpi_put_value()@ with the @VpiForceFlag@ propagation parameter, it does not have any effect. As a result, the "register_file" sample test fails when you run it with NC-Sim.
770
-
771
- This might be a bug in NC-Sim itself: even though I specified the "+access+rwc" command-line option for NC-Sim, I'm thinking that the force/release capability is not really enabled. However, it's more likely that there's a bug in the "register_file" sample test.
772
-
773
- If you happen to know the solution, please tell me either on the project forums or via e-mail (see the LICENSE file for my e-mail address). Thanks.
774
- <% end %>
775
-
776
- <% end %>
777
816
  <% end %>
778
817
 
779
818
  <% chapter "Glossary", "glossary" do %>