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.
- data/Rakefile +15 -19
- data/bin/generate/proto.rb +15 -10
- data/bin/ruby-vpi +2 -0
- data/doc/README +3 -5
- data/doc/Rakefile +3 -3
- data/doc/common.css +24 -136
- data/doc/common.tpl +48 -37
- data/doc/figures/figures.dia +19 -19
- data/doc/figures/ruby_relay.png +0 -0
- data/doc/history.html +252 -67
- data/doc/history.inc +98 -1
- data/doc/history.yaml +105 -0
- data/doc/intro.inc +43 -32
- data/doc/lib/doc_format.rb +19 -13
- data/doc/lib/doc_proxy.rb +7 -7
- data/doc/manual.doc +156 -117
- data/doc/manual.html +601 -560
- data/doc/memo.html +29 -25
- data/doc/print.css +63 -4
- data/doc/readme.doc +4 -6
- data/doc/readme.html +129 -111
- data/doc/rss.xml +168 -7
- data/doc/screen.css +146 -0
- data/doc/spacing.css +57 -0
- data/{samp → examples}/counter/RSpec/Rakefile +0 -0
- data/{samp → examples}/counter/RSpec/counter_design.rb +0 -0
- data/examples/counter/RSpec/counter_proto.rb +9 -0
- data/{samp → examples}/counter/RSpec/counter_runner.rake +0 -0
- data/{samp → examples}/counter/RSpec/counter_spec.rb +0 -0
- data/{samp → examples}/counter/Rakefile +0 -0
- data/{samp → examples}/counter/counter.v +0 -0
- data/{samp → examples}/counter/xUnit/Rakefile +0 -0
- data/{samp → examples}/counter/xUnit/counter_bench.rb +0 -0
- data/{samp → examples}/counter/xUnit/counter_bench.v +0 -0
- data/{samp → examples}/counter/xUnit/counter_design.rb +0 -0
- data/examples/counter/xUnit/counter_proto.rb +9 -0
- data/{samp → examples}/counter/xUnit/counter_runner.rake +0 -0
- data/{samp → examples}/counter/xUnit/counter_spec.rb +0 -0
- data/{samp → examples}/pipelined_alu/Hw5UnitModel.rb +0 -0
- data/{samp → examples}/pipelined_alu/README +0 -0
- data/{samp → examples}/pipelined_alu/Rakefile +0 -0
- data/{samp → examples}/pipelined_alu/TestHw5UnitModel.rb +0 -0
- data/{samp → examples}/pipelined_alu/hw5_unit.v +0 -0
- data/{samp → examples}/pipelined_alu/hw5_unit_design.rb +0 -7
- data/examples/pipelined_alu/hw5_unit_proto.rb +2 -0
- data/{samp → examples}/pipelined_alu/hw5_unit_runner.rake +0 -0
- data/{samp → examples}/pipelined_alu/hw5_unit_spec.rb +0 -0
- data/{samp → examples}/pipelined_alu/int_gen.rb +0 -0
- data/{samp → examples}/register_file/LICENSE +0 -0
- data/{samp → examples}/register_file/README +0 -0
- data/{samp → examples}/register_file/Rakefile +0 -0
- data/{samp → examples}/register_file/register_file.v +0 -0
- data/{samp → examples}/register_file/register_file_design.rb +0 -0
- data/examples/register_file/register_file_proto.rb +11 -0
- data/{samp → examples}/register_file/register_file_runner.rake +0 -0
- data/{samp → examples}/register_file/register_file_spec.rb +0 -0
- data/ext/main.c +5 -5
- data/ext/swig_vpi.i +6 -2
- data/lib/ruby-vpi/core/callback.rb +142 -0
- data/lib/ruby-vpi/core/edge.rb +128 -0
- data/lib/ruby-vpi/core/handle.rb +421 -0
- data/lib/ruby-vpi/core/scheduler.rb +244 -0
- data/lib/ruby-vpi/core/struct.rb +123 -0
- data/lib/ruby-vpi/core.rb +41 -0
- data/lib/ruby-vpi/rcov.rb +25 -12
- data/lib/ruby-vpi/runner.rb +30 -26
- data/lib/ruby-vpi/runner_boot_loader.rb +67 -37
- data/lib/ruby-vpi.rb +2 -2
- data/ref/c/annotated.html +1 -1
- data/ref/c/common_8h.html +1 -1
- data/ref/c/files.html +1 -1
- data/ref/c/functions.html +1 -1
- data/ref/c/functions_vars.html +1 -1
- data/ref/c/globals.html +1 -1
- data/ref/c/globals_0x63.html +1 -1
- data/ref/c/globals_0x65.html +1 -1
- data/ref/c/globals_0x66.html +1 -1
- data/ref/c/globals_0x6d.html +1 -1
- data/ref/c/globals_0x70.html +1 -1
- data/ref/c/globals_0x72.html +1 -1
- data/ref/c/globals_0x73.html +1 -1
- data/ref/c/globals_0x74.html +1 -1
- data/ref/c/globals_0x76.html +1 -1
- data/ref/c/globals_0x78.html +1 -1
- data/ref/c/globals_defs.html +1 -1
- data/ref/c/globals_defs_0x65.html +1 -1
- data/ref/c/globals_defs_0x70.html +1 -1
- data/ref/c/globals_defs_0x76.html +1 -1
- data/ref/c/globals_defs_0x78.html +1 -1
- data/ref/c/globals_enum.html +1 -1
- data/ref/c/globals_eval.html +1 -1
- data/ref/c/globals_func.html +1 -1
- data/ref/c/globals_type.html +1 -1
- data/ref/c/globals_vars.html +1 -1
- data/ref/c/index.html +1 -1
- data/ref/c/main_8c.html +1 -1
- data/ref/c/main_8h.html +1 -1
- data/ref/c/relay_8c.html +1 -1
- data/ref/c/relay_8h.html +1 -1
- data/ref/c/structt__cb__data.html +1 -1
- data/ref/c/structt__vpi__delay.html +1 -1
- data/ref/c/structt__vpi__error__info.html +1 -1
- data/ref/c/structt__vpi__strengthval.html +1 -1
- data/ref/c/structt__vpi__systf__data.html +1 -1
- data/ref/c/structt__vpi__time.html +1 -1
- data/ref/c/structt__vpi__value.html +1 -1
- data/ref/c/structt__vpi__vecval.html +1 -1
- data/ref/c/structt__vpi__vlog__info.html +1 -1
- data/ref/c/verilog_8h.html +1 -1
- data/ref/c/vlog_8c.html +1 -1
- data/ref/c/vlog_8h.html +1 -1
- data/ref/c/vpi__user_8h.html +1 -1
- data/ref/ruby/classes/ERB.html +7 -5
- data/ref/ruby/classes/ERB.src/{M000026.html → M000024.html} +0 -0
- data/ref/ruby/classes/FileUtils.html +11 -11
- data/ref/ruby/classes/FileUtils.src/{M000027.html → M000025.html} +0 -0
- data/ref/ruby/classes/FileUtils.src/{M000028.html → M000026.html} +0 -0
- data/ref/ruby/classes/Float.html +8 -6
- data/ref/ruby/classes/Float.src/{M000021.html → M000019.html} +0 -0
- data/ref/ruby/classes/Integer.html +67 -65
- data/ref/ruby/classes/Integer.src/M000007.html +25 -0
- data/ref/ruby/classes/Integer.src/{M000014.html → M000008.html} +5 -5
- data/ref/ruby/classes/Integer.src/M000009.html +5 -12
- data/ref/ruby/classes/Integer.src/M000010.html +5 -5
- data/ref/ruby/classes/Integer.src/M000011.html +5 -5
- data/ref/ruby/classes/Integer.src/M000012.html +5 -5
- data/ref/ruby/classes/Integer.src/M000015.html +25 -0
- data/ref/ruby/classes/Integer.src/M000016.html +31 -0
- data/ref/ruby/classes/Integer.src/M000017.html +12 -12
- data/ref/ruby/classes/Integer.src/M000018.html +17 -18
- data/ref/ruby/classes/Object.html +126 -0
- data/ref/ruby/classes/RDoc.html +5 -5
- data/ref/ruby/classes/RDoc.src/{M000061.html → M000081.html} +0 -0
- data/ref/ruby/classes/RubyVPI.html +50 -9
- data/ref/ruby/classes/String.html +22 -20
- data/ref/ruby/classes/String.src/M000020.html +36 -0
- data/ref/ruby/classes/String.src/M000021.html +41 -0
- data/ref/ruby/classes/String.src/M000022.html +5 -23
- data/ref/ruby/classes/String.src/M000023.html +5 -28
- data/ref/ruby/classes/{Vpi → VPI}/Handle.html +442 -140
- data/ref/ruby/classes/{Vpi/Handle.src/M000042.html → VPI/Handle.src/M000037.html} +4 -4
- data/ref/ruby/classes/VPI/Handle.src/M000038.html +21 -0
- data/ref/ruby/classes/VPI/Handle.src/M000039.html +18 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000036.html → VPI/Handle.src/M000040.html} +5 -5
- data/ref/ruby/classes/VPI/Handle.src/M000045.html +18 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000038.html → VPI/Handle.src/M000046.html} +5 -5
- data/ref/ruby/classes/VPI/Handle.src/M000057.html +18 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000040.html → VPI/Handle.src/M000058.html} +5 -5
- data/ref/ruby/classes/VPI/Handle.src/M000061.html +18 -0
- data/ref/ruby/classes/VPI/Handle.src/M000062.html +18 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000054.html → VPI/Handle.src/M000065.html} +11 -11
- data/ref/ruby/classes/VPI/Handle.src/M000067.html +21 -0
- data/ref/ruby/classes/VPI/Handle.src/M000068.html +28 -0
- data/ref/ruby/classes/VPI/Handle.src/M000069.html +50 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000048.html → VPI/Handle.src/M000070.html} +6 -6
- data/ref/ruby/classes/{Vpi/Handle.src/M000049.html → VPI/Handle.src/M000071.html} +6 -6
- data/ref/ruby/classes/{Vpi/Handle.src/M000050.html → VPI/Handle.src/M000072.html} +5 -5
- data/ref/ruby/classes/{Vpi/Handle.src/M000051.html → VPI/Handle.src/M000073.html} +17 -17
- data/ref/ruby/classes/VPI/Handle.src/M000075.html +18 -0
- data/ref/ruby/classes/VPI/Handle.src/M000076.html +40 -0
- data/ref/ruby/classes/{Vpi/Handle.src/M000056.html → VPI/Handle.src/M000077.html} +18 -18
- data/ref/ruby/classes/{Vpi → VPI}/S_vpi_time.html +22 -20
- data/ref/ruby/classes/VPI/S_vpi_time.src/M000078.html +18 -0
- data/ref/ruby/classes/VPI/S_vpi_time.src/M000079.html +19 -0
- data/ref/ruby/classes/{Vpi → VPI}/S_vpi_value.html +37 -23
- data/ref/ruby/classes/VPI/S_vpi_value.src/M000034.html +35 -0
- data/ref/ruby/classes/VPI/S_vpi_value.src/M000035.html +42 -0
- data/ref/ruby/classes/VPI/S_vpi_value.src/M000036.html +42 -0
- data/ref/ruby/classes/{Vpi.html → VPI.html} +129 -34
- data/ref/ruby/classes/VPI.src/M000027.html +19 -0
- data/ref/ruby/classes/VPI.src/M000028.html +18 -0
- data/ref/ruby/classes/VPI.src/M000029.html +19 -0
- data/ref/ruby/classes/VPI.src/M000031.html +25 -0
- data/ref/ruby/classes/VPI.src/M000032.html +26 -0
- data/ref/ruby/classes/VerilogParser/Module/Port.html +17 -15
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000004.html +23 -0
- data/ref/ruby/classes/VerilogParser/Module/Port.src/{M000007.html → M000005.html} +0 -0
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000006.html +5 -10
- data/ref/ruby/classes/VerilogParser/Module.html +7 -5
- data/ref/ruby/classes/VerilogParser/Module.src/{M000005.html → M000003.html} +0 -0
- data/ref/ruby/classes/VerilogParser.html +7 -5
- data/ref/ruby/classes/VerilogParser.src/{M000004.html → M000002.html} +0 -0
- data/ref/ruby/created.rid +1 -1
- data/ref/ruby/files/bin/generate_rb.html +2 -2
- data/ref/ruby/files/lib/ruby-vpi/{vpi_rb.html → core/callback_rb.html} +7 -8
- data/ref/ruby/files/lib/ruby-vpi/core/edge_rb.html +114 -0
- data/ref/ruby/files/lib/ruby-vpi/core/handle_rb.html +107 -0
- data/ref/ruby/files/lib/ruby-vpi/core/scheduler_rb.html +114 -0
- data/ref/ruby/files/lib/ruby-vpi/core/struct_rb.html +108 -0
- data/ref/ruby/files/lib/ruby-vpi/core_rb.html +121 -0
- data/ref/ruby/files/lib/ruby-vpi/rcov_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.html +5 -41
- data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.src/M000001.html +3 -3
- data/ref/ruby/files/lib/ruby-vpi/runner_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi_rb.html +1 -1
- data/ref/ruby/fr_class_index.html +5 -4
- data/ref/ruby/fr_file_index.html +6 -1
- data/ref/ruby/fr_method_index.html +80 -60
- metadata +126 -103
- data/ext/swig_vpi.h +0 -924
- data/ext/swig_wrap.cin +0 -7083
- data/lib/ruby-vpi/vpi.rb +0 -651
- data/ref/ruby/classes/Integer.src/M000013.html +0 -18
- data/ref/ruby/classes/Integer.src/M000019.html +0 -25
- data/ref/ruby/classes/Integer.src/M000020.html +0 -30
- data/ref/ruby/classes/String.src/M000024.html +0 -18
- data/ref/ruby/classes/String.src/M000025.html +0 -18
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000008.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000035.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000037.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000039.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000041.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000043.html +0 -21
- data/ref/ruby/classes/Vpi/Handle.src/M000044.html +0 -21
- data/ref/ruby/classes/Vpi/Handle.src/M000045.html +0 -22
- data/ref/ruby/classes/Vpi/Handle.src/M000046.html +0 -50
- data/ref/ruby/classes/Vpi/Handle.src/M000047.html +0 -91
- data/ref/ruby/classes/Vpi/Handle.src/M000053.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000057.html +0 -40
- data/ref/ruby/classes/Vpi/S_vpi_time.src/M000058.html +0 -18
- data/ref/ruby/classes/Vpi/S_vpi_time.src/M000059.html +0 -19
- data/ref/ruby/classes/Vpi/S_vpi_value.src/M000032.html +0 -18
- data/ref/ruby/classes/Vpi/S_vpi_value.src/M000033.html +0 -18
- data/ref/ruby/classes/Vpi/S_vpi_value.src/M000034.html +0 -18
- data/ref/ruby/classes/Vpi.src/M000029.html +0 -28
- data/ref/ruby/classes/Vpi.src/M000030.html +0 -39
- data/ref/ruby/classes/Vpi.src/M000031.html +0 -20
- data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.src/M000002.html +0 -18
- data/samp/counter/RSpec/counter_proto.rb +0 -10
- data/samp/counter/xUnit/counter_proto.rb +0 -10
- data/samp/pipelined_alu/hw5_unit_proto.rb +0 -4
- 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
|
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
|
-
|
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>
|
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
|
-
|
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
|
-
|
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
|
-
|
167
|
-
|
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
|
-
|
171
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
178
|
-
#include <stdarg.h>
|
179
|
-
void foo(va_list ap) {
|
180
|
-
va_list *p = ≈
|
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 @
|
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
|
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
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
time
|
336
|
-
count
|
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
|
-
<%
|
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 "
|
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.
|
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 "
|
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.
|
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.
|
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
|
437
|
+
<pre>% rake -f your_test_runner.rake
|
395
438
|
|
396
|
-
<%= `rake -f ../
|
439
|
+
<%= `rake -f ../examples/counter/RSpec/counter_runner.rake` %></pre>
|
397
440
|
|
398
|
-
<% section "Environment variables", "usage.
|
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, @
|
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 @
|
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
|
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
|
-
|
413
|
-
export
|
456
|
+
DEBUGGER=1
|
457
|
+
export DEBUGGER
|
414
458
|
rake
|
415
459
|
</pre> in Bourne shell or
|
416
460
|
<pre>
|
417
|
-
setenv
|
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 "
|
482
|
-
The <tt>
|
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
|
-
|
529
|
-
|
530
|
-
|
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 '../
|
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 '../
|
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 '../
|
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.
|
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 '../
|
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 "
|
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 %>
|