ruby-vpi 11.1.0 → 11.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +8 -37
- data/bin/generate_test_tpl/bench.v +1 -1
- data/doc/{src/LICENSE → LICENSE} +0 -0
- data/doc/Rakefile +39 -14
- data/doc/common.css +144 -0
- data/doc/common.tpl +49 -0
- data/doc/figures/figures.dia +1589 -0
- data/doc/history.erb +18 -0
- data/doc/history.html +1726 -0
- data/doc/history.rb +14 -0
- data/doc/history.yml +686 -0
- data/doc/images/{COPYING → LICENSE} +0 -0
- data/doc/intro.inc +48 -0
- data/doc/lib/doc_format.rb +62 -0
- data/doc/lib/doc_proxy.rb +160 -0
- data/doc/lib/erb_content.rb +67 -0
- data/doc/lib/erb_proxy.rb +48 -0
- data/doc/manual.erb +768 -0
- data/doc/manual.html +2107 -0
- data/doc/manual.rb +5 -0
- data/{MEMO → doc/memo.erb} +0 -0
- data/{memo.part.html → doc/memo.html} +38 -5
- data/doc/readme.erb +36 -0
- data/doc/readme.html +171 -0
- data/index.html +1 -0
- data/lib/ruby-vpi/float.rb +52 -0
- data/lib/ruby-vpi/rspec.rb +6 -1
- data/lib/ruby-vpi/verilog_parser.rb +4 -5
- data/ref/c/annotated.html +1 -6
- data/ref/c/common_8h.html +1 -1
- data/ref/c/files.html +1 -3
- data/ref/c/functions.html +24 -44
- data/ref/c/functions_vars.html +24 -44
- data/ref/c/globals.html +5 -211
- data/ref/c/globals_0x63.html +32 -49
- data/ref/c/globals_0x65.html +3 -10
- data/ref/c/globals_0x66.html +3 -20
- data/ref/c/globals_0x70.html +19 -26
- data/ref/c/globals_0x72.html +4 -15
- data/ref/c/globals_0x73.html +13 -199
- data/ref/c/globals_0x74.html +2 -9
- data/ref/c/globals_0x76.html +415 -426
- data/ref/c/globals_0x78.html +3 -10
- data/ref/c/globals_defs.html +30 -35
- data/ref/c/globals_defs_0x65.html +2 -7
- data/ref/c/globals_defs_0x70.html +3 -8
- data/ref/c/globals_defs_0x76.html +413 -420
- data/ref/c/globals_defs_0x78.html +2 -7
- data/ref/c/globals_enum.html +1 -1
- data/ref/c/globals_eval.html +1 -1
- data/ref/c/globals_func.html +14 -173
- data/ref/c/globals_type.html +26 -29
- data/ref/c/globals_vars.html +4 -88
- data/ref/c/index.html +1 -1
- data/ref/c/relay_8c.html +1 -1
- data/ref/c/relay_8h.html +1 -1
- data/ref/c/structrelay____RubyOptions____def.html +1 -1
- data/ref/c/structt__cb__data.html +6 -23
- data/ref/c/structt__vpi__delay.html +3 -20
- data/ref/c/structt__vpi__error__info.html +3 -71
- data/ref/c/structt__vpi__strengthval.html +3 -3
- data/ref/c/structt__vpi__systf__data.html +12 -46
- data/ref/c/structt__vpi__time.html +3 -3
- data/ref/c/structt__vpi__value.html +3 -113
- data/ref/c/structt__vpi__vecval.html +3 -3
- data/ref/c/structt__vpi__vlog__info.html +3 -54
- data/ref/c/swig_8c.html +2 -2
- data/ref/c/swig_8h.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 +16 -16
- data/ref/ruby/classes/ERB.html +5 -5
- data/ref/ruby/classes/ERB.src/{M000034.html → M000036.html} +0 -0
- data/ref/ruby/classes/FileUtils.html +10 -10
- data/ref/ruby/classes/FileUtils.src/{M000081.html → M000083.html} +0 -0
- data/ref/ruby/classes/FileUtils.src/{M000082.html → M000084.html} +0 -0
- data/ref/ruby/classes/Float.html +140 -0
- data/ref/ruby/classes/Float.src/M000031.html +19 -0
- data/ref/ruby/classes/RDoc.html +5 -5
- data/ref/ruby/classes/RDoc.src/{M000095.html → M000097.html} +0 -0
- data/ref/ruby/classes/RubyVpi.html +10 -10
- data/ref/ruby/classes/RubyVpi.src/{M000083.html → M000085.html} +0 -0
- data/ref/ruby/classes/RubyVpi.src/{M000084.html → M000086.html} +0 -0
- data/ref/ruby/classes/String.html +33 -10
- data/ref/ruby/classes/String.src/M000033.html +28 -5
- data/ref/ruby/classes/String.src/M000034.html +18 -0
- data/ref/ruby/classes/String.src/M000035.html +36 -0
- data/ref/ruby/classes/Template.html +5 -5
- data/ref/ruby/classes/Template.src/{M000031.html → M000032.html} +0 -0
- data/ref/ruby/classes/VerilogParser/Module.src/M000006.html +9 -8
- data/ref/ruby/classes/VerilogParser/Module/Parameter.src/M000011.html +5 -7
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000007.html +7 -7
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000008.html +4 -4
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000009.html +4 -4
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000010.html +4 -4
- data/ref/ruby/classes/Vpi/Handle.html +46 -46
- data/ref/ruby/classes/Vpi/Handle.src/M000087.html +5 -9
- data/ref/ruby/classes/Vpi/Handle.src/M000088.html +5 -31
- data/ref/ruby/classes/Vpi/Handle.src/M000089.html +9 -74
- data/ref/ruby/classes/Vpi/Handle.src/M000090.html +31 -17
- data/ref/ruby/classes/Vpi/Handle.src/M000091.html +74 -11
- data/ref/ruby/classes/Vpi/Handle.src/M000092.html +30 -0
- data/ref/ruby/classes/Vpi/Handle.src/M000093.html +11 -55
- data/ref/ruby/classes/Vpi/Handle.src/M000095.html +68 -0
- data/ref/ruby/classes/Vpi/Handle/Property.html +5 -5
- data/ref/ruby/classes/Vpi/Handle/Property.src/{M000094.html → M000096.html} +0 -0
- data/ref/ruby/classes/XX/Document.html +45 -45
- data/ref/ruby/classes/XX/Document.src/M000074.html +9 -7
- data/ref/ruby/classes/XX/Document.src/M000075.html +7 -7
- data/ref/ruby/classes/XX/Document.src/M000076.html +7 -9
- data/ref/ruby/classes/XX/Document.src/M000077.html +7 -8
- data/ref/ruby/classes/XX/Document.src/M000078.html +9 -8
- data/ref/ruby/classes/XX/Document.src/M000079.html +8 -21
- data/ref/ruby/classes/XX/Document.src/M000080.html +8 -85
- data/ref/ruby/classes/XX/Document.src/M000081.html +34 -0
- data/ref/ruby/classes/XX/Document.src/M000082.html +98 -0
- data/ref/ruby/classes/XX/HTML4.html +5 -5
- data/ref/ruby/classes/XX/HTML4.src/{M000036.html → M000038.html} +0 -0
- data/ref/ruby/classes/XX/HTML4/Strict.html +5 -5
- data/ref/ruby/classes/XX/HTML4/Strict.src/{M000038.html → M000040.html} +0 -0
- data/ref/ruby/classes/XX/HTML4/Transitional.html +5 -5
- data/ref/ruby/classes/XX/HTML4/Transitional.src/{M000037.html → M000039.html} +0 -0
- data/ref/ruby/classes/XX/Markup.html +5 -5
- data/ref/ruby/classes/XX/Markup.src/{M000043.html → M000045.html} +0 -0
- data/ref/ruby/classes/XX/Markup/ClassMethods.html +40 -40
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000046.html +9 -12
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000047.html +7 -7
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000048.html +12 -14
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000049.html +7 -7
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000050.html +14 -14
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000051.html +7 -9
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000052.html +27 -0
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000053.html +22 -0
- data/ref/ruby/classes/XX/Markup/InstanceMethods.html +100 -100
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000054.html +43 -18
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000055.html +20 -35
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000056.html +18 -7
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000057.html +35 -18
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000058.html +7 -19
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000059.html +18 -19
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000060.html +19 -15
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000061.html +19 -10
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000062.html +15 -13
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000063.html +10 -7
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000064.html +13 -7
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000065.html +7 -7
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000066.html +7 -7
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000067.html +7 -7
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000068.html +7 -8
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000069.html +7 -7
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000070.html +8 -7
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000071.html +7 -7
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000072.html +20 -0
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000073.html +20 -0
- data/ref/ruby/classes/XX/XHTML.html +5 -5
- data/ref/ruby/classes/XX/XHTML.src/{M000039.html → M000041.html} +0 -0
- data/ref/ruby/classes/XX/XHTML/Strict.html +5 -5
- data/ref/ruby/classes/XX/XHTML/Strict.src/{M000041.html → M000043.html} +0 -0
- data/ref/ruby/classes/XX/XHTML/Transitional.html +5 -5
- data/ref/ruby/classes/XX/XHTML/Transitional.src/{M000040.html → M000042.html} +0 -0
- data/ref/ruby/classes/XX/XML.html +5 -5
- data/ref/ruby/classes/XX/XML.src/{M000035.html → M000037.html} +0 -0
- data/ref/ruby/classes/XX/XMLish.html +5 -5
- data/ref/ruby/classes/XX/XMLish.src/{M000042.html → M000044.html} +0 -0
- data/ref/ruby/created.rid +1 -1
- data/ref/ruby/files/lib/ruby-vpi/float_rb.html +101 -0
- data/ref/ruby/files/lib/ruby-vpi/rspec_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/runner_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/verilog_parser_rb.html +1 -1
- data/ref/ruby/fr_class_index.html +1 -0
- data/ref/ruby/fr_file_index.html +1 -0
- data/ref/ruby/fr_method_index.html +69 -67
- data/samp/counter/counter.v +4 -4
- data/samp/counter/counter_rspec_spec.rb +4 -8
- data/samp/counter/counter_xunit_spec.rb +4 -8
- metadata +112 -196
- data/HEADER +0 -97
- data/HISTORY +0 -687
- data/README +0 -23
- data/doc/background.html +0 -3
- data/doc/background.methodology.html +0 -3
- data/doc/background.organization.html +0 -10
- data/doc/background.running-tests.html +0 -3
- data/doc/background.terminology.html +0 -3
- data/doc/gfdl-0.html +0 -18
- data/doc/gfdl-1.html +0 -70
- data/doc/gfdl-10.html +0 -15
- data/doc/gfdl-2.html +0 -13
- data/doc/gfdl-3.html +0 -31
- data/doc/gfdl-4.html +0 -75
- data/doc/gfdl-5.html +0 -20
- data/doc/gfdl-6.html +0 -12
- data/doc/gfdl-7.html +0 -16
- data/doc/gfdl-8.html +0 -17
- data/doc/gfdl-9.html +0 -9
- data/doc/gfdl-addendum.html +0 -25
- data/doc/gfdl.html +0 -11
- data/doc/glossary.html +0 -3
- data/doc/hacking.html +0 -3
- data/doc/hacking.release-packages.html +0 -7
- data/doc/images/ChangeLog +0 -27
- data/doc/images/blank.png +0 -0
- data/doc/images/callouts/1.png +0 -0
- data/doc/images/callouts/10.png +0 -0
- data/doc/images/callouts/11.png +0 -0
- data/doc/images/callouts/12.png +0 -0
- data/doc/images/callouts/13.png +0 -0
- data/doc/images/callouts/14.png +0 -0
- data/doc/images/callouts/15.png +0 -0
- data/doc/images/callouts/2.png +0 -0
- data/doc/images/callouts/3.png +0 -0
- data/doc/images/callouts/4.png +0 -0
- data/doc/images/callouts/5.png +0 -0
- data/doc/images/callouts/6.png +0 -0
- data/doc/images/callouts/7.png +0 -0
- data/doc/images/callouts/8.png +0 -0
- data/doc/images/callouts/9.png +0 -0
- data/doc/images/callouts/ChangeLog +0 -15
- data/doc/images/copyright +0 -55
- data/doc/images/draft.png +0 -0
- data/doc/images/toc-blank.png +0 -0
- data/doc/images/toc-minus.png +0 -0
- data/doc/images/toc-plus.png +0 -0
- data/doc/index.html +0 -4
- data/doc/introduction.html +0 -3
- data/doc/introduction.license.html +0 -3
- data/doc/introduction.manifest.html +0 -3
- data/doc/introduction.related-works.html +0 -3
- data/doc/introduction.resources.html +0 -3
- data/doc/manual.txt +0 -1852
- data/doc/problem.ivl.html +0 -18
- data/doc/problems.html +0 -3
- data/doc/problems.ruby.html +0 -3
- data/doc/problems.vsim.html +0 -3
- data/doc/setup.html +0 -3
- data/doc/setup.installation.html +0 -9
- data/doc/setup.maintenance.html +0 -3
- data/doc/setup.reqs.html +0 -3
- data/doc/src/figures.dia +0 -0
- data/doc/src/license.xml +0 -446
- data/doc/src/manual.xml +0 -1824
- data/doc/src/manual.xsl +0 -23
- data/doc/src/shared.dtd +0 -62
- data/doc/styles/manual.css +0 -91
- data/doc/usage.examples.html +0 -3
- data/doc/usage.html +0 -3
- data/doc/usage.tools.html +0 -9
- data/doc/usage.tutorial.html +0 -189
- data/header.html +0 -95
- data/header.part.html +0 -95
- data/history.html +0 -1442
- data/history.part.html +0 -1346
- data/memo.html +0 -211
- data/readme.html +0 -138
- data/readme.part.html +0 -42
- data/ref/c/globals_0x62.html +0 -62
- data/ref/c/globals_0x67.html +0 -64
- data/ref/c/globals_0x69.html +0 -62
- data/ref/c/globals_0x6c.html +0 -64
- data/ref/c/globals_0x6d.html +0 -62
- data/ref/c/globals_0x6e.html +0 -63
- data/ref/c/globals_0x75.html +0 -63
- data/ref/c/globals_defs_0x6c.html +0 -57
- data/ref/c/globals_defs_0x6e.html +0 -56
- data/ref/c/globals_defs_0x72.html +0 -57
- data/ref/c/globals_defs_0x73.html +0 -164
- data/ref/c/globals_defs_0x75.html +0 -56
- data/ref/c/globals_func_0x66.html +0 -62
- data/ref/c/globals_func_0x67.html +0 -55
- data/ref/c/globals_func_0x69.html +0 -53
- data/ref/c/globals_func_0x70.html +0 -53
- data/ref/c/globals_func_0x72.html +0 -57
- data/ref/c/globals_func_0x73.html +0 -114
- data/ref/c/globals_func_0x76.html +0 -57
- data/ref/c/structswig__cast__info.html +0 -98
- data/ref/c/structswig__class.html +0 -115
- data/ref/c/structswig__module__info.html +0 -132
- data/ref/c/structswig__type__info.html +0 -132
- data/ref/c/swig__vpi_8h.html +0 -8739
- data/ref/c/swig__wrap_8cin.html +0 -11556
- data/ref/c/unions__vpi__value__value.html +0 -166
- data/ref/ruby/classes/String.src/M000032.html +0 -41
- data/ref/ruby/classes/Vpi/Handle.src/M000085.html +0 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000086.html +0 -18
- data/ref/ruby/classes/XX/Document.src/M000072.html +0 -22
- data/ref/ruby/classes/XX/Document.src/M000073.html +0 -20
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000044.html +0 -22
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000045.html +0 -20
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000052.html +0 -56
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000053.html +0 -33
- data/style.css +0 -47
data/doc/images/blank.png
DELETED
Binary file
|
data/doc/images/callouts/1.png
DELETED
Binary file
|
data/doc/images/callouts/10.png
DELETED
Binary file
|
data/doc/images/callouts/11.png
DELETED
Binary file
|
data/doc/images/callouts/12.png
DELETED
Binary file
|
data/doc/images/callouts/13.png
DELETED
Binary file
|
data/doc/images/callouts/14.png
DELETED
Binary file
|
data/doc/images/callouts/15.png
DELETED
Binary file
|
data/doc/images/callouts/2.png
DELETED
Binary file
|
data/doc/images/callouts/3.png
DELETED
Binary file
|
data/doc/images/callouts/4.png
DELETED
Binary file
|
data/doc/images/callouts/5.png
DELETED
Binary file
|
data/doc/images/callouts/6.png
DELETED
Binary file
|
data/doc/images/callouts/7.png
DELETED
Binary file
|
data/doc/images/callouts/8.png
DELETED
Binary file
|
data/doc/images/callouts/9.png
DELETED
Binary file
|
@@ -1,15 +0,0 @@
|
|
1
|
-
2002-05-17 Norman Walsh <nwalsh@users.sourceforge.net>
|
2
|
-
|
3
|
-
* 11.gif, 11.png, 12.gif, 12.png, 13.gif, 13.png, 14.gif, 14.png, 15.gif, 15.png:
|
4
|
-
New file.
|
5
|
-
|
6
|
-
2002-01-28 Norman Walsh <nwalsh@users.sourceforge.net>
|
7
|
-
|
8
|
-
* 1.gif, 10.gif, 2.gif, 3.gif, 4.gif, 5.gif, 6.gif, 7.gif, 8.gif, 9.gif:
|
9
|
-
New file.
|
10
|
-
|
11
|
-
2001-04-02 Norman Walsh <nwalsh@users.sourceforge.net>
|
12
|
-
|
13
|
-
* 1.png, 10.png, 2.png, 3.png, 4.png, 5.png, 6.png, 7.png, 8.png, 9.png:
|
14
|
-
New file.
|
15
|
-
|
data/doc/images/copyright
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
This package was debianized by Mark Johnson <mrj@debian.org> on
|
2
|
-
Mon, 11 Oct 2004 18:37:39 -0400
|
3
|
-
|
4
|
-
It was downloaded from the Sourceforge mirror:
|
5
|
-
<http://umn.dl.sourceforge.net/sourceforge/docbook/>
|
6
|
-
|
7
|
-
Upstream Author: Norman Walsh <ndw@nwalsh.com> and other docbook developers at
|
8
|
-
the Sourceforge DocBook Open Repository
|
9
|
-
|
10
|
-
|
11
|
-
Copyright
|
12
|
-
---------
|
13
|
-
|
14
|
-
Copyright (C) 1999, 2000, 2001 Norman Walsh
|
15
|
-
|
16
|
-
Permission is hereby granted, free of charge, to any person
|
17
|
-
obtaining a copy of this software and associated documentation
|
18
|
-
files (the ``Software''), to deal in the Software without
|
19
|
-
restriction, including without limitation the rights to use,
|
20
|
-
copy, modify, merge, publish, distribute, sublicense, and/or
|
21
|
-
sell copies of the Software, and to permit persons to whom the
|
22
|
-
Software is furnished to do so, subject to the following
|
23
|
-
conditions:
|
24
|
-
|
25
|
-
The above copyright notice and this permission notice shall be
|
26
|
-
included in all copies or substantial portions of the Software.
|
27
|
-
|
28
|
-
Except as contained in this notice, the names of individuals
|
29
|
-
credited with contribution to this software shall not be used in
|
30
|
-
advertising or otherwise to promote the sale, use or other
|
31
|
-
dealings in this Software without prior written authorization
|
32
|
-
from the individuals in question.
|
33
|
-
|
34
|
-
Any stylesheet derived from this Software that is publically
|
35
|
-
distributed will be identified with a different name and the
|
36
|
-
version strings in any derived Software will be changed so that
|
37
|
-
no possibility of confusion between the derived package and this
|
38
|
-
Software will exist.
|
39
|
-
|
40
|
-
Warranty
|
41
|
-
--------
|
42
|
-
|
43
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
44
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
45
|
-
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
46
|
-
NONINFRINGEMENT. IN NO EVENT SHALL NORMAN WALSH OR ANY OTHER
|
47
|
-
CONTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
48
|
-
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
49
|
-
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
50
|
-
OTHER DEALINGS IN THE SOFTWARE.
|
51
|
-
|
52
|
-
Contacting the Author
|
53
|
-
---------------------
|
54
|
-
|
55
|
-
These stylesheets are maintained by Norman Walsh, <ndw@nwalsh.com>.
|
data/doc/images/draft.png
DELETED
Binary file
|
data/doc/images/toc-blank.png
DELETED
Binary file
|
data/doc/images/toc-minus.png
DELETED
Binary file
|
data/doc/images/toc-plus.png
DELETED
Binary file
|
data/doc/index.html
DELETED
@@ -1,4 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
-
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Ruby-VPI user manual</title><link rel="stylesheet" href="styles/manual.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.68.1" /><meta name="description" content="This manual explains how to use Ruby-VPI. A plain-text version of this manual is also available. Finally, you can find the newest version of this manual at the Ruby-VPI website." /><link rel="start" href="index.html" title="Ruby-VPI user manual" /><link rel="next" href="introduction.html" title="Chapter 1. Introduction" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center"><span class="application">Ruby-VPI</span> user manual</th></tr><tr><td width="20%" align="left"> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="introduction.html"><img src="images/next.png" alt="Next" /></a></td></tr></table><hr /></div><div class="book" lang="en" xml:lang="en"><div class="titlepage"><div><div><h1 class="title"><a id="id2472603"></a><span class="application">Ruby-VPI</span> user manual</h1></div><div><p class="copyright">Copyright © 2006 Suraj N. Kurapati</p></div><div><p class="copyright">Copyright © 2005, 2006 <a href="http://tango.freedesktop.org" target="_top">Tango Desktop Project</a> <em><span class="remark">for admonition and navigation graphics released under <a href="images/COPYING" target="_top">this license</a>.</span></em></p></div><div><p class="copyright">Copyright © 1999, 2000, 2001 Norman Walsh <em><span class="remark">for DocBook graphics released under <a href="images/copyright" target="_top">this license</a>.</span></em></p></div><div><div class="legalnotice"><a id="id2516394"></a><p>Permission is granted to copy, distribute and/or modify this document under the terms of the <span class="acronym">GNU</span> Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "<span class="acronym">GNU</span> Free Documentation License".</p></div></div><div><div class="abstract"><p class="title"><b>Abstract</b></p><p>This manual explains how to use <span class="application">Ruby-VPI</span>. A <a href="manual.txt" target="_top">plain-text version of this manual</a> is also available. Finally, you can find the newest version of this manual at the <a href="http://ruby-vpi.rubyforge.org" target="_top"><span class="application">Ruby-VPI</span> website</a>.</p></div></div></div><hr /></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="chapter"><a href="introduction.html">1. Introduction</a></span></dt><dd><dl><dt><span class="section"><a href="introduction.license.html">License</a></span></dt><dt><span class="section"><a href="introduction.manifest.html">Manifest</a></span></dt><dt><span class="section"><a href="introduction.resources.html">Resources</a></span></dt><dt><span class="section"><a href="introduction.related-works.html">Related works</a></span></dt><dd><dl><dt><span class="section"><a href="introduction.related-works.html#introduction.related-works.pli">Ye olde PLI</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="background.html">2. Background</a></span></dt><dd><dl><dt><span class="section"><a href="background.methodology.html">Methodology</a></span></dt><dt><span class="section"><a href="background.terminology.html">Terminology</a></span></dt><dt><span class="section"><a href="background.organization.html">Organization</a></span></dt><dd><dl><dt><span class="section"><a href="background.organization.html#organization.vpi">Interface to <span class="acronym">VPI</span></a></span></dt></dl></dd><dt><span class="section"><a href="background.running-tests.html">Running a test</a></span></dt><dd><dl><dt><span class="section"><a href="background.running-tests.html#background.running-tests.init">Initialization</a></span></dt><dt><span class="section"><a href="background.running-tests.html#background.running-tests.exec">Execution</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="setup.html">3. Setup</a></span></dt><dd><dl><dt><span class="section"><a href="setup.reqs.html">Requirements</a></span></dt><dd><dl><dt><span class="section"><a href="setup.reqs.html#setup.reqs.optional">Recommendations</a></span></dt></dl></dd><dt><span class="section"><a href="setup.installation.html">Installation</a></span></dt><dd><dl><dt><span class="section"><a href="setup.installation.html#setup.installation.windows">Installing on Windows</a></span></dt></dl></dd><dt><span class="section"><a href="setup.maintenance.html">Maintenance</a></span></dt></dl></dd><dt><span class="chapter"><a href="usage.html">4. Usage</a></span></dt><dd><dl><dt><span class="section"><a href="usage.tools.html">Tools</a></span></dt><dd><dl><dt><span class="section"><a href="usage.tools.html#usage.tools.generate-test">Automated test generation</a></span></dt><dt><span class="section"><a href="usage.tools.html#usage.tools.verilog-ruby-conv">Verilog to Ruby conversion</a></span></dt></dl></dd><dt><span class="section"><a href="usage.tutorial.html">Tutorial</a></span></dt><dd><dl><dt><span class="section"><a href="usage.tutorial.html#usage.tutorial.declare-design">Start with a design</a></span></dt><dt><span class="section"><a href="usage.tutorial.html#usage.tutorial.generate-test">Generate a test</a></span></dt><dt><span class="section"><a href="usage.tutorial.html#usage.tutorial.specification">Specify your expectations</a></span></dt><dt><span class="section"><a href="usage.tutorial.html#usage.tutorial.implement-proto">Implement the prototype</a></span></dt><dt><span class="section"><a href="usage.tutorial.html#usage.tutorial.test-proto">Verify the prototype</a></span></dt><dt><span class="section"><a href="usage.tutorial.html#usage.tutorial.implement-design">Implement the design</a></span></dt><dt><span class="section"><a href="usage.tutorial.html#usage.tutorial.test-design">Verify the design</a></span></dt></dl></dd><dt><span class="section"><a href="usage.examples.html">Examples</a></span></dt></dl></dd><dt><span class="chapter"><a href="hacking.html">5. Hacking</a></span></dt><dd><dl><dt><span class="section"><a href="hacking.release-packages.html">Building release packages</a></span></dt></dl></dd><dt><span class="chapter"><a href="problems.html">6. Known problems</a></span></dt><dd><dl><dt><span class="section"><a href="problems.ruby.html">Ruby</a></span></dt><dd><dl><dt><span class="section"><a href="problems.ruby.html#problems.ruby.SystemStackError">SystemStackError</a></span></dt><dt><span class="section"><a href="problems.ruby.html#problems.ruby.xUnit">test/unit</a></span></dt></dl></dd><dt><span class="section"><a href="problem.ivl.html">Icarus Verilog</a></span></dt><dd><dl><dt><span class="section"><a href="problem.ivl.html#problems.ivl.vpi_handle_by_name">vpi_handle_by_name</a></span></dt><dt><span class="section"><a href="problem.ivl.html#problems.ivl.vpi_reset">Vpi::reset</a></span></dt></dl></dd><dt><span class="section"><a href="problems.vsim.html">Mentor Modelsim</a></span></dt><dd><dl><dt><span class="section"><a href="problems.vsim.html#problems.vsim.ruby_run">ruby_run()</a></span></dt></dl></dd></dl></dd><dt><span class="glossary"><a href="glossary.html">Glossary</a></span></dt><dt><span class="appendix"><a href="gfdl.html">A. GNU Free Documentation License</a></span></dt><dd><dl><dt><span class="section"><a href="gfdl-0.html">PREAMBLE</a></span></dt><dt><span class="section"><a href="gfdl-1.html">APPLICABILITY AND DEFINITIONS</a></span></dt><dt><span class="section"><a href="gfdl-2.html">VERBATIM COPYING</a></span></dt><dt><span class="section"><a href="gfdl-3.html">COPYING IN QUANTITY</a></span></dt><dt><span class="section"><a href="gfdl-4.html">MODIFICATIONS</a></span></dt><dt><span class="section"><a href="gfdl-5.html">COMBINING DOCUMENTS</a></span></dt><dt><span class="section"><a href="gfdl-6.html">COLLECTIONS OF DOCUMENTS</a></span></dt><dt><span class="section"><a href="gfdl-7.html">AGGREGATION WITH INDEPENDENT WORKS</a></span></dt><dt><span class="section"><a href="gfdl-8.html">TRANSLATION</a></span></dt><dt><span class="section"><a href="gfdl-9.html">TERMINATION</a></span></dt><dt><span class="section"><a href="gfdl-10.html">FUTURE REVISIONS OF THIS LICENSE</a></span></dt><dt><span class="section"><a href="gfdl-addendum.html">ADDENDUM: How to use this License for
|
4
|
-
your documents</a></span></dt></dl></dd></dl></div><div class="list-of-figures"><p><b>List of Figures</b></p><dl><dt>2.1. <a href="background.organization.html#fig..organization">Overall organization of a test</a></dt><dt>2.2. <a href="background.organization.html#fig..organization.detail">Detailed organization of a test</a></dt><dt>2.3. <a href="background.running-tests.html#fig..ruby_init">Initialization of a test</a></dt><dt>2.4. <a href="background.running-tests.html#fig..ruby_relay">Execution of a test</a></dt><dt>4.1. <a href="usage.tutorial.html#fig..counter.v_decl">Declaration of a simple up-counter with synchronous reset</a></dt><dt>4.2. <a href="usage.tutorial.html#fig..generate-test.rspec">Generating a test with specification in rSpec format</a></dt><dt>4.3. <a href="usage.tutorial.html#fig..generate-test.unit-test">Generating a test with specification in xUnit format</a></dt><dt>4.4. <a href="usage.tutorial.html#fig..counter_rspec_spec.rb">Specification implemented in rSpec format</a></dt><dt>4.5. <a href="usage.tutorial.html#fig..counter_xunit_spec.rb">Specification implemented in xUnit format</a></dt><dt>4.6. <a href="usage.tutorial.html#fig..counter_proto.rb">Ruby prototype of our Verilog design</a></dt><dt>4.7. <a href="usage.tutorial.html#fig..test-proto.rspec">Running a test with specification in rSpec format</a></dt><dt>4.8. <a href="usage.tutorial.html#fig..test-proto.unit-test">Running a test with specification in xUnit format</a></dt><dt>4.9. <a href="usage.tutorial.html#fig..counter.v_impl">Implementation of a simple up-counter with synchronous reset</a></dt><dt>4.10. <a href="usage.tutorial.html#fig..test-design.rspec">Running a test with specification in rSpec format</a></dt><dt>4.11. <a href="usage.tutorial.html#fig..test-design.unit-test">Running a test with specification in xUnit format</a></dt></dl></div><div class="list-of-tables"><p><b>List of Tables</b></p><dl><dt>2.1. <a href="background.organization.html#table..handle-property-accessor-naming-format">Naming format for accessing a handle's <span class="acronym">VPI</span> properties</a></dt><dt>2.2. <a href="background.organization.html#id2488103">Possible accessors and their implications</a></dt></dl></div><div class="list-of-examples"><p><b>List of Examples</b></p><dl><dt>2.1. <a href="background.organization.html#ex..handle-property-accessor-naming-format">Accessing a handle's <span class="acronym">VPI</span> properties</a></dt><dt>6.1. <a href="problem.ivl.html#ex..TestFoo">Part of a bench which instantiates a Verilog design</a></dt><dt>6.2. <a href="problem.ivl.html#ex..TestFoo_bad">Bad design with unconnected registers</a></dt><dt>6.3. <a href="problem.ivl.html#ex..TestFoo_fix">Fixed design with wired registers</a></dt></dl></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="introduction.html"><img src="images/next.png" alt="Next" /></a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"> </td><td width="40%" align="right" valign="top"> Chapter 1. Introduction</td></tr></table></div></body></html>
|
data/doc/introduction.html
DELETED
@@ -1,3 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
-
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Chapter 1. Introduction</title><link rel="stylesheet" href="styles/manual.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.68.1" /><link rel="start" href="index.html" title="Ruby-VPI user manual" /><link rel="up" href="index.html" title="Ruby-VPI user manual" /><link rel="prev" href="index.html" title="Ruby-VPI user manual" /><link rel="next" href="introduction.license.html" title="License" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 1. Introduction</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="index.html"><img src="images/prev.png" alt="Prev" /></a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="introduction.license.html"><img src="images/next.png" alt="Next" /></a></td></tr></table><hr /></div><div class="chapter" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="introduction"></a>Chapter 1. Introduction</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="introduction.license.html">License</a></span></dt><dt><span class="section"><a href="introduction.manifest.html">Manifest</a></span></dt><dt><span class="section"><a href="introduction.resources.html">Resources</a></span></dt><dt><span class="section"><a href="introduction.related-works.html">Related works</a></span></dt><dd><dl><dt><span class="section"><a href="introduction.related-works.html#introduction.related-works.pli">Ye olde PLI</a></span></dt></dl></dd></dl></div><p><span class="application">Ruby-VPI</span> is a <a href="http://www.ruby-lang.org/en/20020101.html" target="_top">Ruby</a> interface to <a href="http://en.wikipedia.org/wiki/Verilog" target="_top"><span class="acronym">VPI</span></a>. It lets you create complex Verilog test benches easily and wholly in Ruby.</p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="index.html"><img src="images/prev.png" alt="Prev" /></a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="introduction.license.html"><img src="images/next.png" alt="Next" /></a></td></tr><tr><td width="40%" align="left" valign="top"><span class="application">Ruby-VPI</span> user manual </td><td width="20%" align="center"><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home" /></a></td><td width="40%" align="right" valign="top"> License</td></tr></table></div></body></html>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
-
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>License</title><link rel="stylesheet" href="styles/manual.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.68.1" /><link rel="start" href="index.html" title="Ruby-VPI user manual" /><link rel="up" href="introduction.html" title="Chapter 1. Introduction" /><link rel="prev" href="introduction.html" title="Chapter 1. Introduction" /><link rel="next" href="introduction.manifest.html" title="Manifest" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">License</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="introduction.html"><img src="images/prev.png" alt="Prev" /></a> </td><th width="60%" align="center">Chapter 1. Introduction</th><td width="20%" align="right"> <a accesskey="n" href="introduction.manifest.html"><img src="images/next.png" alt="Next" /></a></td></tr></table><hr /></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="introduction.license"></a>License</h2></div></div></div><p><span class="application">Ruby-VPI</span> is <a href="http://en.wikipedia.org/wiki/Free_software" target="_top">free software</a>; you can redistribute it and/or modify it under the terms of the <a href="http://www.gnu.org/copyleft/gpl.html" target="_top"><span class="acronym">GNU</span> General Public License</a> as published by the <a href="http://www.fsf.org" target="_top">Free Software Foundation</a>; either version 2 of the License, or (at your option) any later version.</p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="introduction.html"><img src="images/prev.png" alt="Prev" /></a> </td><td width="20%" align="center"><a accesskey="u" href="introduction.html"><img src="images/up.png" alt="Up" /></a></td><td width="40%" align="right"> <a accesskey="n" href="introduction.manifest.html"><img src="images/next.png" alt="Next" /></a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 1. Introduction </td><td width="20%" align="center"><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home" /></a></td><td width="40%" align="right" valign="top"> Manifest</td></tr></table></div></body></html>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
-
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Manifest</title><link rel="stylesheet" href="styles/manual.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.68.1" /><link rel="start" href="index.html" title="Ruby-VPI user manual" /><link rel="up" href="introduction.html" title="Chapter 1. Introduction" /><link rel="prev" href="introduction.license.html" title="License" /><link rel="next" href="introduction.resources.html" title="Resources" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Manifest</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="introduction.license.html"><img src="images/prev.png" alt="Prev" /></a> </td><th width="60%" align="center">Chapter 1. Introduction</th><td width="20%" align="right"> <a accesskey="n" href="introduction.resources.html"><img src="images/next.png" alt="Next" /></a></td></tr></table><hr /></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="introduction.manifest"></a>Manifest</h2></div></div></div><p>When you extract a <span class="application">Ruby-VPI</span> release package, the following is what you would expect to find.</p><div class="variablelist"><dl><dt><span class="term"><code class="filename">doc</code></span></dt><dd><p>This directory contains user documentation in various formats.</p></dd><dt><span class="term"><code class="filename">ref</code></span></dt><dd><p>This directory contains reference <span class="acronym">API</span> documentation in <span class="acronym">HTML</span> format.</p></dd><dt><span class="term"><code class="filename">ext</code></span></dt><dd><p>This directory contains source code, written in the C language, for the <a href="background.organization.html" title="Organization">core of <span class="application">Ruby-VPI</span></a>.</p></dd><dt><span class="term"><code class="filename">lib</code></span></dt><dd><p>This directory contains Ruby libraries provided by <span class="application">Ruby-VPI</span>.</p></dd><dt><span class="term"><code class="filename">bin</code></span></dt><dd><p>This directory contains various tools. See <a href="usage.tools.html" title="Tools">the section called “Tools”</a> for more information.</p></dd><dt><span class="term"><code class="filename">samp</code></span></dt><dd><p>This directory contains example tests. See <a href="usage.examples.html" title="Examples">the section called “Examples”</a> for more information.</p></dd></dl></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="introduction.license.html"><img src="images/prev.png" alt="Prev" /></a> </td><td width="20%" align="center"><a accesskey="u" href="introduction.html"><img src="images/up.png" alt="Up" /></a></td><td width="40%" align="right"> <a accesskey="n" href="introduction.resources.html"><img src="images/next.png" alt="Next" /></a></td></tr><tr><td width="40%" align="left" valign="top">License </td><td width="20%" align="center"><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home" /></a></td><td width="40%" align="right" valign="top"> Resources</td></tr></table></div></body></html>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
-
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Related works</title><link rel="stylesheet" href="styles/manual.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.68.1" /><link rel="start" href="index.html" title="Ruby-VPI user manual" /><link rel="up" href="introduction.html" title="Chapter 1. Introduction" /><link rel="prev" href="introduction.resources.html" title="Resources" /><link rel="next" href="background.html" title="Chapter 2. Background" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Related works</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="introduction.resources.html"><img src="images/prev.png" alt="Prev" /></a> </td><th width="60%" align="center">Chapter 1. Introduction</th><td width="20%" align="right"> <a accesskey="n" href="background.html"><img src="images/next.png" alt="Next" /></a></td></tr></table><hr /></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="introduction.related-works"></a>Related works</h2></div></div></div><p>You may wish to consider the following projects, which are similar to <span class="application">Ruby-VPI</span>.</p><div class="variablelist"><dl><dt><span class="term"><a href="http://rhdl.rubyforge.org" target="_top">RHDL</a></span></dt><dd><p>Hardware description and verification language based on Ruby.</p></dd><dt><span class="term"><a href="http://myhdl.jandecaluwe.com" target="_top">MyHDL</a></span></dt><dd><p>Hardware description and verification language based on Python, which features conversion to Verilog and co-simulation.</p></dd><dt><span class="term"><a href="http://jove.sourceforge.net" target="_top">JOVE</a></span></dt><dd><p>Java interface to <span class="acronym">VPI</span>.</p></dd><dt><span class="term"><a href="http://embedded.eecs.berkeley.edu/Alumni/pinhong/scriptEDA/" target="_top">ScriptEDA</a></span></dt><dd><p>Perl, Python, and Tcl interface to <span class="acronym">VPI</span>.</p></dd></dl></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="introduction.related-works.pli"></a>Ye olde PLI</h3></div></div></div><p>The following projects utilize the archaic <span class="acronym">tf</span> and <span class="abbrev">acc</span> PLI interfaces, which have been officially deprecated in IEEE Std 1364-2005.</p><div class="variablelist"><dl><dt><span class="term"><a href="http://www.nelsim.com" target="_top">ScriptSim</a></span></dt><dd><p>Perl, Python, and Tcl/Tk interface to PLI.</p></dd><dt><span class="term"><a href="http://www.veripool.com/verilog-pli.html" target="_top">Verilog::Pli</a></span></dt><dd><p>Perl interface to PLI.</p></dd><dt><span class="term"><a href="http://www.time-rover.com/jpli/" target="_top">JPLI</a></span></dt><dd><p>Java interface to PLI.</p></dd></dl></div></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="introduction.resources.html"><img src="images/prev.png" alt="Prev" /></a> </td><td width="20%" align="center"><a accesskey="u" href="introduction.html"><img src="images/up.png" alt="Up" /></a></td><td width="40%" align="right"> <a accesskey="n" href="background.html"><img src="images/next.png" alt="Next" /></a></td></tr><tr><td width="40%" align="left" valign="top">Resources </td><td width="20%" align="center"><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home" /></a></td><td width="40%" align="right" valign="top"> Chapter 2. Background</td></tr></table></div></body></html>
|
@@ -1,3 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
-
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Resources</title><link rel="stylesheet" href="styles/manual.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.68.1" /><link rel="start" href="index.html" title="Ruby-VPI user manual" /><link rel="up" href="introduction.html" title="Chapter 1. Introduction" /><link rel="prev" href="introduction.manifest.html" title="Manifest" /><link rel="next" href="introduction.related-works.html" title="Related works" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Resources</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="introduction.manifest.html"><img src="images/prev.png" alt="Prev" /></a> </td><th width="60%" align="center">Chapter 1. Introduction</th><td width="20%" align="right"> <a accesskey="n" href="introduction.related-works.html"><img src="images/next.png" alt="Next" /></a></td></tr></table><hr /></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="introduction.resources"></a>Resources</h2></div></div></div><div class="variablelist"><dl><dt><span class="term"><a href="http://rubyforge.org/projects/ruby-vpi" target="_top">Project</a></span></dt><dd><p>Access project facilities, hosted generously by <a href="http://rubyforge.org" target="_top">RubyForge</a>.</p></dd><dt><span class="term"><a href="http://rubyforge.org/tracker/?group_id=1339" target="_top">Tracker</a></span></dt><dd><p>Report problems, contribute patches, and more.</p></dd><dt><span class="term"><a href="http://rubyforge.org/frs/?group_id=1339" target="_top">Releases</a></span></dt><dd><p>Download the newest release of <span class="application">Ruby-VPI</span>.</p></dd><dt><span class="term"><a href="http://ruby-vpi.rubyforge.org/src/ruby-vpi" target="_top">Sources</a></span></dt><dd><p>Browse or access the source code repository.</p></dd><dt><span class="term"><a href="http://rubyforge.org/forum/?group_id=1339" target="_top">Forums</a></span></dt><dd><p>Ask for help, give feedback, or discuss.</p></dd></dl></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="introduction.manifest.html"><img src="images/prev.png" alt="Prev" /></a> </td><td width="20%" align="center"><a accesskey="u" href="introduction.html"><img src="images/up.png" alt="Up" /></a></td><td width="40%" align="right"> <a accesskey="n" href="introduction.related-works.html"><img src="images/next.png" alt="Next" /></a></td></tr><tr><td width="40%" align="left" valign="top">Manifest </td><td width="20%" align="center"><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home" /></a></td><td width="40%" align="right" valign="top"> Related works</td></tr></table></div></body></html>
|
data/doc/manual.txt
DELETED
@@ -1,1852 +0,0 @@
|
|
1
|
-
Ruby-VPI user manual
|
2
|
-
|
3
|
-
Copyright 2006 Suraj N. Kurapati
|
4
|
-
|
5
|
-
Copyright 2005, 2006 Tango Desktop Project for admonition and navigation
|
6
|
-
graphics released under this license.
|
7
|
-
|
8
|
-
Copyright 1999, 2000, 2001 Norman Walsh for DocBook graphics released under
|
9
|
-
this license.
|
10
|
-
|
11
|
-
Permission is granted to copy, distribute and/or modify this document under the
|
12
|
-
terms of the GNU Free Documentation License, Version 1.2 or any later version
|
13
|
-
published by the Free Software Foundation; with no Invariant Sections, no
|
14
|
-
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included
|
15
|
-
in the section entitled "GNU Free Documentation License".
|
16
|
-
|
17
|
-
Abstract
|
18
|
-
|
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.
|
22
|
-
|
23
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
24
|
-
|
25
|
-
Table of Contents
|
26
|
-
|
27
|
-
1. Introduction
|
28
|
-
|
29
|
-
License
|
30
|
-
Manifest
|
31
|
-
Resources
|
32
|
-
Related works
|
33
|
-
|
34
|
-
Ye olde PLI
|
35
|
-
|
36
|
-
2. Background
|
37
|
-
|
38
|
-
Methodology
|
39
|
-
Terminology
|
40
|
-
Organization
|
41
|
-
|
42
|
-
Interface to VPI
|
43
|
-
|
44
|
-
Running a test
|
45
|
-
|
46
|
-
Initialization
|
47
|
-
Execution
|
48
|
-
|
49
|
-
3. Setup
|
50
|
-
|
51
|
-
Requirements
|
52
|
-
|
53
|
-
Recommendations
|
54
|
-
|
55
|
-
Installation
|
56
|
-
|
57
|
-
Installing on Windows
|
58
|
-
|
59
|
-
Maintenance
|
60
|
-
|
61
|
-
4. Usage
|
62
|
-
|
63
|
-
Tools
|
64
|
-
|
65
|
-
Automated test generation
|
66
|
-
Verilog to Ruby conversion
|
67
|
-
|
68
|
-
Tutorial
|
69
|
-
|
70
|
-
Start with a design
|
71
|
-
Generate a test
|
72
|
-
Specify your expectations
|
73
|
-
Implement the prototype
|
74
|
-
Verify the prototype
|
75
|
-
Implement the design
|
76
|
-
Verify the design
|
77
|
-
|
78
|
-
Examples
|
79
|
-
|
80
|
-
5. Hacking
|
81
|
-
|
82
|
-
Building release packages
|
83
|
-
|
84
|
-
6. Known problems
|
85
|
-
|
86
|
-
Ruby
|
87
|
-
|
88
|
-
SystemStackError
|
89
|
-
test/unit
|
90
|
-
|
91
|
-
Icarus Verilog
|
92
|
-
|
93
|
-
vpi_handle_by_name
|
94
|
-
Vpi::reset
|
95
|
-
|
96
|
-
Mentor Modelsim
|
97
|
-
|
98
|
-
ruby_run()
|
99
|
-
|
100
|
-
Glossary
|
101
|
-
A. GNU Free Documentation License
|
102
|
-
|
103
|
-
PREAMBLE
|
104
|
-
APPLICABILITY AND DEFINITIONS
|
105
|
-
VERBATIM COPYING
|
106
|
-
COPYING IN QUANTITY
|
107
|
-
MODIFICATIONS
|
108
|
-
COMBINING DOCUMENTS
|
109
|
-
COLLECTIONS OF DOCUMENTS
|
110
|
-
AGGREGATION WITH INDEPENDENT WORKS
|
111
|
-
TRANSLATION
|
112
|
-
TERMINATION
|
113
|
-
FUTURE REVISIONS OF THIS LICENSE
|
114
|
-
ADDENDUM: How to use this License for your documents
|
115
|
-
|
116
|
-
List of Figures
|
117
|
-
|
118
|
-
2.1. Overall organization of a test
|
119
|
-
2.2. Detailed organization of a test
|
120
|
-
2.3. Initialization of a test
|
121
|
-
2.4. Execution of a test
|
122
|
-
4.1. Declaration of a simple up-counter with synchronous reset
|
123
|
-
4.2. Generating a test with specification in rSpec format
|
124
|
-
4.3. Generating a test with specification in xUnit format
|
125
|
-
4.4. Specification implemented in rSpec format
|
126
|
-
4.5. Specification implemented in xUnit format
|
127
|
-
4.6. Ruby prototype of our Verilog design
|
128
|
-
4.7. Running a test with specification in rSpec format
|
129
|
-
4.8. Running a test with specification in xUnit format
|
130
|
-
4.9. Implementation of a simple up-counter with synchronous reset
|
131
|
-
4.10. Running a test with specification in rSpec format
|
132
|
-
4.11. Running a test with specification in xUnit format
|
133
|
-
|
134
|
-
List of Tables
|
135
|
-
|
136
|
-
2.1. Naming format for accessing a handle's VPI properties
|
137
|
-
2.2. Possible accessors and their implications
|
138
|
-
|
139
|
-
List of Examples
|
140
|
-
|
141
|
-
2.1. Accessing a handle's VPI properties
|
142
|
-
6.1. Part of a bench which instantiates a Verilog design
|
143
|
-
6.2. Bad design with unconnected registers
|
144
|
-
6.3. Fixed design with wired registers
|
145
|
-
|
146
|
-
Chapter 1. Introduction
|
147
|
-
|
148
|
-
Table of Contents
|
149
|
-
|
150
|
-
License
|
151
|
-
Manifest
|
152
|
-
Resources
|
153
|
-
Related works
|
154
|
-
|
155
|
-
Ye olde PLI
|
156
|
-
|
157
|
-
Ruby-VPI is a Ruby interface to VPI. It lets you create complex Verilog test
|
158
|
-
benches easily and wholly in Ruby.
|
159
|
-
|
160
|
-
License
|
161
|
-
|
162
|
-
Ruby-VPI is free software; you can redistribute it and/or modify it under the
|
163
|
-
terms of the GNU General Public License as published by the Free Software
|
164
|
-
Foundation; either version 2 of the License, or (at your option) any later
|
165
|
-
version.
|
166
|
-
|
167
|
-
Manifest
|
168
|
-
|
169
|
-
When you extract a Ruby-VPI release package, the following is what you would
|
170
|
-
expect to find.
|
171
|
-
|
172
|
-
doc
|
173
|
-
|
174
|
-
This directory contains user documentation in various formats.
|
175
|
-
|
176
|
-
ref
|
177
|
-
|
178
|
-
This directory contains reference API documentation in HTML format.
|
179
|
-
|
180
|
-
ext
|
181
|
-
|
182
|
-
This directory contains source code, written in the C language, for the
|
183
|
-
core of Ruby-VPI.
|
184
|
-
|
185
|
-
lib
|
186
|
-
|
187
|
-
This directory contains Ruby libraries provided by Ruby-VPI.
|
188
|
-
|
189
|
-
bin
|
190
|
-
|
191
|
-
This directory contains various tools. See the section called “Tools” for
|
192
|
-
more information.
|
193
|
-
|
194
|
-
samp
|
195
|
-
|
196
|
-
This directory contains example tests. See the section called “Examples”
|
197
|
-
for more information.
|
198
|
-
|
199
|
-
Resources
|
200
|
-
|
201
|
-
Project
|
202
|
-
|
203
|
-
Access project facilities, hosted generously by RubyForge.
|
204
|
-
|
205
|
-
Tracker
|
206
|
-
|
207
|
-
Report problems, contribute patches, and more.
|
208
|
-
|
209
|
-
Releases
|
210
|
-
|
211
|
-
Download the newest release of Ruby-VPI.
|
212
|
-
|
213
|
-
Sources
|
214
|
-
|
215
|
-
Browse or access the source code repository.
|
216
|
-
|
217
|
-
Forums
|
218
|
-
|
219
|
-
Ask for help, give feedback, or discuss.
|
220
|
-
|
221
|
-
Related works
|
222
|
-
|
223
|
-
You may wish to consider the following projects, which are similar to Ruby-VPI.
|
224
|
-
|
225
|
-
RHDL
|
226
|
-
|
227
|
-
Hardware description and verification language based on Ruby.
|
228
|
-
|
229
|
-
MyHDL
|
230
|
-
|
231
|
-
Hardware description and verification language based on Python, which
|
232
|
-
features conversion to Verilog and co-simulation.
|
233
|
-
|
234
|
-
JOVE
|
235
|
-
|
236
|
-
Java interface to VPI.
|
237
|
-
|
238
|
-
ScriptEDA
|
239
|
-
|
240
|
-
Perl, Python, and Tcl interface to VPI.
|
241
|
-
|
242
|
-
Ye olde PLI
|
243
|
-
|
244
|
-
The following projects utilize the archaic tf and acc PLI interfaces, which
|
245
|
-
have been officially deprecated in IEEE Std 1364-2005.
|
246
|
-
|
247
|
-
ScriptSim
|
248
|
-
|
249
|
-
Perl, Python, and Tcl/Tk interface to PLI.
|
250
|
-
|
251
|
-
Verilog::Pli
|
252
|
-
|
253
|
-
Perl interface to PLI.
|
254
|
-
|
255
|
-
JPLI
|
256
|
-
|
257
|
-
Java interface to PLI.
|
258
|
-
|
259
|
-
Chapter 2. Background
|
260
|
-
|
261
|
-
Table of Contents
|
262
|
-
|
263
|
-
Methodology
|
264
|
-
Terminology
|
265
|
-
Organization
|
266
|
-
|
267
|
-
Interface to VPI
|
268
|
-
|
269
|
-
Running a test
|
270
|
-
|
271
|
-
Initialization
|
272
|
-
Execution
|
273
|
-
|
274
|
-
Ruby-VPI is a Bench which lets you Test Verilog modules using the Ruby
|
275
|
-
language.
|
276
|
-
|
277
|
-
Methodology
|
278
|
-
|
279
|
-
Ruby-VPI presents an open-ended interface to VPI. Thus, you can use any
|
280
|
-
methodology you wish when writing tests. However, BDD is emphasized in this
|
281
|
-
project because it greatly simplifies thinking about how to verify a design.
|
282
|
-
|
283
|
-
Terminology
|
284
|
-
|
285
|
-
[Tip] Tip
|
286
|
-
Have a look at the Glossary for definitions of terms used in this manual.
|
287
|
-
|
288
|
-
As a newcomer into the world of Verilog, I often heard the term test bench: “I
|
289
|
-
ran the test bench, but it didn't work!” or “Are you crazy?!! You still haven't
|
290
|
-
written the test bench? o_O”, for example. I flipped through my textbook and
|
291
|
-
surfed the Internet for a definition of the term, but it was to no avail.
|
292
|
-
Instead, both resources nonchalantly employed the term throughout their being,
|
293
|
-
as if mocking my ignorance of what seems to be universal knowledge.
|
294
|
-
|
295
|
-
Defeated, I turned to my inner faculties to determine the answer. “Let's see,
|
296
|
-
the term test bench has the word test—so it has something to do with
|
297
|
-
testing—and it has the word bench—so maybe it's referring to a table where the
|
298
|
-
testing should occur”. This reasoning grew increasingly familiar as my mind
|
299
|
-
rummaged through towering stores of obsolescence and ultimately revealed
|
300
|
-
dreaded memories of sleepless anguish: debugging electronics in the robotics
|
301
|
-
laboratory.
|
302
|
-
|
303
|
-
“Aha!”, I exclaimed hesitantly, trying to dismiss the past. The term has its
|
304
|
-
roots in the testing of electronic devices, where an engineer would sit at a
|
305
|
-
bench in an electronics laboratory and verify that an electronic component
|
306
|
-
satisfies some criteria. The bench would be furnished with tools of measurement
|
307
|
-
and manipulation—such as oscilloscopes, voltmeters, soldering irons, and so
|
308
|
-
on—which help the engineer to verify the electronic component or locate the
|
309
|
-
sources of defects in the component.
|
310
|
-
|
311
|
-
Alright, now I remember what a laboratory bench is, but how does that compare
|
312
|
-
with the term test bench? Surely they cannot have the same meaning, because it
|
313
|
-
doesn't make sense to run a laboratory bench or to write one. Thus, to avoid
|
314
|
-
propagating such confusion into this manual, I have attempted to clarify the
|
315
|
-
terminology by simplifying and reintroducing it in a new light.
|
316
|
-
|
317
|
-
Organization
|
318
|
-
|
319
|
-
Figure 2.1. Overall organization of a test
|
320
|
-
|
321
|
-
Overall organization of a test
|
322
|
-
|
323
|
-
As Figure 2.1, “Overall organization of a test” shows, a test is composed of a
|
324
|
-
bench, a design, and a specification. To extend the analogy of an electronics
|
325
|
-
laboratory, the first acts as the laboratory bench which provides measurement
|
326
|
-
and manipulation tools. The second acts as the electronic component being
|
327
|
-
verified by the engineer. And the third acts as the engineer who measures,
|
328
|
-
manipulates, and verifies the electronic component.
|
329
|
-
|
330
|
-
Interface to VPI
|
331
|
-
|
332
|
-
Figure 2.2. Detailed organization of a test
|
333
|
-
|
334
|
-
Detailed organization of a test
|
335
|
-
|
336
|
-
In Figure 2.2, “Detailed organization of a test”, Ruby-VPI acts as the bench, a
|
337
|
-
Verilog simulator encapsulates the design, and a Ruby interpreter encapsulates
|
338
|
-
the specification. Notice that Ruby-VPI encapsulates all communication between
|
339
|
-
the Ruby interpreter and VPI. This allows the specification, or any Ruby
|
340
|
-
program in general, to access VPI using nothing more than the Ruby language!
|
341
|
-
Thus, Ruby-VPI removes the burden of having to write C programs in order to
|
342
|
-
access VPI.
|
343
|
-
|
344
|
-
Furthermore, Ruby-VPI presents the entire IEEE Std 1364-2005 VPI interface to
|
345
|
-
the Ruby interpreter, but with the following minor changes.
|
346
|
-
|
347
|
-
● The first letter in the name of every function, type, structure, and
|
348
|
-
constant becomes capitalized.
|
349
|
-
|
350
|
-
For example, the s_vpi_value structure in C becomes the S_vpi_value class
|
351
|
-
in Ruby. Likewise, the vpiIntVal constant in C becomes the VpiIntVal
|
352
|
-
constant in Ruby.
|
353
|
-
|
354
|
-
● The VPI functions vpi_vprintf and vpi_mcd_vprintf are not made accessible
|
355
|
-
to Ruby. However, this isn't a big problem because you can use Ruby's
|
356
|
-
printf method instead.
|
357
|
-
|
358
|
-
The reason for this limitation is that some C compilers have trouble with
|
359
|
-
pointers to the va_list type. For these compilers, the second line in the
|
360
|
-
code shown below causes a “type mismatch” error.
|
361
|
-
|
362
|
-
void foo(va_list ap) {
|
363
|
-
va_list *p = ≈
|
364
|
-
}
|
365
|
-
|
366
|
-
|
367
|
-
VPI utility layer
|
368
|
-
|
369
|
-
From a user's perspective, the VPI utility layer greatly enhances the ability
|
370
|
-
to interact with handles. One simply invokes a handle's methods, which are
|
371
|
-
carefully named in the following manner, to access either (1) its children or
|
372
|
-
(2) its VPI properties.
|
373
|
-
|
374
|
-
The children of a handle are simply the handles that are immediately contained
|
375
|
-
within it in. For example, suppose that you had a Verilog module that contains
|
376
|
-
some registers. The children, of a handle to the module, would be handles to
|
377
|
-
the registers.
|
378
|
-
|
379
|
-
In the event that a child handle has the same name as a VPI property, the child
|
380
|
-
is given priority. However, you can always access VPI properties explicitly via
|
381
|
-
the get_value and put_value methods.
|
382
|
-
|
383
|
-
Table 2.1. Naming format for accessing a handle's VPI properties
|
384
|
-
|
385
|
-
┌─────────┬─┬────────┬─┬────────┬────────┐
|
386
|
-
│Operation│_│Property│_│Accessor│Addendum│
|
387
|
-
├─────────┴─┼────────┼─┴────────┼────────┤
|
388
|
-
│optional │required│optional │optional│
|
389
|
-
└───────────┴────────┴──────────┴────────┘
|
390
|
-
|
391
|
-
Operation
|
392
|
-
|
393
|
-
This parameter suggests a method that should be invoked in the context of
|
394
|
-
the Property parameter.
|
395
|
-
|
396
|
-
Property
|
397
|
-
|
398
|
-
This parameter suggests which VPI property should be accessed. The first
|
399
|
-
letter of this parameter's value should be lower case, and the vpi
|
400
|
-
prefix—common to all VPI properties—can be omitted.
|
401
|
-
|
402
|
-
For example, the VPI property vpiFullName is considered equivalent to
|
403
|
-
fullName but not equivalent to either FullName or full_name.
|
404
|
-
|
405
|
-
Accessor
|
406
|
-
|
407
|
-
This parameter suggests which VPI function should be used to access the VPI
|
408
|
-
property. When this parameter is not specified, the VPI utility layer will
|
409
|
-
attempt to guess the value of this parameter (see the source code of the
|
410
|
-
Property.resolve method for details).
|
411
|
-
|
412
|
-
Table 2.2. Possible accessors and their implications
|
413
|
-
|
414
|
-
┌────────┬──────────────────────┬──────────────────────────────────────┐
|
415
|
-
│Accessor│Kind of value accessed│VPI functions used to access the value│
|
416
|
-
├────────┼──────────────────────┼──────────────────────────────────────┤
|
417
|
-
│d │delay │vpi_get_delays, vpi_put_delays │
|
418
|
-
├────────┼──────────────────────┼──────────────────────────────────────┤
|
419
|
-
│l │logic │vpi_get_value, vpi_put_value │
|
420
|
-
├────────┼──────────────────────┼──────────────────────────────────────┤
|
421
|
-
│i │integer │vpi_get │
|
422
|
-
├────────┼──────────────────────┼──────────────────────────────────────┤
|
423
|
-
│b │boolean │vpi_get │
|
424
|
-
├────────┼──────────────────────┼──────────────────────────────────────┤
|
425
|
-
│s │string │vpi_get_str │
|
426
|
-
├────────┼──────────────────────┼──────────────────────────────────────┤
|
427
|
-
│h │handle │vpi_handle │
|
428
|
-
└────────┴──────────────────────┴──────────────────────────────────────┘
|
429
|
-
Addendum
|
430
|
-
|
431
|
-
When this parameter is a question mark (?), it suggests that the specified
|
432
|
-
VPI property should be queried as a boolean value. This produces the same
|
433
|
-
effect as specifying b for the Accessor parameter.
|
434
|
-
|
435
|
-
When this parameter is an equal sign (=), it suggests that the specified
|
436
|
-
VPI property should be written to.
|
437
|
-
|
438
|
-
Example 2.1. Accessing a handle's VPI properties
|
439
|
-
|
440
|
-
┌─────────────────────┬────────────────────────────────────────────┬────────────┐
|
441
|
-
│ │ Naming format │ │
|
442
|
-
│ Ruby expression ├─────────┬─┬────────────┬─┬────────┬────────┤Description │
|
443
|
-
│ │Operation│_│ Property │_│Accessor│Addendum│ │
|
444
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┼────────────┤
|
445
|
-
│ │ │ │ │ │ │ │These │
|
446
|
-
│handle.each_vpiNet {|│ │ │ │ │ │ │expressions │
|
447
|
-
│net| puts │each │_│vpiNet │ │ │ │print the │
|
448
|
-
│net.fullName} │ │ │ │ │ │ │full name of│
|
449
|
-
│ │ │ │ │ │ │ │each vpiNet │
|
450
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤object │
|
451
|
-
│ │ │ │ │ │ │ │associated │
|
452
|
-
│handle.each_net {|net│each │_│net │ │ │ │with the │
|
453
|
-
│| puts net.fullName} │ │ │ │ │ │ │handle. │
|
454
|
-
│ │ │ │ │ │ │ │ │
|
455
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┼────────────┤
|
456
|
-
│ │ │ │ │ │ │ │These │
|
457
|
-
│handle.all_reg? {|reg│ │ │ │ │ │ │expressions │
|
458
|
-
│| reg.size == 1} │all? │_│vpiReg │ │ │ │check if all│
|
459
|
-
│ │ │ │ │ │ │ │registers │
|
460
|
-
│ │ │ │ │ │ │ │associated │
|
461
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤with the │
|
462
|
-
│ │ │ │ │ │ │ │handle are │
|
463
|
-
│handle.all_reg? {|reg│ │ │ │ │ │ │capable of │
|
464
|
-
│| reg.size == 1} │all? │_│reg │ │ │ │storing only│
|
465
|
-
│ │ │ │ │ │ │ │one bit. │
|
466
|
-
│ │ │ │ │ │ │ │ │
|
467
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┼────────────┤
|
468
|
-
│handle.select_vpiNet │select │_│vpiReg │ │ │ │ │
|
469
|
-
│{|net| net.x?} │ │ │ │ │ │ │ │
|
470
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤ │
|
471
|
-
│handle.select_net {| │select │_│net │ │ │ │These │
|
472
|
-
│net| net.x?} │ │ │ │ │ │ │expressions │
|
473
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤return a │
|
474
|
-
│handle.select(VpiNet)│select │_│ │ │ │ │list of nets│
|
475
|
-
│{|net| net.x?} │ │ │ │ │ │ │whose logic │
|
476
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤value is │
|
477
|
-
│handle.select │ │ │ │ │ │ │“don't │
|
478
|
-
│(:VpiNet) {|net| │select │_│ │ │ │ │care”. │
|
479
|
-
│net.x?} │ │ │ │ │ │ │ │
|
480
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤ │
|
481
|
-
│handle.select(:net) │select │_│ │ │ │ │ │
|
482
|
-
│{|net| net.x?} │ │ │ │ │ │ │ │
|
483
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┼────────────┤
|
484
|
-
│handle.vpiIntVal │ │ │vpiIntVal │ │ │ │ │
|
485
|
-
│ │ │ │ │ │ │ │These │
|
486
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤expressions │
|
487
|
-
│handle.vpiIntVal_l │ │ │vpiIntVal │_│l │ │access the │
|
488
|
-
│ │ │ │ │ │ │ │logic value │
|
489
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤of the │
|
490
|
-
│handle.intVal │ │ │intVal │ │ │ │handle's │
|
491
|
-
│ │ │ │ │ │ │ │vpiIntVal │
|
492
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤property. │
|
493
|
-
│handle.intVal_l │ │ │intVal │_│l │ │ │
|
494
|
-
│ │ │ │ │ │ │ │ │
|
495
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┼────────────┤
|
496
|
-
│handle.vpiIntVal = 15│ │ │vpiIntVal │ │ │= │ │
|
497
|
-
│ │ │ │ │ │ │ │These │
|
498
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤expressions │
|
499
|
-
│handle.vpiIntVal_l = │ │ │ │ │ │ │assign the │
|
500
|
-
│15 │ │ │vpiIntVal │_│l │= │number 15 to│
|
501
|
-
│ │ │ │ │ │ │ │the logic │
|
502
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤value of the│
|
503
|
-
│handle.intVal = 15 │ │ │intVal │ │ │= │handle's │
|
504
|
-
│ │ │ │ │ │ │ │vpiIntVal │
|
505
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤property. │
|
506
|
-
│handle.intVal_l = 15 │ │ │intVal │_│l │= │ │
|
507
|
-
│ │ │ │ │ │ │ │ │
|
508
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┼────────────┤
|
509
|
-
│handle.vpiType │ │ │vpiType │ │ │ │ │
|
510
|
-
│ │ │ │ │ │ │ │These │
|
511
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤expressions │
|
512
|
-
│handle.vpiType_i │ │ │vpiType │_│i │ │access the │
|
513
|
-
│ │ │ │ │ │ │ │integer │
|
514
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤value of the│
|
515
|
-
│handle.type │ │ │type │ │ │ │handle's │
|
516
|
-
│ │ │ │ │ │ │ │vpiType │
|
517
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤property. │
|
518
|
-
│handle.type_i │ │ │type │_│i │ │ │
|
519
|
-
│ │ │ │ │ │ │ │ │
|
520
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┼────────────┤
|
521
|
-
│handle.vpiProtected │ │ │vpiProtected│ │ │ │ │
|
522
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤These │
|
523
|
-
│handle.vpiProtected_b│ │ │vpiProtected│_│b │ │expressions │
|
524
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤access the │
|
525
|
-
│handle.vpiProtected? │ │ │vpiProtected│ │ │? │boolean │
|
526
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤value of the│
|
527
|
-
│handle.protected │ │ │protected │ │ │ │handle's │
|
528
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤vpiProtected│
|
529
|
-
│handle.protected_b │ │ │protected │_│b │ │property. │
|
530
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤ │
|
531
|
-
│handle.protected? │ │ │protected │ │ │? │ │
|
532
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┼────────────┤
|
533
|
-
│handle.vpiFullName │ │ │vpiFullName │ │ │ │ │
|
534
|
-
│ │ │ │ │ │ │ │These │
|
535
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤expressions │
|
536
|
-
│handle.vpiFullName_s │ │ │vpiFullName │_│s │ │access the │
|
537
|
-
│ │ │ │ │ │ │ │string value│
|
538
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤of the │
|
539
|
-
│handle.fullName │ │ │fullName │ │ │ │handle's │
|
540
|
-
│ │ │ │ │ │ │ │vpiFullName │
|
541
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤property. │
|
542
|
-
│handle.fullName_s │ │ │fullName │_│s │ │ │
|
543
|
-
│ │ │ │ │ │ │ │ │
|
544
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┼────────────┤
|
545
|
-
│handle.vpiParent │ │ │vpiParent │ │ │ │ │
|
546
|
-
│ │ │ │ │ │ │ │These │
|
547
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤expressions │
|
548
|
-
│handle.vpiParent_h │ │ │vpiParent │_│h │ │access the │
|
549
|
-
│ │ │ │ │ │ │ │handle value│
|
550
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤of the │
|
551
|
-
│handle.parent │ │ │parent │ │ │ │handle's │
|
552
|
-
│ │ │ │ │ │ │ │vpiParent │
|
553
|
-
├─────────────────────┼─────────┼─┼────────────┼─┼────────┼────────┤property. │
|
554
|
-
│handle.parent_h │ │ │parent │_│h │ │ │
|
555
|
-
│ │ │ │ │ │ │ │ │
|
556
|
-
└─────────────────────┴─────────┴─┴────────────┴─┴────────┴────────┴────────────┘
|
557
|
-
|
558
|
-
Running a test
|
559
|
-
|
560
|
-
Unlike an engineer who can verify an electronic component in real-time, the
|
561
|
-
Verilog simulator and the Ruby interpreter (see Figure 2.2, “Detailed
|
562
|
-
organization of a test”) take turns working with objects in a simulation when a
|
563
|
-
test is run. In particular, they take turns manipulating the design and
|
564
|
-
transfer control to each other when appropriate.
|
565
|
-
|
566
|
-
The situation is similar to a pair of friends playing catch. One friend throws
|
567
|
-
a ball to the other, and the other throws it back. Either is able to inspect
|
568
|
-
and modify the ball, but only when it is in hand.
|
569
|
-
|
570
|
-
Initialization
|
571
|
-
|
572
|
-
A test is first initialized before it is executed. Figure 2.3, “Initialization
|
573
|
-
of a test” illustrates the initialization process described below.
|
574
|
-
|
575
|
-
Figure 2.3. Initialization of a test
|
576
|
-
|
577
|
-
Initialization of a test
|
578
|
-
|
579
|
-
Procedure 2.1. Initialization of a test
|
580
|
-
|
581
|
-
1. The Verilog simulator initializes the Ruby interpreter by invoking the
|
582
|
-
$ruby_init; system task/function, whose parameters represent the
|
583
|
-
command-line invocation of the Ruby interpreter. For example, one would
|
584
|
-
specify $ruby_init("ruby", "-w"); in Verilog to achieve the same effect as
|
585
|
-
specifying ruby -w at a command-prompt.
|
586
|
-
|
587
|
-
2. The Verilog simulator is paused and the Ruby interpreter is initialized
|
588
|
-
with the arguments of the $ruby_init; system task/function.
|
589
|
-
|
590
|
-
3. When the Ruby interpreter invokes the Vpi::relay_verilog method, it is
|
591
|
-
paused and the Verilog simulator is given control.
|
592
|
-
|
593
|
-
Execution
|
594
|
-
|
595
|
-
After a test is initialized, it is executed such that the design is verified
|
596
|
-
against the specification. Figure 2.4, “Execution of a test” illustrates the
|
597
|
-
execution process described below.
|
598
|
-
|
599
|
-
Figure 2.4. Execution of a test
|
600
|
-
|
601
|
-
Execution of a test
|
602
|
-
|
603
|
-
Procedure 2.2. Execution of a test
|
604
|
-
|
605
|
-
1. The Verilog simulator transfers control to the Ruby interpreter by invoking
|
606
|
-
the $ruby_relay; system task/function.
|
607
|
-
|
608
|
-
2. The Verilog simulator is paused and the Ruby interpreter is given control.
|
609
|
-
|
610
|
-
3. When the Ruby interpreter invokes the Vpi::relay_verilog method, it is
|
611
|
-
paused and the Verilog simulator is given control.
|
612
|
-
|
613
|
-
Chapter 3. Setup
|
614
|
-
|
615
|
-
Table of Contents
|
616
|
-
|
617
|
-
Requirements
|
618
|
-
|
619
|
-
Recommendations
|
620
|
-
|
621
|
-
Installation
|
622
|
-
|
623
|
-
Installing on Windows
|
624
|
-
|
625
|
-
Maintenance
|
626
|
-
|
627
|
-
Requirements
|
628
|
-
|
629
|
-
The following software is necessary in order to use Ruby-VPI.
|
630
|
-
|
631
|
-
Verilog simulator
|
632
|
-
|
633
|
-
Ruby-VPI is known to work with the following simulators. Nevertheless, you
|
634
|
-
should be able to use it with any Verilog simulator that supports VPI.
|
635
|
-
|
636
|
-
Icarus Verilog
|
637
|
-
|
638
|
-
Version 0.8 or newer is acceptable.
|
639
|
-
|
640
|
-
GPL Cver
|
641
|
-
|
642
|
-
Version 2.11a or newer is acceptable.
|
643
|
-
|
644
|
-
Synopsys VCS
|
645
|
-
|
646
|
-
Any version that supports the -load option is acceptable.
|
647
|
-
|
648
|
-
Mentor Modelsim
|
649
|
-
|
650
|
-
Any version that supports the -pli option is acceptable.
|
651
|
-
|
652
|
-
make
|
653
|
-
|
654
|
-
GNU make is preferred but any distribution of make should be acceptable.
|
655
|
-
|
656
|
-
C compiler
|
657
|
-
|
658
|
-
GNU Compiler Collection (GCC) is preferred but any C compiler should be
|
659
|
-
acceptable.
|
660
|
-
|
661
|
-
POSIX threads (pthreads)
|
662
|
-
|
663
|
-
Header and linkable object files, and operating system support for this
|
664
|
-
library are necessary.
|
665
|
-
|
666
|
-
Ruby
|
667
|
-
|
668
|
-
Version 1.8 or newer, including header and linkable object files for
|
669
|
-
building extensions, is necessary. You can install Ruby by following these
|
670
|
-
instructions.
|
671
|
-
|
672
|
-
RubyGems
|
673
|
-
|
674
|
-
Any recent version should be acceptable. You can install RubyGems by
|
675
|
-
following these instructions.
|
676
|
-
|
677
|
-
Recommendations
|
678
|
-
|
679
|
-
The following software may make your interactions with Ruby-VPI more pleasant.
|
680
|
-
|
681
|
-
Text merging tool
|
682
|
-
|
683
|
-
An interactive text merging tool can greatly simplify the process of
|
684
|
-
transferring wanted changes from one file to another. In particular, such
|
685
|
-
tools are especially beneficial when using the automated test generator. A
|
686
|
-
handful of the currently available open-source text merging tools are
|
687
|
-
listed below.
|
688
|
-
|
689
|
-
kdiff3
|
690
|
-
|
691
|
-
A graphical, three-way merging tool for KDE.
|
692
|
-
|
693
|
-
meld
|
694
|
-
|
695
|
-
A graphical, three-way merging tool for GNOME.
|
696
|
-
|
697
|
-
tkdiff
|
698
|
-
|
699
|
-
A graphical, two-way merging tool that uses the cross-platform Tk
|
700
|
-
windowing toolkit.
|
701
|
-
|
702
|
-
xxdiff
|
703
|
-
|
704
|
-
A graphical, three-way merging tool.
|
705
|
-
|
706
|
-
imediff2
|
707
|
-
|
708
|
-
A textual, fullscreen two-way merging tool. This tool is useful when
|
709
|
-
you are working remotely via SSH.
|
710
|
-
|
711
|
-
Installation
|
712
|
-
|
713
|
-
Once you have satisfied the necessary requirements, you can install Ruby-VPI by
|
714
|
-
running the command gem install ruby-vpi. RubyGems will install Ruby-VPI into
|
715
|
-
the system gem directory, whose path can be determined by running the command
|
716
|
-
gem env gemdir. Within this directory, there is a "gems" subdirectory which
|
717
|
-
contains the Ruby-VPI installation, as illustrated below.
|
718
|
-
|
719
|
-
$ gem env gemdir
|
720
|
-
/usr/lib/ruby/gems/1.8
|
721
|
-
|
722
|
-
$ ls -d /usr/lib/ruby/gems/1.8/gems/ruby-vpi-*
|
723
|
-
/usr/lib/ruby/gems/1.8/gems/ruby-vpi-7.0.0/
|
724
|
-
|
725
|
-
Installing on Windows
|
726
|
-
|
727
|
-
1. Install Cygwin, the Linux-like environment for Windows.
|
728
|
-
|
729
|
-
2. Search for object files whose names end with .so, .o, or .dll in your
|
730
|
-
Verilog simulator's installation directory.
|
731
|
-
|
732
|
-
3. Determine which object files, among those found in the previous step,
|
733
|
-
contain symbols whose names begin with _vpi^[1] by running the command for
|
734
|
-
x in *.{o,so,dll}; do nm $x | grep -q '[Tt] _vpi' > /dev/null && echo $x;
|
735
|
-
done in Cygwin.
|
736
|
-
|
737
|
-
[Tip] Tip
|
738
|
-
If you are using Mentor Modelsim, the desired object file can be
|
739
|
-
found at a path similar to C:\Modeltech\win32\libvsim.dll.
|
740
|
-
|
741
|
-
[Tip] Tip
|
742
|
-
If you are using GPL Cver, the desired object file can be found at a
|
743
|
-
path similar to C:\gplcver\objs\v_vpi.o.
|
744
|
-
|
745
|
-
4. Assign the path of the object file (determined in the previous step) to the
|
746
|
-
LDFLAGS environment variable. For example, if the object file's path is /
|
747
|
-
foo/bar/vpi.so, then you would run the command export LDFLAGS=/foo/bar/
|
748
|
-
vpi.so in Cygwin.
|
749
|
-
|
750
|
-
5. You may now install Ruby-VPI by running the command gem install ruby-vpi in
|
751
|
-
Cygwin.
|
752
|
-
|
753
|
-
Maintenance
|
754
|
-
|
755
|
-
You can uninstall Ruby-VPI by running the command gem uninstall ruby-vpi.
|
756
|
-
Furthermore, you can upgrade to the latest release of Ruby-VPI by running the
|
757
|
-
command gem update ruby-vpi. Finally, you can learn more about using and
|
758
|
-
manipulating RubyGems in the RubyGems user manual.
|
759
|
-
|
760
|
-
|
761
|
-
━━━━━━━━━━━━━━
|
762
|
-
|
763
|
-
^[1] Because Ruby-VPI makes use of the VPI C-language interface, it links to
|
764
|
-
symbols whose names begin with _vpi. It is possible for these symbols to be
|
765
|
-
undefined when Ruby-VPI is compiled under GNU/Linux and similar operating
|
766
|
-
systems. In contrast, one cannot compile a shared object file with references
|
767
|
-
to undefined symbols under Windows. Thus, we must find a Verilog simulator's
|
768
|
-
shared object file, which contains definitions of all VPI symbols, and give
|
769
|
-
this file to the linker when compiling Ruby-VPI.
|
770
|
-
|
771
|
-
Chapter 4. Usage
|
772
|
-
|
773
|
-
Table of Contents
|
774
|
-
|
775
|
-
Tools
|
776
|
-
|
777
|
-
Automated test generation
|
778
|
-
Verilog to Ruby conversion
|
779
|
-
|
780
|
-
Tutorial
|
781
|
-
|
782
|
-
Start with a design
|
783
|
-
Generate a test
|
784
|
-
Specify your expectations
|
785
|
-
Implement the prototype
|
786
|
-
Verify the prototype
|
787
|
-
Implement the design
|
788
|
-
Verify the design
|
789
|
-
|
790
|
-
Examples
|
791
|
-
|
792
|
-
Tools
|
793
|
-
|
794
|
-
The bin directory contains various utilities which ease the process of writing
|
795
|
-
tests. Each tool provides help and usage information invoked with the --help
|
796
|
-
option.
|
797
|
-
|
798
|
-
Automated test generation
|
799
|
-
|
800
|
-
The automated test generator (generate_test.rb) generates tests from Verilog
|
801
|
-
2001 module declarations, as demonstrated in the section called “Generate a
|
802
|
-
test”. A generated test is composed of the following parts:
|
803
|
-
|
804
|
-
Runner
|
805
|
-
|
806
|
-
Written in Rake, this file builds and runs the test.
|
807
|
-
|
808
|
-
Bench
|
809
|
-
|
810
|
-
Written in Verilog and Ruby, these files define the testing environment.
|
811
|
-
|
812
|
-
Design
|
813
|
-
|
814
|
-
Written in Ruby, this file provides an interface to the design being
|
815
|
-
verified.
|
816
|
-
|
817
|
-
Prototype
|
818
|
-
|
819
|
-
Written in Ruby, this file defines a prototype of the design being
|
820
|
-
verified.
|
821
|
-
|
822
|
-
Specification
|
823
|
-
|
824
|
-
Written in Ruby, this file verifies the design.
|
825
|
-
|
826
|
-
The reason for dividing a single test into these parts is mainly to decouple
|
827
|
-
the design from the specification. This allows you to focus on writing the
|
828
|
-
specification while the remainder is automatically generated by the tool. For
|
829
|
-
example, when the interface of a Verilog module changes, you would simply
|
830
|
-
re-run this tool and incorporate those changes (using a text merging tool) into
|
831
|
-
the test without diverting your focus from the specification.
|
832
|
-
|
833
|
-
[Tip] Using kdiff3 with the automated test generator
|
834
|
-
Create a file named merge2 with the content below, make it executable,
|
835
|
-
and put it somewhere accessible by your PATH environment variable. Next,
|
836
|
-
update the MERGER environment variable by executing export MERGER=merge2.
|
837
|
-
|
838
|
-
#!/bin/sh
|
839
|
-
# args: old file, new file
|
840
|
-
kdiff3 --auto --merge --output "$2" "$@" 2>/dev/null
|
841
|
-
|
842
|
-
From now on, kdiff3 will be invoked to help you transfer your changes
|
843
|
-
between generated files. When you are finished transferring changes,
|
844
|
-
simply issue the "save the file" command and terminate kdiff3. Or, if you
|
845
|
-
do not want to transfer any changes, simply terminate kdiff3.
|
846
|
-
|
847
|
-
Verilog to Ruby conversion
|
848
|
-
|
849
|
-
The header_to_ruby.rb tool can be used to convert Verilog header files into
|
850
|
-
Ruby. You can try it by running the command header_to_ruby.rb --help.
|
851
|
-
|
852
|
-
Tutorial
|
853
|
-
|
854
|
-
Procedure 4.1. Typical way of using Ruby-VPI
|
855
|
-
|
856
|
-
1. Declare the design, which is a Verilog module, using Verilog 2001 syntax.
|
857
|
-
|
858
|
-
2. Generate a test for the design using the automated test generator tool.
|
859
|
-
|
860
|
-
3. Identify your expectations for the design and implement them in the
|
861
|
-
specification.
|
862
|
-
|
863
|
-
4. (Optional) Implement the prototype of the design in Ruby.
|
864
|
-
|
865
|
-
5. (Optional) Verify the prototype against the specification.
|
866
|
-
|
867
|
-
6. Implement the design in Verilog once the prototype has been verified.
|
868
|
-
|
869
|
-
7. Verify the design against the specification.
|
870
|
-
|
871
|
-
Start with a design
|
872
|
-
|
873
|
-
First, we need a Design to verify. In this tutorial, Figure 4.1, “Declaration
|
874
|
-
of a simple up-counter with synchronous reset” will serve as our design. Its
|
875
|
-
interface is composed of the following parts:
|
876
|
-
|
877
|
-
Size
|
878
|
-
|
879
|
-
This parameter defines the number of bits used to represent the counter's
|
880
|
-
value.
|
881
|
-
|
882
|
-
clock
|
883
|
-
|
884
|
-
Each positive edge of this signal causes the count register to increment.
|
885
|
-
|
886
|
-
reset
|
887
|
-
|
888
|
-
Assertion of this signal causes the count register to become zero.
|
889
|
-
|
890
|
-
count
|
891
|
-
|
892
|
-
This register contains the counter's value.
|
893
|
-
|
894
|
-
Figure 4.1. Declaration of a simple up-counter with synchronous reset
|
895
|
-
|
896
|
-
module counter #(parameter Size = 5) (
|
897
|
-
input clock,
|
898
|
-
input reset,
|
899
|
-
output reg [Size - 1 : 0] count
|
900
|
-
);
|
901
|
-
endmodule
|
902
|
-
|
903
|
-
[Important] Before we continue…
|
904
|
-
Save the source code shown in Figure 4.1, “Declaration of a simple
|
905
|
-
up-counter with synchronous reset” into a file named counter.v.
|
906
|
-
|
907
|
-
Generate a test
|
908
|
-
|
909
|
-
Now that we have a Design to verify, let us generate a Test for it using the
|
910
|
-
automated test generator. This tool allows us to implement our Specification in
|
911
|
-
either rSpec, xUnit, or our very own format. Each format represents a different
|
912
|
-
software development methodology: rSpec represents BDD, xUnit represents TDD,
|
913
|
-
and our own format can represent another methodology. Both rSpec and xUnit are
|
914
|
-
presented in this tutorial.
|
915
|
-
|
916
|
-
Once we have decided how we want to implement our specification, we can proceed
|
917
|
-
to generate a test for our design. Figure 4.2, “Generating a test with
|
918
|
-
specification in rSpec format” and Figure 4.3, “Generating a test with
|
919
|
-
specification in xUnit format” illustrate this process.
|
920
|
-
|
921
|
-
Figure 4.2. Generating a test with specification in rSpec format
|
922
|
-
|
923
|
-
$ generate_test.rb counter.v --rspec --name rspec
|
924
|
-
|
925
|
-
name rspec
|
926
|
-
format rSpec
|
927
|
-
|
928
|
-
module counter
|
929
|
-
create counter_rspec_runner.rake
|
930
|
-
create counter_rspec_bench.v
|
931
|
-
create counter_rspec_bench.rb
|
932
|
-
create counter_rspec_design.rb
|
933
|
-
create counter_rspec_proto.rb
|
934
|
-
create counter_rspec_spec.rb
|
935
|
-
|
936
|
-
|
937
|
-
Figure 4.3. Generating a test with specification in xUnit format
|
938
|
-
|
939
|
-
$ generate_test.rb counter.v --xunit --name xunit
|
940
|
-
|
941
|
-
name xunit
|
942
|
-
format xUnit
|
943
|
-
|
944
|
-
module counter
|
945
|
-
create counter_xunit_runner.rake
|
946
|
-
create counter_xunit_bench.v
|
947
|
-
create counter_xunit_bench.rb
|
948
|
-
create counter_xunit_design.rb
|
949
|
-
create counter_xunit_proto.rb
|
950
|
-
create counter_xunit_spec.rb
|
951
|
-
|
952
|
-
|
953
|
-
Specify your expectations
|
954
|
-
|
955
|
-
So far, the test generation tool has created a basic foundation for our Test.
|
956
|
-
Now we must build upon this foundation by identifying our Expectations of the
|
957
|
-
Design. That is, how do we expect the design to behave under certain
|
958
|
-
conditions?
|
959
|
-
|
960
|
-
The following is a reasonable set of expectations for our simple counter:
|
961
|
-
|
962
|
-
● A resetted counter's value should be zero.
|
963
|
-
|
964
|
-
● A resetted counter's value should increment by one count upon each rising
|
965
|
-
clock edge.
|
966
|
-
|
967
|
-
● A counter with the maximum value should overflow upon increment.
|
968
|
-
|
969
|
-
Now that we have identified a set of expectations for our design, we are ready
|
970
|
-
to implement them in our specification. Figure 4.4, “Specification implemented
|
971
|
-
in rSpec format” and Figure 4.5, “Specification implemented in xUnit format”
|
972
|
-
illustrate this process. Note the striking similarities between our
|
973
|
-
expectations and their implementation.
|
974
|
-
|
975
|
-
Figure 4.4. Specification implemented in rSpec format
|
976
|
-
|
977
|
-
# lowest upper bound of counter's value
|
978
|
-
LIMIT = 2 ** Counter.Size.intVal
|
979
|
-
|
980
|
-
# maximum allowed value for a counter
|
981
|
-
MAX = LIMIT - 1
|
982
|
-
|
983
|
-
context "A resetted counter's value" do
|
984
|
-
setup do
|
985
|
-
Counter.reset!
|
986
|
-
end
|
987
|
-
|
988
|
-
specify "should be zero" do
|
989
|
-
Counter.count.intVal.should_equal 0
|
990
|
-
end
|
991
|
-
|
992
|
-
specify "should increment by one count upon each rising clock edge" do
|
993
|
-
LIMIT.times do |i|
|
994
|
-
Counter.count.intVal.should_equal i
|
995
|
-
relay_verilog # advance the clock
|
996
|
-
end
|
997
|
-
end
|
998
|
-
end
|
999
|
-
|
1000
|
-
context "A counter with the maximum value" do
|
1001
|
-
setup do
|
1002
|
-
Counter.reset!
|
1003
|
-
|
1004
|
-
# increment the counter to maximum value
|
1005
|
-
MAX.times do relay_verilog end
|
1006
|
-
Counter.count.intVal.should_equal MAX
|
1007
|
-
end
|
1008
|
-
|
1009
|
-
specify "should overflow upon increment" do
|
1010
|
-
relay_verilog # increment the counter
|
1011
|
-
Counter.count.intVal.should_equal 0
|
1012
|
-
end
|
1013
|
-
end
|
1014
|
-
|
1015
|
-
Figure 4.5. Specification implemented in xUnit format
|
1016
|
-
|
1017
|
-
# lowest upper bound of counter's value
|
1018
|
-
LIMIT = 2 ** Counter.Size.intVal
|
1019
|
-
|
1020
|
-
# maximum allowed value for a counter
|
1021
|
-
MAX = LIMIT - 1
|
1022
|
-
|
1023
|
-
class ResettedCounterValue < Test::Unit::TestCase
|
1024
|
-
def setup
|
1025
|
-
Counter.reset!
|
1026
|
-
end
|
1027
|
-
|
1028
|
-
def test_zero
|
1029
|
-
assert_equal 0, Counter.count.intVal
|
1030
|
-
end
|
1031
|
-
|
1032
|
-
def test_increment
|
1033
|
-
LIMIT.times do |i|
|
1034
|
-
assert_equal i, Counter.count.intVal
|
1035
|
-
relay_verilog # advance the clock
|
1036
|
-
end
|
1037
|
-
end
|
1038
|
-
end
|
1039
|
-
|
1040
|
-
class MaximumCounterValue < Test::Unit::TestCase
|
1041
|
-
def setup
|
1042
|
-
Counter.reset!
|
1043
|
-
|
1044
|
-
# increment the counter to maximum value
|
1045
|
-
MAX.times do relay_verilog end
|
1046
|
-
assert_equal MAX, Counter.count.intVal
|
1047
|
-
end
|
1048
|
-
|
1049
|
-
def test_overflow
|
1050
|
-
relay_verilog # increment the counter
|
1051
|
-
assert_equal 0, Counter.count.intVal
|
1052
|
-
end
|
1053
|
-
end
|
1054
|
-
|
1055
|
-
[Important] Before we continue…
|
1056
|
-
● Replace the contents of the file named counter_rspec_spec.rb
|
1057
|
-
with the source code shown in Figure 4.4, “Specification
|
1058
|
-
implemented in rSpec format”.
|
1059
|
-
|
1060
|
-
● Replace the contents of the file named counter_xunit_spec.rb
|
1061
|
-
with the source code shown in Figure 4.5, “Specification
|
1062
|
-
implemented in xUnit format”.
|
1063
|
-
|
1064
|
-
● Replace the contents of the files named counter_rspec_design.rb
|
1065
|
-
and counter_xunit_design.rb with the following code. This code
|
1066
|
-
defines the reset! method which resets our Verilog design.
|
1067
|
-
|
1068
|
-
def Counter.reset!
|
1069
|
-
reset.intVal = 1
|
1070
|
-
relay_verilog # advance the clock
|
1071
|
-
reset.intVal = 0
|
1072
|
-
end
|
1073
|
-
|
1074
|
-
|
1075
|
-
Implement the prototype
|
1076
|
-
|
1077
|
-
Now that we have a Specification against which to verify our Design, let us
|
1078
|
-
build a prototype of our design. By doing so, we exercise our specification,
|
1079
|
-
experience potential problems that may arise when we later implement our design
|
1080
|
-
in Verilog, and gain confidence in our work. Figure 4.6, “Ruby prototype of our
|
1081
|
-
Verilog design” shows the completed prototype for our design.
|
1082
|
-
|
1083
|
-
Figure 4.6. Ruby prototype of our Verilog design
|
1084
|
-
|
1085
|
-
def Counter.simulate!
|
1086
|
-
if reset.intVal == 1
|
1087
|
-
count.intVal = 0
|
1088
|
-
else
|
1089
|
-
count.intVal += 1
|
1090
|
-
end
|
1091
|
-
end
|
1092
|
-
|
1093
|
-
[Important] Before we continue…
|
1094
|
-
Replace the contents of the files named counter_rspec_proto.rb and
|
1095
|
-
counter_xunit_proto.rb with the source code shown in Figure 4.6,
|
1096
|
-
“Ruby prototype of our Verilog design”.
|
1097
|
-
|
1098
|
-
Verify the prototype
|
1099
|
-
|
1100
|
-
Now that we have implemented our prototype, we are ready to verify it against
|
1101
|
-
our Specification by running the Test. Figure 4.7, “Running a test with
|
1102
|
-
specification in rSpec format” and Figure 4.8, “Running a test with
|
1103
|
-
specification in xUnit format” illustrate this process.
|
1104
|
-
|
1105
|
-
[Tip] Reuse your past efforts!
|
1106
|
-
The same specification can be used to verify both prototype and design.
|
1107
|
-
|
1108
|
-
Here, the PROTOTYPE environment variable is assigned a non-empty value while
|
1109
|
-
running the test, so that, instead of our design, our prototype is verified
|
1110
|
-
against our specification. You can also assign a value to PROTOTYPE before
|
1111
|
-
running the test, by using your shell's export or setenv command. Finally, the
|
1112
|
-
Icarus Verilog simulator, denoted by cver, is used to run the simulation.
|
1113
|
-
|
1114
|
-
[Tip] What can the test runner do?
|
1115
|
-
If you invoke the test runner (1) without any arguments or (2) with the
|
1116
|
-
-T option, it will show you a list of tasks that it can perform for you.
|
1117
|
-
|
1118
|
-
Figure 4.7. Running a test with specification in rSpec format
|
1119
|
-
|
1120
|
-
$ rake -f counter_rspec_runner.rake cver PROTOTYPE=1
|
1121
|
-
counter_rspec: verifying prototype instead of design
|
1122
|
-
|
1123
|
-
A resetted counter's value
|
1124
|
-
- should be zero
|
1125
|
-
- should increment by one count upon each rising clock edge
|
1126
|
-
|
1127
|
-
A counter with the maximum value
|
1128
|
-
- should overflow upon increment
|
1129
|
-
|
1130
|
-
Finished in 0.018199 seconds
|
1131
|
-
|
1132
|
-
3 specifications, 0 failures
|
1133
|
-
|
1134
|
-
Figure 4.8. Running a test with specification in xUnit format
|
1135
|
-
|
1136
|
-
$ rake -f counter_xunit_runner.rake cver PROTOTYPE=1
|
1137
|
-
counter_xunit: verifying prototype instead of design
|
1138
|
-
|
1139
|
-
Loaded suite counter_xunit_bench
|
1140
|
-
Started
|
1141
|
-
...
|
1142
|
-
Finished in 0.040668 seconds.
|
1143
|
-
|
1144
|
-
3 tests, 35 assertions, 0 failures, 0 errors
|
1145
|
-
|
1146
|
-
Implement the design
|
1147
|
-
|
1148
|
-
Now that we have implemented and verified our prototype, we are ready to
|
1149
|
-
implement our Design. This is often quite simple because we translate existing
|
1150
|
-
code from Ruby (our prototype) into Verilog (our design). Figure 4.9,
|
1151
|
-
“Implementation of a simple up-counter with synchronous reset” illustrates the
|
1152
|
-
result of this process. Once again, note the striking similarities between the
|
1153
|
-
implementation of our prototype and design.
|
1154
|
-
|
1155
|
-
Figure 4.9. Implementation of a simple up-counter with synchronous reset
|
1156
|
-
|
1157
|
-
module counter #(parameter Size = 5) (
|
1158
|
-
input clock,
|
1159
|
-
input reset,
|
1160
|
-
output reg [Size - 1 : 0] count
|
1161
|
-
);
|
1162
|
-
always @(posedge clock) begin
|
1163
|
-
if (reset)
|
1164
|
-
count <= 0;
|
1165
|
-
else
|
1166
|
-
count <= count + 1;
|
1167
|
-
end
|
1168
|
-
endmodule
|
1169
|
-
|
1170
|
-
[Important] Before we continue…
|
1171
|
-
Replace the contents of the file named counter.v with the source
|
1172
|
-
code shown in Figure 4.9, “Implementation of a simple up-counter
|
1173
|
-
with synchronous reset”.
|
1174
|
-
|
1175
|
-
Verify the design
|
1176
|
-
|
1177
|
-
Now that we have implemented our Design, we are ready to verify it against our
|
1178
|
-
Specification by running the Test. Figure 4.10, “Running a test with
|
1179
|
-
specification in rSpec format” and Figure 4.11, “Running a test with
|
1180
|
-
specification in xUnit format” illustrate this process.
|
1181
|
-
|
1182
|
-
Here, the PROTOTYPE environment variable is not specified while running the
|
1183
|
-
test, so that our design, instead of our prototype, is verified against our
|
1184
|
-
specification. You can also achieve this effect by assigning an empty value to
|
1185
|
-
PROTOTYPE, or by using your shell's unset command. Finally, the GPL Cver
|
1186
|
-
Verilog simulator, denoted by cver, is used to run the simulation.
|
1187
|
-
|
1188
|
-
[Tip] Running multiple tests
|
1189
|
-
Create a file named Rakefile containing the following line.
|
1190
|
-
|
1191
|
-
require 'ruby-vpi/runner_proxy'
|
1192
|
-
|
1193
|
-
Now you can invoke all test runners in the current directory simply by
|
1194
|
-
executing rake cver (where cver denotes the GPL Cver simulator).
|
1195
|
-
|
1196
|
-
Figure 4.10. Running a test with specification in rSpec format
|
1197
|
-
|
1198
|
-
$ rake -f counter_rspec_runner.rake cver
|
1199
|
-
A resetted counter's value
|
1200
|
-
- should be zero
|
1201
|
-
- should increment by one count upon each rising clock edge
|
1202
|
-
|
1203
|
-
A counter with the maximum value
|
1204
|
-
- should overflow upon increment
|
1205
|
-
|
1206
|
-
Finished in 0.005628 seconds
|
1207
|
-
|
1208
|
-
3 specifications, 0 failures
|
1209
|
-
|
1210
|
-
Figure 4.11. Running a test with specification in xUnit format
|
1211
|
-
|
1212
|
-
$ rake -f counter_xunit_runner.rake cver
|
1213
|
-
Loaded suite counter_xunit_bench
|
1214
|
-
Started
|
1215
|
-
...
|
1216
|
-
Finished in 0.006766 seconds.
|
1217
|
-
|
1218
|
-
3 tests, 35 assertions, 0 failures, 0 errors
|
1219
|
-
|
1220
|
-
Examples
|
1221
|
-
|
1222
|
-
The samp directory contains several example tests which illustrate how Ruby-VPI
|
1223
|
-
can be used. Each example has an associated Rakefile which simplifies the
|
1224
|
-
process of running it. Therefore, simply navigate into an example directory and
|
1225
|
-
run the command rake to get started.
|
1226
|
-
|
1227
|
-
Also, some example specifications make use of BDD through the rSpec library.
|
1228
|
-
See the the section called “Methodology” for a discussion of rSpec.
|
1229
|
-
|
1230
|
-
Chapter 5. Hacking
|
1231
|
-
|
1232
|
-
Table of Contents
|
1233
|
-
|
1234
|
-
Building release packages
|
1235
|
-
|
1236
|
-
Building release packages
|
1237
|
-
|
1238
|
-
In addition to the "normal requirements":./doc/usage.requirements.html, you
|
1239
|
-
need the following software to build release packages:
|
1240
|
-
|
1241
|
-
DocBook-XML
|
1242
|
-
|
1243
|
-
xsltproc
|
1244
|
-
|
1245
|
-
xmlto
|
1246
|
-
|
1247
|
-
RedCloth
|
1248
|
-
|
1249
|
-
SWIG
|
1250
|
-
|
1251
|
-
Once you have satisfied these requirements, you can run rake release to build
|
1252
|
-
the release packages. Also, see the output of rake -T for more build options.
|
1253
|
-
|
1254
|
-
Chapter 6. Known problems
|
1255
|
-
|
1256
|
-
Table of Contents
|
1257
|
-
|
1258
|
-
Ruby
|
1259
|
-
|
1260
|
-
SystemStackError
|
1261
|
-
test/unit
|
1262
|
-
|
1263
|
-
Icarus Verilog
|
1264
|
-
|
1265
|
-
vpi_handle_by_name
|
1266
|
-
Vpi::reset
|
1267
|
-
|
1268
|
-
Mentor Modelsim
|
1269
|
-
|
1270
|
-
ruby_run()
|
1271
|
-
|
1272
|
-
This chapter presents known problems and possible solutions. In addition,
|
1273
|
-
previously solved problems have been retained for historical reference.
|
1274
|
-
|
1275
|
-
Ruby
|
1276
|
-
|
1277
|
-
SystemStackError
|
1278
|
-
|
1279
|
-
[Note] Problem solved
|
1280
|
-
This problem was fixed in release 2.0.0 (2006-04-17). If it still
|
1281
|
-
occurs, then please report it.
|
1282
|
-
|
1283
|
-
If a “stack level too deep (SystemStackError)” error occurs during the
|
1284
|
-
simulation, then increase the system-resource limit for stack-size by running
|
1285
|
-
the command ulimit -s unlimited before starting the simulation.
|
1286
|
-
|
1287
|
-
test/unit
|
1288
|
-
|
1289
|
-
[Note] Problem solved
|
1290
|
-
This problem was fixed in release 2.0.0 (2006-04-17). If it still
|
1291
|
-
occurs, then please report it.
|
1292
|
-
|
1293
|
-
If your specification employs Ruby's unit testing framework, then you will
|
1294
|
-
encounter the error: “[BUG] cross-thread violation on rb_gc()”.
|
1295
|
-
|
1296
|
-
Icarus Verilog
|
1297
|
-
|
1298
|
-
vpi_handle_by_name
|
1299
|
-
|
1300
|
-
Give full paths to Verilog objects
|
1301
|
-
|
1302
|
-
In version 0.8 and snapshot 20061009 of Icarus Verilog, the vpi_handle_by_name
|
1303
|
-
function requires an absolute path (including the name of the bench which
|
1304
|
-
instantiates the design) to a Verilog object. In addition, vpi_handle_by_name
|
1305
|
-
is unable to retrieve the handle for a module parameter.
|
1306
|
-
|
1307
|
-
For example, consider Example 6.1, “Part of a bench which instantiates a
|
1308
|
-
Verilog design”. Here, one needs to specify TestFoo.my_foo.clk instead of
|
1309
|
-
my_foo.clk in order to access the clk input of the my_foo module instance.
|
1310
|
-
|
1311
|
-
Example 6.1. Part of a bench which instantiates a Verilog design
|
1312
|
-
|
1313
|
-
module TestFoo;
|
1314
|
-
reg clk_reg;
|
1315
|
-
Foo my_foo(.clk(clk_reg));
|
1316
|
-
endmodule
|
1317
|
-
|
1318
|
-
Registers must be connected
|
1319
|
-
|
1320
|
-
In version 0.8 of Icarus Verilog, if you want to access a register in a design,
|
1321
|
-
then it must be connected to something (either assigned to a wire or passed as
|
1322
|
-
a parameter to a module instantiation). Otherwise, you will get a nil value as
|
1323
|
-
the result of vpi_handle_by_name method.
|
1324
|
-
|
1325
|
-
For example, suppose you wanted to access the clk_reg register, from the bench
|
1326
|
-
shown in Example 6.2, “Bad design with unconnected registers”. If you execute
|
1327
|
-
the statement clk_reg = vpi_handle_by_name("TestFoo.clk_reg", nil) in a
|
1328
|
-
specification, then you will discover that the vpi_handle_by_name method
|
1329
|
-
returns nil instead of a handle to the clk_reg register.
|
1330
|
-
|
1331
|
-
The solution is to change the design such that it appears like the one shown in
|
1332
|
-
Example 6.3, “Fixed design with wired registers” where the register is
|
1333
|
-
connected to a wire, or Example 6.1, “Part of a bench which instantiates a
|
1334
|
-
Verilog design” where the register is connected to a module instantiation.
|
1335
|
-
|
1336
|
-
Example 6.2. Bad design with unconnected registers
|
1337
|
-
|
1338
|
-
Here the clk_reg register is not connected to anything.
|
1339
|
-
|
1340
|
-
module TestFoo;
|
1341
|
-
reg clk_reg;
|
1342
|
-
endmodule
|
1343
|
-
|
1344
|
-
Example 6.3. Fixed design with wired registers
|
1345
|
-
|
1346
|
-
Here the clk_reg register is connected to the clk_wire wire.
|
1347
|
-
|
1348
|
-
module TestFoo;
|
1349
|
-
reg clk_reg;
|
1350
|
-
wire clk_wire;
|
1351
|
-
assign clk_wire = clk_reg;
|
1352
|
-
endmodule
|
1353
|
-
|
1354
|
-
Vpi::reset
|
1355
|
-
|
1356
|
-
[Caution] Deprecated method
|
1357
|
-
The vpi_control method was removed in release 3.0.0 (2006-04-23) of
|
1358
|
-
Ruby-VPI, and is deprecated. Please use Vpi::vpi_control(VpiReset)
|
1359
|
-
instead.
|
1360
|
-
|
1361
|
-
In version 0.8 of Icarus Verilog, the vpi_control(vpiReset) VPI function causes
|
1362
|
-
an assertion to fail inside the simulator. As a result, the simulation
|
1363
|
-
terminates and a core dump is produced.
|
1364
|
-
|
1365
|
-
Mentor Modelsim
|
1366
|
-
|
1367
|
-
ruby_run()
|
1368
|
-
|
1369
|
-
[Note] Problem solved
|
1370
|
-
This problem was fixed in release 2.0.0 (2006-04-17). If it still
|
1371
|
-
occurs, then please report it.
|
1372
|
-
|
1373
|
-
Version 6.1b of Mentor Modelsim doesn't play nicely with either an embedded
|
1374
|
-
Ruby interpreter or POSIX threads in a PLI application. When Ruby-VPI invokes
|
1375
|
-
the ruby_run function (which starts the Ruby interpreter), the simulator
|
1376
|
-
terminates immediately with an exit status of 0.
|
1377
|
-
|
1378
|
-
Glossary
|
1379
|
-
|
1380
|
-
B
|
1381
|
-
|
1382
|
-
Bench
|
1383
|
-
|
1384
|
-
An environment in which a Design is verified against a Specification.
|
1385
|
-
Often, it is used to emulate conditions in which the design will be
|
1386
|
-
eventually deployed.
|
1387
|
-
|
1388
|
-
BDD
|
1389
|
-
|
1390
|
-
Behavior driven development.
|
1391
|
-
|
1392
|
-
A software development methodology which emphasizes thinking in terms of
|
1393
|
-
behavior when designing, implementing, and verifying software. See the
|
1394
|
-
official wiki for more information.
|
1395
|
-
|
1396
|
-
See Also TDD, rSpec.
|
1397
|
-
|
1398
|
-
D
|
1399
|
-
|
1400
|
-
Design
|
1401
|
-
|
1402
|
-
An idea or entity that is verified against a Specification in order to
|
1403
|
-
ensure correctness or soundness of its being. In other words, it is the
|
1404
|
-
thing being checked: does it work or not?
|
1405
|
-
|
1406
|
-
E
|
1407
|
-
|
1408
|
-
Expectation
|
1409
|
-
|
1410
|
-
The desired response to some stimulus.
|
1411
|
-
|
1412
|
-
H
|
1413
|
-
|
1414
|
-
Handle
|
1415
|
-
|
1416
|
-
An object in a Verilog simulation. For example, a handle can represent a
|
1417
|
-
wire, register, module, if-statement, expression, and so on.
|
1418
|
-
|
1419
|
-
R
|
1420
|
-
|
1421
|
-
Rake
|
1422
|
-
Rake is a build tool, written in Ruby, using Ruby as a
|
1423
|
-
build language. Rake is similar to make in scope and
|
1424
|
-
purpose.
|
1425
|
-
|
1426
|
-
--Rake documentation
|
1427
|
-
|
1428
|
-
See the Rake website for more information.
|
1429
|
-
|
1430
|
-
rSpec
|
1431
|
-
|
1432
|
-
Ruby framework for BDD. See the rSpec website and rSpec tutorial for more
|
1433
|
-
information.
|
1434
|
-
|
1435
|
-
See Also BDD.
|
1436
|
-
|
1437
|
-
S
|
1438
|
-
|
1439
|
-
Specification
|
1440
|
-
|
1441
|
-
A set of Expectations which define the desired behavior of a Design when it
|
1442
|
-
is subjected to certain conditions.
|
1443
|
-
|
1444
|
-
T
|
1445
|
-
|
1446
|
-
TDD
|
1447
|
-
|
1448
|
-
Test Driven Development.
|
1449
|
-
|
1450
|
-
See Also BDD.
|
1451
|
-
|
1452
|
-
Test
|
1453
|
-
|
1454
|
-
Something that checks if a Design satisfies a Specification.
|
1455
|
-
|
1456
|
-
See Also Test bench.
|
1457
|
-
|
1458
|
-
Test bench
|
1459
|
-
|
1460
|
-
An allusion to a bench in an electronics laboratory, or so it seems.
|
1461
|
-
|
1462
|
-
See Also Test.
|
1463
|
-
|
1464
|
-
GNU Free Documentation License
|
1465
|
-
|
1466
|
-
Version 1.2, November 2002
|
1467
|
-
|
1468
|
-
Copyright © 2000,2001,2002 Free Software Foundation, Inc.
|
1469
|
-
|
1470
|
-
Free Software Foundation, Inc.
|
1471
|
-
51 Franklin St, Fifth Floor,
|
1472
|
-
Boston,
|
1473
|
-
MA
|
1474
|
-
02110-1301
|
1475
|
-
USA
|
1476
|
-
|
1477
|
-
|
1478
|
-
Everyone is permitted to copy and distribute verbatim copies of this license
|
1479
|
-
document, but changing it is not allowed.
|
1480
|
-
|
1481
|
-
Version 1.2, November 2002
|
1482
|
-
|
1483
|
-
Table of Contents
|
1484
|
-
|
1485
|
-
PREAMBLE
|
1486
|
-
APPLICABILITY AND DEFINITIONS
|
1487
|
-
VERBATIM COPYING
|
1488
|
-
COPYING IN QUANTITY
|
1489
|
-
MODIFICATIONS
|
1490
|
-
COMBINING DOCUMENTS
|
1491
|
-
COLLECTIONS OF DOCUMENTS
|
1492
|
-
AGGREGATION WITH INDEPENDENT WORKS
|
1493
|
-
TRANSLATION
|
1494
|
-
TERMINATION
|
1495
|
-
FUTURE REVISIONS OF THIS LICENSE
|
1496
|
-
ADDENDUM: How to use this License for your documents
|
1497
|
-
|
1498
|
-
PREAMBLE
|
1499
|
-
|
1500
|
-
The purpose of this License is to make a manual, textbook, or other functional
|
1501
|
-
and useful document "free" in the sense of freedom: to assure everyone the
|
1502
|
-
effective freedom to copy and redistribute it, with or without modifying it,
|
1503
|
-
either commercially or noncommercially. Secondarily, this License preserves for
|
1504
|
-
the author and publisher a way to get credit for their work, while not being
|
1505
|
-
considered responsible for modifications made by others.
|
1506
|
-
|
1507
|
-
This License is a kind of "copyleft", which means that derivative works of the
|
1508
|
-
document must themselves be free in the same sense. It complements the GNU
|
1509
|
-
General Public License, which is a copyleft license designed for free software.
|
1510
|
-
|
1511
|
-
We have designed this License in order to use it for manuals for free software,
|
1512
|
-
because free software needs free documentation: a free program should come with
|
1513
|
-
manuals providing the same freedoms that the software does. But this License is
|
1514
|
-
not limited to software manuals; it can be used for any textual work,
|
1515
|
-
regardless of subject matter or whether it is published as a printed book. We
|
1516
|
-
recommend this License principally for works whose purpose is instruction or
|
1517
|
-
reference.
|
1518
|
-
|
1519
|
-
APPLICABILITY AND DEFINITIONS
|
1520
|
-
|
1521
|
-
This License applies to any manual or other work, in any medium, that contains
|
1522
|
-
a notice placed by the copyright holder saying it can be distributed under the
|
1523
|
-
terms of this License. Such a notice grants a world-wide, royalty-free license,
|
1524
|
-
unlimited in duration, to use that work under the conditions stated herein. The
|
1525
|
-
"Document", below, refers to any such manual or work. Any member of the public
|
1526
|
-
is a licensee, and is addressed as "you". You accept the license if you copy,
|
1527
|
-
modify or distribute the work in a way requiring permission under copyright
|
1528
|
-
law.
|
1529
|
-
|
1530
|
-
A "Modified Version" of the Document means any work containing the Document or
|
1531
|
-
a portion of it, either copied verbatim, or with modifications and/or
|
1532
|
-
translated into another language.
|
1533
|
-
|
1534
|
-
A "Secondary Section" is a named appendix or a front-matter section of the
|
1535
|
-
Document that deals exclusively with the relationship of the publishers or
|
1536
|
-
authors of the Document to the Document's overall subject (or to related
|
1537
|
-
matters) and contains nothing that could fall directly within that overall
|
1538
|
-
subject. (Thus, if the Document is in part a textbook of mathematics, a
|
1539
|
-
Secondary Section may not explain any mathematics.) The relationship could be a
|
1540
|
-
matter of historical connection with the subject or with related matters, or of
|
1541
|
-
legal, commercial, philosophical, ethical or political position regarding them.
|
1542
|
-
|
1543
|
-
The "Invariant Sections" are certain Secondary Sections whose titles are
|
1544
|
-
designated, as being those of Invariant Sections, in the notice that says that
|
1545
|
-
the Document is released under this License. If a section does not fit the
|
1546
|
-
above definition of Secondary then it is not allowed to be designated as
|
1547
|
-
Invariant. The Document may contain zero Invariant Sections. If the Document
|
1548
|
-
does not identify any Invariant Sections then there are none.
|
1549
|
-
|
1550
|
-
The "Cover Texts" are certain short passages of text that are listed, as
|
1551
|
-
Front-Cover Texts or Back-Cover Texts, in the notice that says that the
|
1552
|
-
Document is released under this License. A Front-Cover Text may be at most 5
|
1553
|
-
words, and a Back-Cover Text may be at most 25 words.
|
1554
|
-
|
1555
|
-
A "Transparent" copy of the Document means a machine-readable copy, represented
|
1556
|
-
in a format whose specification is available to the general public, that is
|
1557
|
-
suitable for revising the document straightforwardly with generic text editors
|
1558
|
-
or (for images composed of pixels) generic paint programs or (for drawings)
|
1559
|
-
some widely available drawing editor, and that is suitable for input to text
|
1560
|
-
formatters or for automatic translation to a variety of formats suitable for
|
1561
|
-
input to text formatters. A copy made in an otherwise Transparent file format
|
1562
|
-
whose markup, or absence of markup, has been arranged to thwart or discourage
|
1563
|
-
subsequent modification by readers is not Transparent. An image format is not
|
1564
|
-
Transparent if used for any substantial amount of text. A copy that is not
|
1565
|
-
"Transparent" is called "Opaque".
|
1566
|
-
|
1567
|
-
Examples of suitable formats for Transparent copies include plain ASCII without
|
1568
|
-
markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly
|
1569
|
-
available DTD, and standard-conforming simple HTML, PostScript or PDF designed
|
1570
|
-
for human modification. Examples of transparent image formats include PNG, XCF
|
1571
|
-
and JPG. Opaque formats include proprietary formats that can be read and edited
|
1572
|
-
only by proprietary word processors, SGML or XML for which the DTD and/or
|
1573
|
-
processing tools are not generally available, and the machine-generated HTML,
|
1574
|
-
PostScript or PDF produced by some word processors for output purposes only.
|
1575
|
-
|
1576
|
-
The "Title Page" means, for a printed book, the title page itself, plus such
|
1577
|
-
following pages as are needed to hold, legibly, the material this License
|
1578
|
-
requires to appear in the title page. For works in formats which do not have
|
1579
|
-
any title page as such, "Title Page" means the text near the most prominent
|
1580
|
-
appearance of the work's title, preceding the beginning of the body of the
|
1581
|
-
text.
|
1582
|
-
|
1583
|
-
A section "Entitled XYZ" means a named subunit of the Document whose title
|
1584
|
-
either is precisely XYZ or contains XYZ in parentheses following text that
|
1585
|
-
translates XYZ in another language. (Here XYZ stands for a specific section
|
1586
|
-
name mentioned below, such as "Acknowledgements", "Dedications",
|
1587
|
-
"Endorsements", or "History".) To "Preserve the Title" of such a section when
|
1588
|
-
you modify the Document means that it remains a section "Entitled XYZ"
|
1589
|
-
according to this definition.
|
1590
|
-
|
1591
|
-
The Document may include Warranty Disclaimers next to the notice which states
|
1592
|
-
that this License applies to the Document. These Warranty Disclaimers are
|
1593
|
-
considered to be included by reference in this License, but only as regards
|
1594
|
-
disclaiming warranties: any other implication that these Warranty Disclaimers
|
1595
|
-
may have is void and has no effect on the meaning of this License.
|
1596
|
-
|
1597
|
-
VERBATIM COPYING
|
1598
|
-
|
1599
|
-
You may copy and distribute the Document in any medium, either commercially or
|
1600
|
-
noncommercially, provided that this License, the copyright notices, and the
|
1601
|
-
license notice saying this License applies to the Document are reproduced in
|
1602
|
-
all copies, and that you add no other conditions whatsoever to those of this
|
1603
|
-
License. You may not use technical measures to obstruct or control the reading
|
1604
|
-
or further copying of the copies you make or distribute. However, you may
|
1605
|
-
accept compensation in exchange for copies. If you distribute a large enough
|
1606
|
-
number of copies you must also follow the conditions in section 3.
|
1607
|
-
|
1608
|
-
You may also lend copies, under the same conditions stated above, and you may
|
1609
|
-
publicly display copies.
|
1610
|
-
|
1611
|
-
COPYING IN QUANTITY
|
1612
|
-
|
1613
|
-
If you publish printed copies (or copies in media that commonly have printed
|
1614
|
-
covers) of the Document, numbering more than 100, and the Document's license
|
1615
|
-
notice requires Cover Texts, you must enclose the copies in covers that carry,
|
1616
|
-
clearly and legibly, all these Cover Texts: Front-Cover Texts on the front
|
1617
|
-
cover, and Back-Cover Texts on the back cover. Both covers must also clearly
|
1618
|
-
and legibly identify you as the publisher of these copies. The front cover must
|
1619
|
-
present the full title with all words of the title equally prominent and
|
1620
|
-
visible. You may add other material on the covers in addition. Copying with
|
1621
|
-
changes limited to the covers, as long as they preserve the title of the
|
1622
|
-
Document and satisfy these conditions, can be treated as verbatim copying in
|
1623
|
-
other respects.
|
1624
|
-
|
1625
|
-
If the required texts for either cover are too voluminous to fit legibly, you
|
1626
|
-
should put the first ones listed (as many as fit reasonably) on the actual
|
1627
|
-
cover, and continue the rest onto adjacent pages.
|
1628
|
-
|
1629
|
-
If you publish or distribute Opaque copies of the Document numbering more than
|
1630
|
-
100, you must either include a machine-readable Transparent copy along with
|
1631
|
-
each Opaque copy, or state in or with each Opaque copy a computer-network
|
1632
|
-
location from which the general network-using public has access to download
|
1633
|
-
using public-standard network protocols a complete Transparent copy of the
|
1634
|
-
Document, free of added material. If you use the latter option, you must take
|
1635
|
-
reasonably prudent steps, when you begin distribution of Opaque copies in
|
1636
|
-
quantity, to ensure that this Transparent copy will remain thus accessible at
|
1637
|
-
the stated location until at least one year after the last time you distribute
|
1638
|
-
an Opaque copy (directly or through your agents or retailers) of that edition
|
1639
|
-
to the public.
|
1640
|
-
|
1641
|
-
It is requested, but not required, that you contact the authors of the Document
|
1642
|
-
well before redistributing any large number of copies, to give them a chance to
|
1643
|
-
provide you with an updated version of the Document.
|
1644
|
-
|
1645
|
-
MODIFICATIONS
|
1646
|
-
|
1647
|
-
You may copy and distribute a Modified Version of the Document under the
|
1648
|
-
conditions of sections 2 and 3 above, provided that you release the Modified
|
1649
|
-
Version under precisely this License, with the Modified Version filling the
|
1650
|
-
role of the Document, thus licensing distribution and modification of the
|
1651
|
-
Modified Version to whoever possesses a copy of it. In addition, you must do
|
1652
|
-
these things in the Modified Version:
|
1653
|
-
|
1654
|
-
GNU FDL Modification Conditions
|
1655
|
-
|
1656
|
-
A. Use in the Title Page (and on the covers, if any) a title distinct from
|
1657
|
-
that of the Document, and from those of previous versions (which should, if
|
1658
|
-
there were any, be listed in the History section of the Document). You may
|
1659
|
-
use the same title as a previous version if the original publisher of that
|
1660
|
-
version gives permission.
|
1661
|
-
B. List on the Title Page, as authors, one or more persons or entities
|
1662
|
-
responsible for authorship of the modifications in the Modified Version,
|
1663
|
-
together with at least five of the principal authors of the Document (all
|
1664
|
-
of its principal authors, if it has fewer than five), unless they release
|
1665
|
-
you from this requirement.
|
1666
|
-
C. State on the Title page the name of the publisher of the Modified Version,
|
1667
|
-
as the publisher.
|
1668
|
-
D. Preserve all the copyright notices of the Document.
|
1669
|
-
E. Add an appropriate copyright notice for your modifications adjacent to the
|
1670
|
-
other copyright notices.
|
1671
|
-
F. Include, immediately after the copyright notices, a license notice giving
|
1672
|
-
the public permission to use the Modified Version under the terms of this
|
1673
|
-
License, in the form shown in the Addendum below.
|
1674
|
-
G. Preserve in that license notice the full lists of Invariant Sections and
|
1675
|
-
required Cover Texts given in the Document's license notice.
|
1676
|
-
H. Include an unaltered copy of this License.
|
1677
|
-
I. Preserve the section Entitled "History", Preserve its Title, and add to it
|
1678
|
-
an item stating at least the title, year, new authors, and publisher of the
|
1679
|
-
Modified Version as given on the Title Page. If there is no section
|
1680
|
-
Entitled "History" in the Document, create one stating the title, year,
|
1681
|
-
authors, and publisher of the Document as given on its Title Page, then add
|
1682
|
-
an item describing the Modified Version as stated in the previous sentence.
|
1683
|
-
J. Preserve the network location, if any, given in the Document for public
|
1684
|
-
access to a Transparent copy of the Document, and likewise the network
|
1685
|
-
locations given in the Document for previous versions it was based on.
|
1686
|
-
These may be placed in the "History" section. You may omit a network
|
1687
|
-
location for a work that was published at least four years before the
|
1688
|
-
Document itself, or if the original publisher of the version it refers to
|
1689
|
-
gives permission.
|
1690
|
-
K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the
|
1691
|
-
Title of the section, and preserve in the section all the substance and
|
1692
|
-
tone of each of the contributor acknowledgements and/or dedications given
|
1693
|
-
therein.
|
1694
|
-
L. Preserve all the Invariant Sections of the Document, unaltered in their
|
1695
|
-
text and in their titles. Section numbers or the equivalent are not
|
1696
|
-
considered part of the section titles.
|
1697
|
-
M. Delete any section Entitled "Endorsements". Such a section may not be
|
1698
|
-
included in the Modified Version.
|
1699
|
-
N. Do not retitle any existing section to be Entitled "Endorsements" or to
|
1700
|
-
conflict in title with any Invariant Section.
|
1701
|
-
O. Preserve any Warranty Disclaimers.
|
1702
|
-
|
1703
|
-
If the Modified Version includes new front-matter sections or appendices that
|
1704
|
-
qualify as Secondary Sections and contain no material copied from the Document,
|
1705
|
-
you may at your option designate some or all of these sections as invariant. To
|
1706
|
-
do this, add their titles to the list of Invariant Sections in the Modified
|
1707
|
-
Version's license notice. These titles must be distinct from any other section
|
1708
|
-
titles.
|
1709
|
-
|
1710
|
-
You may add a section Entitled "Endorsements", provided it contains nothing but
|
1711
|
-
endorsements of your Modified Version by various parties--for example,
|
1712
|
-
statements of peer review or that the text has been approved by an organization
|
1713
|
-
as the authoritative definition of a standard.
|
1714
|
-
|
1715
|
-
You may add a passage of up to five words as a Front-Cover Text, and a passage
|
1716
|
-
of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts
|
1717
|
-
in the Modified Version. Only one passage of Front-Cover Text and one of
|
1718
|
-
Back-Cover Text may be added by (or through arrangements made by) any one
|
1719
|
-
entity. If the Document already includes a cover text for the same cover,
|
1720
|
-
previously added by you or by arrangement made by the same entity you are
|
1721
|
-
acting on behalf of, you may not add another; but you may replace the old one,
|
1722
|
-
on explicit permission from the previous publisher that added the old one.
|
1723
|
-
|
1724
|
-
The author(s) and publisher(s) of the Document do not by this License give
|
1725
|
-
permission to use their names for publicity for or to assert or imply
|
1726
|
-
endorsement of any Modified Version.
|
1727
|
-
|
1728
|
-
COMBINING DOCUMENTS
|
1729
|
-
|
1730
|
-
You may combine the Document with other documents released under this License,
|
1731
|
-
under the terms defined in section 4 above for modified versions, provided that
|
1732
|
-
you include in the combination all of the Invariant Sections of all of the
|
1733
|
-
original documents, unmodified, and list them all as Invariant Sections of your
|
1734
|
-
combined work in its license notice, and that you preserve all their Warranty
|
1735
|
-
Disclaimers.
|
1736
|
-
|
1737
|
-
The combined work need only contain one copy of this License, and multiple
|
1738
|
-
identical Invariant Sections may be replaced with a single copy. If there are
|
1739
|
-
multiple Invariant Sections with the same name but different contents, make the
|
1740
|
-
title of each such section unique by adding at the end of it, in parentheses,
|
1741
|
-
the name of the original author or publisher of that section if known, or else
|
1742
|
-
a unique number. Make the same adjustment to the section titles in the list of
|
1743
|
-
Invariant Sections in the license notice of the combined work.
|
1744
|
-
|
1745
|
-
In the combination, you must combine any sections Entitled "History" in the
|
1746
|
-
various original documents, forming one section Entitled "History"; likewise
|
1747
|
-
combine any sections Entitled "Acknowledgements", and any sections Entitled
|
1748
|
-
"Dedications". You must delete all sections Entitled "Endorsements".
|
1749
|
-
|
1750
|
-
COLLECTIONS OF DOCUMENTS
|
1751
|
-
|
1752
|
-
You may make a collection consisting of the Document and other documents
|
1753
|
-
released under this License, and replace the individual copies of this License
|
1754
|
-
in the various documents with a single copy that is included in the collection,
|
1755
|
-
provided that you follow the rules of this License for verbatim copying of each
|
1756
|
-
of the documents in all other respects.
|
1757
|
-
|
1758
|
-
You may extract a single document from such a collection, and distribute it
|
1759
|
-
individually under this License, provided you insert a copy of this License
|
1760
|
-
into the extracted document, and follow this License in all other respects
|
1761
|
-
regarding verbatim copying of that document.
|
1762
|
-
|
1763
|
-
AGGREGATION WITH INDEPENDENT WORKS
|
1764
|
-
|
1765
|
-
A compilation of the Document or its derivatives with other separate and
|
1766
|
-
independent documents or works, in or on a volume of a storage or distribution
|
1767
|
-
medium, is called an "aggregate" if the copyright resulting from the
|
1768
|
-
compilation is not used to limit the legal rights of the compilation's users
|
1769
|
-
beyond what the individual works permit. When the Document is included in an
|
1770
|
-
aggregate, this License does not apply to the other works in the aggregate
|
1771
|
-
which are not themselves derivative works of the Document.
|
1772
|
-
|
1773
|
-
If the Cover Text requirement of section 3 is applicable to these copies of the
|
1774
|
-
Document, then if the Document is less than one half of the entire aggregate,
|
1775
|
-
the Document's Cover Texts may be placed on covers that bracket the Document
|
1776
|
-
within the aggregate, or the electronic equivalent of covers if the Document is
|
1777
|
-
in electronic form. Otherwise they must appear on printed covers that bracket
|
1778
|
-
the whole aggregate.
|
1779
|
-
|
1780
|
-
TRANSLATION
|
1781
|
-
|
1782
|
-
Translation is considered a kind of modification, so you may distribute
|
1783
|
-
translations of the Document under the terms of section 4. Replacing Invariant
|
1784
|
-
Sections with translations requires special permission from their copyright
|
1785
|
-
holders, but you may include translations of some or all Invariant Sections in
|
1786
|
-
addition to the original versions of these Invariant Sections. You may include
|
1787
|
-
a translation of this License, and all the license notices in the Document, and
|
1788
|
-
any Warranty Disclaimers, provided that you also include the original English
|
1789
|
-
version of this License and the original versions of those notices and
|
1790
|
-
disclaimers. In case of a disagreement between the translation and the original
|
1791
|
-
version of this License or a notice or disclaimer, the original version will
|
1792
|
-
prevail.
|
1793
|
-
|
1794
|
-
If a section in the Document is Entitled "Acknowledgements", "Dedications", or
|
1795
|
-
"History", the requirement (section 4) to Preserve its Title (section 1) will
|
1796
|
-
typically require changing the actual title.
|
1797
|
-
|
1798
|
-
TERMINATION
|
1799
|
-
|
1800
|
-
You may not copy, modify, sublicense, or distribute the Document except as
|
1801
|
-
expressly provided for under this License. Any other attempt to copy, modify,
|
1802
|
-
sublicense or distribute the Document is void, and will automatically terminate
|
1803
|
-
your rights under this License. However, parties who have received copies, or
|
1804
|
-
rights, from you under this License will not have their licenses terminated so
|
1805
|
-
long as such parties remain in full compliance.
|
1806
|
-
|
1807
|
-
FUTURE REVISIONS OF THIS LICENSE
|
1808
|
-
|
1809
|
-
The Free Software Foundation may publish new, revised versions of the GNU Free
|
1810
|
-
Documentation License from time to time. Such new versions will be similar in
|
1811
|
-
spirit to the present version, but may differ in detail to address new problems
|
1812
|
-
or concerns. See http://www.gnu.org/copyleft/.
|
1813
|
-
|
1814
|
-
Each version of the License is given a distinguishing version number. If the
|
1815
|
-
Document specifies that a particular numbered version of this License "or any
|
1816
|
-
later version" applies to it, you have the option of following the terms and
|
1817
|
-
conditions either of that specified version or of any later version that has
|
1818
|
-
been published (not as a draft) by the Free Software Foundation. If the
|
1819
|
-
Document does not specify a version number of this License, you may choose any
|
1820
|
-
version ever published (not as a draft) by the Free Software Foundation.
|
1821
|
-
|
1822
|
-
ADDENDUM: How to use this License for your documents
|
1823
|
-
|
1824
|
-
To use this License in a document you have written, include a copy of the
|
1825
|
-
License in the document and put the following copyright and license notices
|
1826
|
-
just after the title page:
|
1827
|
-
|
1828
|
-
Sample Invariant Sections list
|
1829
|
-
|
1830
|
-
Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and
|
1831
|
-
/or modify this document under the terms of the GNU Free Documentation
|
1832
|
-
License, Version 1.2 or any later version published by the Free Software
|
1833
|
-
Foundation; with no Invariant Sections, no Front-Cover Texts, and no
|
1834
|
-
Back-Cover Texts. A copy of the license is included in the section entitled
|
1835
|
-
"GNU Free Documentation License".
|
1836
|
-
|
1837
|
-
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace
|
1838
|
-
the "with...Texts." line with this:
|
1839
|
-
|
1840
|
-
Sample Invariant Sections list
|
1841
|
-
|
1842
|
-
with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover
|
1843
|
-
Texts being LIST, and with the Back-Cover Texts being LIST.
|
1844
|
-
|
1845
|
-
If you have Invariant Sections without Cover Texts, or some other combination
|
1846
|
-
of the three, merge those two alternatives to suit the situation.
|
1847
|
-
|
1848
|
-
If your document contains nontrivial examples of program code, we recommend
|
1849
|
-
releasing these examples in parallel under your choice of free software
|
1850
|
-
license, such as the GNU General Public License, to permit their use in free
|
1851
|
-
software.
|
1852
|
-
|