ruby-vpi 11.1.0 → 11.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
-
|