ruby-vpi 9.0.0 → 10.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +120 -56
- data/MEMO +8 -0
- data/README +1 -1
- data/Rakefile +2 -2
- data/bin/generate_test.rb +11 -12
- data/bin/generate_test_tpl/bench.rb +2 -2
- data/bin/generate_test_tpl/bench.v +1 -4
- data/bin/generate_test_tpl/design.rb +6 -20
- data/bin/generate_test_tpl/proto.rb +5 -3
- data/bin/generate_test_tpl/runner.rake +2 -1
- data/bin/generate_test_tpl/spec.rb +5 -12
- data/doc/background.organization.html +1 -1
- data/doc/background.running-tests.html +1 -1
- data/doc/index.html +2 -2
- data/doc/manual.txt +276 -223
- data/doc/problem.ivl.html +3 -3
- data/doc/problems.html +1 -1
- data/doc/problems.ruby.html +1 -1
- data/doc/problems.vsim.html +1 -1
- data/doc/setup.html +3 -0
- data/doc/setup.installation.html +9 -0
- data/doc/setup.maintenance.html +3 -0
- data/doc/setup.reqs.html +3 -0
- data/doc/src/manual.xml +232 -195
- data/doc/styles/manual.css +8 -0
- data/doc/usage.examples.html +1 -1
- data/doc/usage.html +1 -1
- data/doc/usage.tools.html +7 -1
- data/doc/usage.tutorial.html +50 -56
- data/history.html +195 -77
- data/history.part.html +195 -77
- data/lib/ruby-vpi/vpi.rb +13 -1
- data/lib/ruby-vpi.rb +18 -7
- data/memo.html +19 -0
- data/memo.part.html +19 -0
- data/readme.html +1 -1
- data/readme.part.html +1 -1
- data/samp/counter/counter_rspec_bench.rb +2 -2
- data/samp/counter/counter_rspec_bench.v +1 -4
- data/samp/counter/counter_rspec_design.rb +4 -18
- data/samp/counter/counter_rspec_proto.rb +7 -5
- data/samp/counter/counter_rspec_runner.rake +2 -1
- data/samp/counter/counter_rspec_spec.rb +8 -12
- data/samp/counter/counter_xunit_bench.rb +2 -2
- data/samp/counter/counter_xunit_bench.v +1 -4
- data/samp/counter/counter_xunit_design.rb +4 -18
- data/samp/counter/counter_xunit_proto.rb +7 -5
- data/samp/counter/counter_xunit_runner.rake +2 -1
- data/samp/counter/counter_xunit_spec.rb +8 -14
- data/samp/pipelined_alu/hw5_unit_test_bench.rb +3 -3
- data/samp/pipelined_alu/hw5_unit_test_bench.v +1 -4
- data/samp/pipelined_alu/hw5_unit_test_design.rb +49 -65
- data/samp/pipelined_alu/hw5_unit_test_proto.rb +9 -5
- data/samp/pipelined_alu/hw5_unit_test_runner.rake +2 -1
- data/samp/pipelined_alu/hw5_unit_test_spec.rb +18 -21
- metadata +8 -242
- data/doc/usage.installation.html +0 -9
- data/doc/usage.recommendations.html +0 -3
- data/doc/usage.requirements.html +0 -3
- data/ref/c/annotated.html +0 -35
- data/ref/c/common_8h.html +0 -146
- data/ref/c/doxygen.css +0 -358
- data/ref/c/doxygen.png +0 -0
- data/ref/c/files.html +0 -34
- data/ref/c/functions.html +0 -134
- data/ref/c/functions_vars.html +0 -134
- data/ref/c/globals.html +0 -55
- data/ref/c/globals_0x63.html +0 -86
- data/ref/c/globals_0x65.html +0 -55
- data/ref/c/globals_0x66.html +0 -55
- data/ref/c/globals_0x70.html +0 -71
- data/ref/c/globals_0x72.html +0 -62
- data/ref/c/globals_0x73.html +0 -65
- data/ref/c/globals_0x74.html +0 -55
- data/ref/c/globals_0x76.html +0 -472
- data/ref/c/globals_0x78.html +0 -55
- data/ref/c/globals_defs.html +0 -81
- data/ref/c/globals_defs_0x65.html +0 -50
- data/ref/c/globals_defs_0x70.html +0 -51
- data/ref/c/globals_defs_0x76.html +0 -463
- data/ref/c/globals_defs_0x78.html +0 -50
- data/ref/c/globals_enum.html +0 -39
- data/ref/c/globals_eval.html +0 -40
- data/ref/c/globals_func.html +0 -49
- data/ref/c/globals_type.html +0 -63
- data/ref/c/globals_vars.html +0 -42
- data/ref/c/index.html +0 -20
- data/ref/c/relay_8c.html +0 -214
- data/ref/c/relay_8h.html +0 -129
- data/ref/c/structrelay____RubyOptions____def.html +0 -67
- data/ref/c/structt__cb__data.html +0 -151
- data/ref/c/structt__vpi__delay.html +0 -134
- data/ref/c/structt__vpi__error__info.html +0 -151
- data/ref/c/structt__vpi__strengthval.html +0 -83
- data/ref/c/structt__vpi__systf__data.html +0 -151
- data/ref/c/structt__vpi__time.html +0 -100
- data/ref/c/structt__vpi__value.html +0 -204
- data/ref/c/structt__vpi__vecval.html +0 -66
- data/ref/c/structt__vpi__vlog__info.html +0 -100
- data/ref/c/swig_8c.html +0 -80
- data/ref/c/swig_8h.html +0 -83
- data/ref/c/tab_b.gif +0 -0
- data/ref/c/tab_l.gif +0 -0
- data/ref/c/tab_r.gif +0 -0
- data/ref/c/tabs.css +0 -102
- data/ref/c/verilog_8h.html +0 -117
- data/ref/c/vlog_8c.html +0 -168
- data/ref/c/vlog_8h.html +0 -128
- data/ref/c/vpi__user_8h.html +0 -8739
- data/ref/ruby/classes/ERB.html +0 -158
- data/ref/ruby/classes/ERB.src/M000034.html +0 -29
- data/ref/ruby/classes/FileUtils.html +0 -165
- data/ref/ruby/classes/FileUtils.src/M000089.html +0 -18
- data/ref/ruby/classes/FileUtils.src/M000090.html +0 -18
- data/ref/ruby/classes/Integer.html +0 -398
- data/ref/ruby/classes/Integer.src/M000012.html +0 -25
- data/ref/ruby/classes/Integer.src/M000013.html +0 -18
- data/ref/ruby/classes/Integer.src/M000014.html +0 -18
- data/ref/ruby/classes/Integer.src/M000015.html +0 -18
- data/ref/ruby/classes/Integer.src/M000016.html +0 -18
- data/ref/ruby/classes/Integer.src/M000017.html +0 -18
- data/ref/ruby/classes/Integer.src/M000020.html +0 -22
- data/ref/ruby/classes/Integer.src/M000021.html +0 -22
- data/ref/ruby/classes/Integer.src/M000022.html +0 -25
- data/ref/ruby/classes/Integer.src/M000023.html +0 -31
- data/ref/ruby/classes/Integer.src/M000024.html +0 -25
- data/ref/ruby/classes/Integer.src/M000025.html +0 -30
- data/ref/ruby/classes/OutputInfo.html +0 -299
- data/ref/ruby/classes/OutputInfo.src/M000030.html +0 -51
- data/ref/ruby/classes/RDoc.html +0 -135
- data/ref/ruby/classes/RDoc.src/M000093.html +0 -40
- data/ref/ruby/classes/RubyVpi/Config.html +0 -148
- data/ref/ruby/classes/RubyVpi.html +0 -186
- data/ref/ruby/classes/RubyVpi.src/M000091.html +0 -50
- data/ref/ruby/classes/RubyVpi.src/M000092.html +0 -20
- data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.html +0 -407
- data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000081.html +0 -18
- data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000082.html +0 -18
- data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000083.html +0 -22
- data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000084.html +0 -44
- data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000085.html +0 -82
- data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000086.html +0 -127
- data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000087.html +0 -26
- data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000088.html +0 -18
- data/ref/ruby/classes/SWIG.html +0 -111
- data/ref/ruby/classes/String.html +0 -158
- data/ref/ruby/classes/String.src/M000032.html +0 -41
- data/ref/ruby/classes/String.src/M000033.html +0 -18
- data/ref/ruby/classes/Table.html +0 -191
- data/ref/ruby/classes/Table.src/M000026.html +0 -38
- data/ref/ruby/classes/Table.src/M000027.html +0 -18
- data/ref/ruby/classes/Table.src/M000028.html +0 -18
- data/ref/ruby/classes/Table.src/M000029.html +0 -18
- data/ref/ruby/classes/Template.html +0 -158
- data/ref/ruby/classes/Template.src/M000031.html +0 -18
- data/ref/ruby/classes/VerilogParser/Module/Parameter.html +0 -160
- data/ref/ruby/classes/VerilogParser/Module/Parameter.src/M000011.html +0 -21
- data/ref/ruby/classes/VerilogParser/Module/Port.html +0 -207
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000007.html +0 -21
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000008.html +0 -18
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000009.html +0 -18
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000010.html +0 -18
- data/ref/ruby/classes/VerilogParser/Module.html +0 -172
- data/ref/ruby/classes/VerilogParser/Module.src/M000006.html +0 -29
- data/ref/ruby/classes/VerilogParser.html +0 -187
- data/ref/ruby/classes/VerilogParser.src/M000005.html +0 -34
- data/ref/ruby/classes/XX/Document.html +0 -295
- 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/Document.src/M000074.html +0 -20
- data/ref/ruby/classes/XX/Document.src/M000075.html +0 -20
- data/ref/ruby/classes/XX/Document.src/M000076.html +0 -22
- data/ref/ruby/classes/XX/Document.src/M000077.html +0 -21
- data/ref/ruby/classes/XX/Document.src/M000078.html +0 -21
- data/ref/ruby/classes/XX/Document.src/M000079.html +0 -34
- data/ref/ruby/classes/XX/Document.src/M000080.html +0 -98
- data/ref/ruby/classes/XX/HTML4/Strict.html +0 -138
- data/ref/ruby/classes/XX/HTML4/Strict.src/M000038.html +0 -20
- data/ref/ruby/classes/XX/HTML4/Transitional.html +0 -138
- data/ref/ruby/classes/XX/HTML4/Transitional.src/M000037.html +0 -20
- data/ref/ruby/classes/XX/HTML4.html +0 -145
- data/ref/ruby/classes/XX/HTML4.src/M000036.html +0 -20
- data/ref/ruby/classes/XX/Markup/ClassMethods.html +0 -236
- 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/ClassMethods.src/M000046.html +0 -25
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000047.html +0 -20
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000048.html +0 -27
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000049.html +0 -20
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000050.html +0 -27
- data/ref/ruby/classes/XX/Markup/ClassMethods.src/M000051.html +0 -22
- data/ref/ruby/classes/XX/Markup/Error.html +0 -111
- data/ref/ruby/classes/XX/Markup/InstanceMethods.html +0 -474
- 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/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000054.html +0 -31
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000055.html +0 -48
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000056.html +0 -20
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000057.html +0 -31
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000058.html +0 -32
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000059.html +0 -32
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000060.html +0 -28
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000061.html +0 -23
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000062.html +0 -26
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000063.html +0 -20
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000064.html +0 -20
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000065.html +0 -20
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000066.html +0 -20
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000067.html +0 -20
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000068.html +0 -21
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000069.html +0 -20
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000070.html +0 -20
- data/ref/ruby/classes/XX/Markup/InstanceMethods.src/M000071.html +0 -20
- data/ref/ruby/classes/XX/Markup.html +0 -160
- data/ref/ruby/classes/XX/Markup.src/M000043.html +0 -28
- data/ref/ruby/classes/XX/XHTML/Strict.html +0 -138
- data/ref/ruby/classes/XX/XHTML/Strict.src/M000041.html +0 -20
- data/ref/ruby/classes/XX/XHTML/Transitional.html +0 -138
- data/ref/ruby/classes/XX/XHTML/Transitional.src/M000040.html +0 -20
- data/ref/ruby/classes/XX/XHTML.html +0 -145
- data/ref/ruby/classes/XX/XHTML.src/M000039.html +0 -36
- data/ref/ruby/classes/XX/XML.html +0 -138
- data/ref/ruby/classes/XX/XML.src/M000035.html +0 -20
- data/ref/ruby/classes/XX/XMLish.html +0 -138
- data/ref/ruby/classes/XX/XMLish.src/M000042.html +0 -18
- data/ref/ruby/classes/XX.html +0 -138
- data/ref/ruby/created.rid +0 -1
- data/ref/ruby/files/bin/generate_test_rb.html +0 -245
- data/ref/ruby/files/bin/generate_test_rb.src/M000001.html +0 -18
- data/ref/ruby/files/bin/generate_test_rb.src/M000002.html +0 -39
- data/ref/ruby/files/bin/header_to_ruby_rb.html +0 -125
- data/ref/ruby/files/lib/ruby-vpi/erb_rb.html +0 -108
- data/ref/ruby/files/lib/ruby-vpi/integer_rb.html +0 -101
- data/ref/ruby/files/lib/ruby-vpi/rake_rb.html +0 -108
- data/ref/ruby/files/lib/ruby-vpi/rcov_rb.html +0 -111
- data/ref/ruby/files/lib/ruby-vpi/rdoc_rb.html +0 -108
- data/ref/ruby/files/lib/ruby-vpi/rspec_rb.html +0 -115
- data/ref/ruby/files/lib/ruby-vpi/runner_proxy_rb.html +0 -108
- data/ref/ruby/files/lib/ruby-vpi/runner_rb.html +0 -208
- data/ref/ruby/files/lib/ruby-vpi/runner_rb.src/M000003.html +0 -24
- data/ref/ruby/files/lib/ruby-vpi/runner_rb.src/M000004.html +0 -26
- data/ref/ruby/files/lib/ruby-vpi/verilog_parser_rb.html +0 -107
- data/ref/ruby/files/lib/ruby-vpi/vpi_rb.html +0 -108
- data/ref/ruby/files/lib/ruby-vpi/xx_rb.html +0 -148
- data/ref/ruby/files/lib/ruby-vpi_rb.html +0 -109
- data/ref/ruby/fr_class_index.html +0 -56
- data/ref/ruby/fr_file_index.html +0 -40
- data/ref/ruby/fr_method_index.html +0 -119
- data/ref/ruby/index.html +0 -24
- data/ref/ruby/rdoc-style.css +0 -208
data/memo.html
CHANGED
@@ -104,6 +104,11 @@ Ask for help, give feedback, or discuss.</p>
|
|
104
104
|
<h1>Pending tasks</h1>
|
105
105
|
|
106
106
|
|
107
|
+
<ul>
|
108
|
+
<li>interactive console <span class="caps">IRB</span> wrapper for spec (just like Breakpoints in Rails)</li>
|
109
|
+
</ul>
|
110
|
+
|
111
|
+
|
107
112
|
<ul>
|
108
113
|
<li>add support for reading & writing vpi_delay values</li>
|
109
114
|
</ul>
|
@@ -125,6 +130,15 @@ Ask for help, give feedback, or discuss.</p>
|
|
125
130
|
</ul>
|
126
131
|
|
127
132
|
|
133
|
+
<ul>
|
134
|
+
<li>need to dump signal values when expectation fails in rSpec
|
135
|
+
<ul>
|
136
|
+
<li>maybe a waveform dump will also help</li>
|
137
|
+
<li>this will help in debugging the problem</li>
|
138
|
+
</ul></li>
|
139
|
+
</ul>
|
140
|
+
|
141
|
+
|
128
142
|
<h1>Finished tasks</h1>
|
129
143
|
|
130
144
|
|
@@ -170,6 +184,11 @@ Ask for help, give feedback, or discuss.</p>
|
|
170
184
|
</ul>
|
171
185
|
|
172
186
|
|
187
|
+
<ul>
|
188
|
+
<li>method_missing for Design class</li>
|
189
|
+
</ul>
|
190
|
+
|
191
|
+
|
173
192
|
<h1>Obsolete tasks</h1>
|
174
193
|
|
175
194
|
|
data/memo.part.html
CHANGED
@@ -9,6 +9,11 @@
|
|
9
9
|
<h1>Pending tasks</h1>
|
10
10
|
|
11
11
|
|
12
|
+
<ul>
|
13
|
+
<li>interactive console <span class="caps">IRB</span> wrapper for spec (just like Breakpoints in Rails)</li>
|
14
|
+
</ul>
|
15
|
+
|
16
|
+
|
12
17
|
<ul>
|
13
18
|
<li>add support for reading & writing vpi_delay values</li>
|
14
19
|
</ul>
|
@@ -30,6 +35,15 @@
|
|
30
35
|
</ul>
|
31
36
|
|
32
37
|
|
38
|
+
<ul>
|
39
|
+
<li>need to dump signal values when expectation fails in rSpec
|
40
|
+
<ul>
|
41
|
+
<li>maybe a waveform dump will also help</li>
|
42
|
+
<li>this will help in debugging the problem</li>
|
43
|
+
</ul></li>
|
44
|
+
</ul>
|
45
|
+
|
46
|
+
|
33
47
|
<h1>Finished tasks</h1>
|
34
48
|
|
35
49
|
|
@@ -75,6 +89,11 @@
|
|
75
89
|
</ul>
|
76
90
|
|
77
91
|
|
92
|
+
<ul>
|
93
|
+
<li>method_missing for Design class</li>
|
94
|
+
</ul>
|
95
|
+
|
96
|
+
|
78
97
|
<h1>Obsolete tasks</h1>
|
79
98
|
|
80
99
|
|
data/readme.html
CHANGED
@@ -105,7 +105,7 @@ Ask for help, give feedback, or discuss.</p>
|
|
105
105
|
<ul>
|
106
106
|
<li>Prototype and verify designs <em>quickly</em> using <a href="http://behaviour-driven.org/" title="behavior-driven development"><span class="caps">BDD</span></a>, <a href="http://www.agiledata.org/essays/tdd.html" title="test-driven development"><span class="caps">TDD</span></a>, and more.</li>
|
107
107
|
<li>Reuse the <em>same</em> specification to verify both prototype and design.</li>
|
108
|
-
<li>Specifications are executable <em>and</em> human-readable. (See this <a href="./doc/usage.tutorial.html#fig..
|
108
|
+
<li>Specifications are executable <em>and</em> human-readable. (See this <a href="./doc/usage.tutorial.html#fig..counter_rspec_spec.rb">example specification</a> and its <a href="./doc/usage.tutorial.html#fig..test-proto.rspec">boss-friendly output</a>.)</li>
|
109
109
|
</ul>
|
110
110
|
|
111
111
|
|
data/readme.part.html
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
<ul>
|
11
11
|
<li>Prototype and verify designs <em>quickly</em> using <a href="http://behaviour-driven.org/" title="behavior-driven development"><span class="caps">BDD</span></a>, <a href="http://www.agiledata.org/essays/tdd.html" title="test-driven development"><span class="caps">TDD</span></a>, and more.</li>
|
12
12
|
<li>Reuse the <em>same</em> specification to verify both prototype and design.</li>
|
13
|
-
<li>Specifications are executable <em>and</em> human-readable. (See this <a href="./doc/usage.tutorial.html#fig..
|
13
|
+
<li>Specifications are executable <em>and</em> human-readable. (See this <a href="./doc/usage.tutorial.html#fig..counter_rspec_spec.rb">example specification</a> and its <a href="./doc/usage.tutorial.html#fig..test-proto.rspec">boss-friendly output</a>.)</li>
|
14
14
|
</ul>
|
15
15
|
|
16
16
|
|
@@ -1,9 +1,9 @@
|
|
1
|
-
|
1
|
+
# This file is the Ruby side of the bench.
|
2
2
|
|
3
3
|
require 'ruby-vpi'
|
4
4
|
require 'ruby-vpi/rspec'
|
5
5
|
|
6
|
-
RubyVpi.init_bench 'counter_rspec', :
|
6
|
+
RubyVpi.init_bench 'counter_rspec', :Counter
|
7
7
|
|
8
8
|
# service the $ruby_relay callback
|
9
9
|
# The rSpec library will take control henceforth.
|
@@ -1,22 +1,8 @@
|
|
1
|
-
#
|
2
|
-
class Counter
|
3
|
-
include Vpi
|
4
|
-
|
5
|
-
Size = 5
|
6
|
-
|
7
|
-
attr_reader :clock, :reset, :count
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@clock = vpi_handle_by_name("counter_rspec_bench.clock", nil)
|
11
|
-
@reset = vpi_handle_by_name("counter_rspec_bench.reset", nil)
|
12
|
-
@count = vpi_handle_by_name("counter_rspec_bench.count", nil)
|
13
|
-
end
|
14
|
-
|
1
|
+
# This is a Ruby interface to the design under test.
|
2
|
+
class << Counter
|
15
3
|
def reset!
|
16
|
-
|
17
|
-
|
18
|
-
@reset.intVal = 1
|
4
|
+
reset.intVal = 1
|
19
5
|
relay_verilog
|
20
|
-
|
6
|
+
reset.intVal = 0
|
21
7
|
end
|
22
8
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
-
#
|
2
|
-
class
|
1
|
+
# This is a prototype of the design under test.
|
2
|
+
class << Counter
|
3
|
+
# When prototyping is enabled, this method is invoked
|
4
|
+
# instead of Vpi::relay_verilog to simulate the design.
|
3
5
|
def simulate!
|
4
|
-
if
|
5
|
-
|
6
|
+
if reset.intVal == 1
|
7
|
+
count.intVal = 0
|
6
8
|
else
|
7
|
-
|
9
|
+
count.intVal += 1
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -1,26 +1,23 @@
|
|
1
|
-
|
1
|
+
# This file is a behavioral specification for the design under test.
|
2
2
|
|
3
3
|
# lowest upper bound of counter's value
|
4
|
-
LIMIT = 2 ** Counter
|
4
|
+
LIMIT = 2 ** Counter.Size.intVal
|
5
5
|
|
6
6
|
# maximum allowed value for a counter
|
7
7
|
MAX = LIMIT - 1
|
8
8
|
|
9
|
-
include Vpi
|
10
|
-
|
11
9
|
context "A resetted counter's value" do
|
12
10
|
setup do
|
13
|
-
|
14
|
-
@design.reset!
|
11
|
+
Counter.reset!
|
15
12
|
end
|
16
13
|
|
17
14
|
specify "should be zero" do
|
18
|
-
|
15
|
+
Counter.count.intVal.should_equal 0
|
19
16
|
end
|
20
17
|
|
21
18
|
specify "should increment by one count upon each rising clock edge" do
|
22
19
|
LIMIT.times do |i|
|
23
|
-
|
20
|
+
Counter.count.intVal.should_equal i
|
24
21
|
|
25
22
|
# advance the clock
|
26
23
|
relay_verilog
|
@@ -30,18 +27,17 @@ end
|
|
30
27
|
|
31
28
|
context "A counter with the maximum value" do
|
32
29
|
setup do
|
33
|
-
|
34
|
-
@design.reset!
|
30
|
+
Counter.reset!
|
35
31
|
|
36
32
|
# increment the counter to maximum value
|
37
33
|
MAX.times do relay_verilog end
|
38
|
-
|
34
|
+
Counter.count.intVal.should_equal MAX
|
39
35
|
end
|
40
36
|
|
41
37
|
specify "should overflow upon increment" do
|
42
38
|
# increment the counter
|
43
39
|
relay_verilog
|
44
40
|
|
45
|
-
|
41
|
+
Counter.count.intVal.should_equal 0
|
46
42
|
end
|
47
43
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
|
1
|
+
# This file is the Ruby side of the bench.
|
2
2
|
|
3
3
|
require 'ruby-vpi'
|
4
4
|
require 'test/unit'
|
5
5
|
|
6
|
-
RubyVpi.init_bench 'counter_xunit', :
|
6
|
+
RubyVpi.init_bench 'counter_xunit', :Counter
|
7
7
|
|
8
8
|
# service the $ruby_relay callback
|
9
9
|
# The xUnit library will take control henceforth.
|
@@ -1,22 +1,8 @@
|
|
1
|
-
#
|
2
|
-
class Counter
|
3
|
-
include Vpi
|
4
|
-
|
5
|
-
Size = 5
|
6
|
-
|
7
|
-
attr_reader :clock, :reset, :count
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@clock = vpi_handle_by_name("counter_xunit_bench.clock", nil)
|
11
|
-
@reset = vpi_handle_by_name("counter_xunit_bench.reset", nil)
|
12
|
-
@count = vpi_handle_by_name("counter_xunit_bench.count", nil)
|
13
|
-
end
|
14
|
-
|
1
|
+
# This is a Ruby interface to the design under test.
|
2
|
+
class << Counter
|
15
3
|
def reset!
|
16
|
-
|
17
|
-
|
18
|
-
@reset.intVal = 1
|
4
|
+
reset.intVal = 1
|
19
5
|
relay_verilog
|
20
|
-
|
6
|
+
reset.intVal = 0
|
21
7
|
end
|
22
8
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
-
#
|
2
|
-
class
|
1
|
+
# This is a prototype of the design under test.
|
2
|
+
class << Counter
|
3
|
+
# When prototyping is enabled, this method is invoked
|
4
|
+
# instead of Vpi::relay_verilog to simulate the design.
|
3
5
|
def simulate!
|
4
|
-
if
|
5
|
-
|
6
|
+
if reset.intVal == 1
|
7
|
+
count.intVal = 0
|
6
8
|
else
|
7
|
-
|
9
|
+
count.intVal += 1
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -1,26 +1,23 @@
|
|
1
|
-
|
1
|
+
# This file is a behavioral specification for the design under test.
|
2
2
|
|
3
3
|
# lowest upper bound of counter's value
|
4
|
-
LIMIT = 2 ** Counter
|
4
|
+
LIMIT = 2 ** Counter.Size.intVal
|
5
5
|
|
6
6
|
# maximum allowed value for a counter
|
7
7
|
MAX = LIMIT - 1
|
8
8
|
|
9
9
|
class ResettedCounterValue < Test::Unit::TestCase
|
10
|
-
include Vpi
|
11
|
-
|
12
10
|
def setup
|
13
|
-
|
14
|
-
@design.reset!
|
11
|
+
Counter.reset!
|
15
12
|
end
|
16
13
|
|
17
14
|
def test_zero
|
18
|
-
assert_equal 0,
|
15
|
+
assert_equal 0, Counter.count.intVal
|
19
16
|
end
|
20
17
|
|
21
18
|
def test_increment
|
22
19
|
LIMIT.times do |i|
|
23
|
-
assert_equal i,
|
20
|
+
assert_equal i, Counter.count.intVal
|
24
21
|
|
25
22
|
# advance the clock
|
26
23
|
relay_verilog
|
@@ -29,21 +26,18 @@ class ResettedCounterValue < Test::Unit::TestCase
|
|
29
26
|
end
|
30
27
|
|
31
28
|
class MaximumCounterValue < Test::Unit::TestCase
|
32
|
-
include Vpi
|
33
|
-
|
34
29
|
def setup
|
35
|
-
|
36
|
-
@design.reset!
|
30
|
+
Counter.reset!
|
37
31
|
|
38
32
|
# increment the counter to maximum value
|
39
33
|
MAX.times do relay_verilog end
|
40
|
-
assert_equal MAX,
|
34
|
+
assert_equal MAX, Counter.count.intVal
|
41
35
|
end
|
42
36
|
|
43
37
|
def test_overflow
|
44
38
|
# increment the counter
|
45
39
|
relay_verilog
|
46
40
|
|
47
|
-
assert_equal 0,
|
41
|
+
assert_equal 0, Counter.count.intVal
|
48
42
|
end
|
49
43
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
|
1
|
+
# This file is the Ruby side of the bench.
|
2
2
|
|
3
3
|
require 'ruby-vpi'
|
4
4
|
require 'test/unit'
|
5
5
|
|
6
|
-
RubyVpi.init_bench 'hw5_unit_test', :
|
6
|
+
RubyVpi.init_bench 'hw5_unit_test', :Hw5_unit
|
7
7
|
|
8
8
|
# service the $ruby_relay callback
|
9
|
-
# The
|
9
|
+
# The xUnit library will take control henceforth.
|
@@ -1,88 +1,72 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
OPERATIONS = constants.grep(/^OP_/).map {|s| const_get s}
|
14
|
-
|
15
|
-
# Number of cycles needed to reset this design.
|
16
|
-
RESET_DELAY = 5
|
17
|
-
|
18
|
-
attr_reader :clk, :reset, :in_databits, :a, :b, :in_op, :res, :out_databits, :out_op
|
19
|
-
|
20
|
-
def initialize
|
21
|
-
@clk = vpi_handle_by_name("hw5_unit_test_bench.clk", nil)
|
22
|
-
@reset = vpi_handle_by_name("hw5_unit_test_bench.reset", nil)
|
23
|
-
@in_databits = vpi_handle_by_name("hw5_unit_test_bench.in_databits", nil)
|
24
|
-
@a = vpi_handle_by_name("hw5_unit_test_bench.a", nil)
|
25
|
-
@b = vpi_handle_by_name("hw5_unit_test_bench.b", nil)
|
26
|
-
@in_op = vpi_handle_by_name("hw5_unit_test_bench.in_op", nil)
|
27
|
-
@res = vpi_handle_by_name("hw5_unit_test_bench.res", nil)
|
28
|
-
@out_databits = vpi_handle_by_name("hw5_unit_test_bench.out_databits", nil)
|
29
|
-
@out_op = vpi_handle_by_name("hw5_unit_test_bench.out_op", nil)
|
30
|
-
end
|
1
|
+
# This is a Ruby interface to the design under test.
|
2
|
+
|
3
|
+
WIDTH = 32
|
4
|
+
DATABITS = 7
|
5
|
+
OP_NOP = 0
|
6
|
+
OP_ADD = 1
|
7
|
+
OP_SUB = 2
|
8
|
+
OP_MULT = 3
|
9
|
+
OPERATIONS = (OP_NOP..OP_MULT).to_a
|
10
|
+
|
11
|
+
# Number of cycles needed to reset this design.
|
12
|
+
RESET_DELAY = 5
|
31
13
|
|
14
|
+
class << Hw5_unit
|
32
15
|
def reset!
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
16
|
+
reset.hexStrVal = 'x'
|
17
|
+
in_databits.hexStrVal = 'x'
|
18
|
+
a.hexStrVal = 'x'
|
19
|
+
b.hexStrVal = 'x'
|
20
|
+
in_op.hexStrVal = 'x'
|
38
21
|
|
39
22
|
|
40
|
-
|
23
|
+
reset.intVal = 1
|
41
24
|
|
42
25
|
RESET_DELAY.times do
|
43
26
|
relay_verilog
|
44
27
|
end
|
45
28
|
|
46
|
-
|
29
|
+
reset.intVal = 0
|
47
30
|
end
|
31
|
+
end
|
48
32
|
|
49
|
-
# Represents an ALU operation.
|
50
|
-
class Operation
|
51
|
-
attr_accessor :type, :tag, :arg1, :arg2, :stage, :result
|
52
33
|
|
53
|
-
|
54
|
-
|
34
|
+
# Represents an ALU operation.
|
35
|
+
class Operation
|
36
|
+
attr_accessor :type, :tag, :arg1, :arg2, :stage, :result
|
55
37
|
|
56
|
-
|
57
|
-
|
58
|
-
@arg1 = arg1
|
59
|
-
@arg2 = arg2
|
38
|
+
def initialize(type, tag, arg1 = 0, arg2 = 0)
|
39
|
+
raise ArgumentError unless OPERATIONS.include? type
|
60
40
|
|
61
|
-
|
62
|
-
|
41
|
+
@type = type
|
42
|
+
@tag = tag
|
43
|
+
@arg1 = arg1
|
44
|
+
@arg2 = arg2
|
63
45
|
|
64
|
-
|
65
|
-
|
66
|
-
case @type
|
67
|
-
when OP_ADD
|
68
|
-
@arg1 + @arg2
|
46
|
+
@stage = 0
|
47
|
+
end
|
69
48
|
|
70
|
-
|
71
|
-
|
49
|
+
# Computes the result of this operation.
|
50
|
+
def compute
|
51
|
+
case @type
|
52
|
+
when OP_ADD
|
53
|
+
@arg1 + @arg2
|
72
54
|
|
73
|
-
|
74
|
-
|
55
|
+
when OP_SUB
|
56
|
+
@arg1 - @arg2
|
75
57
|
|
76
|
-
|
77
|
-
|
58
|
+
when OP_MULT
|
59
|
+
@arg1 * @arg2
|
78
60
|
|
79
|
-
|
80
|
-
|
81
|
-
end
|
82
|
-
end
|
61
|
+
when OP_NOP
|
62
|
+
nil
|
83
63
|
|
84
|
-
|
85
|
-
|
64
|
+
else
|
65
|
+
raise
|
86
66
|
end
|
87
67
|
end
|
68
|
+
|
69
|
+
def compute!
|
70
|
+
@result = compute
|
71
|
+
end
|
88
72
|
end
|
@@ -1,10 +1,14 @@
|
|
1
|
-
#
|
2
|
-
class
|
1
|
+
# This is a prototype of the design under test.
|
2
|
+
class << Hw5_unit
|
3
|
+
# When prototyping is enabled, this method is invoked
|
4
|
+
# instead of Vpi::relay_verilog to simulate the design.
|
3
5
|
def simulate!
|
6
|
+
raise NotImplementedError, "Prototype is not yet implemented."
|
7
|
+
|
4
8
|
# discard old outputs
|
5
|
-
|
6
|
-
|
7
|
-
|
9
|
+
res.hexStrVal = 'x'
|
10
|
+
out_databits.hexStrVal = 'x'
|
11
|
+
out_op.hexStrVal = 'x'
|
8
12
|
|
9
13
|
# process new inputs
|
10
14
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
## This specification verifies the design under test.
|
2
1
|
=begin
|
3
2
|
Copyright 2006 Suraj N. Kurapati
|
4
3
|
|
@@ -19,25 +18,23 @@
|
|
19
18
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
20
19
|
=end
|
21
20
|
|
21
|
+
# This file is a behavioral specification for the design under test.
|
22
|
+
|
22
23
|
require 'InputGenerator'
|
23
24
|
|
24
25
|
class Hw5_unit_test_spec < Test::Unit::TestCase
|
25
|
-
include Vpi
|
26
|
-
|
27
26
|
# Number of input sequences to test.
|
28
27
|
NUM_TESTS = 4000
|
29
28
|
|
30
29
|
# Bitmask capable of capturing ALU result.
|
31
|
-
ALU_RESULT_MASK = (2 **
|
30
|
+
ALU_RESULT_MASK = (2 ** WIDTH) - 1
|
32
31
|
|
33
32
|
# Upper limit of values allowed for an operation's tag.
|
34
|
-
OPERATION_TAG_LIMIT = 2 **
|
33
|
+
OPERATION_TAG_LIMIT = 2 ** DATABITS
|
35
34
|
|
36
35
|
def setup
|
37
|
-
|
38
|
-
@
|
39
|
-
|
40
|
-
@inputGen = InputGenerator.new(Hw5_unit::WIDTH)
|
36
|
+
Hw5_unit.reset!
|
37
|
+
@inputGen = InputGenerator.new(WIDTH)
|
41
38
|
end
|
42
39
|
|
43
40
|
def test_pipeline
|
@@ -47,17 +44,17 @@ class Hw5_unit_test_spec < Test::Unit::TestCase
|
|
47
44
|
until numVerified == NUM_TESTS
|
48
45
|
# issue a new operation
|
49
46
|
if numIssued < NUM_TESTS
|
50
|
-
op =
|
51
|
-
|
47
|
+
op = Operation.new(
|
48
|
+
OPERATIONS[rand(OPERATIONS.size)],
|
52
49
|
numIssued % OPERATION_TAG_LIMIT,
|
53
50
|
@inputGen.gen,
|
54
51
|
@inputGen.gen
|
55
52
|
)
|
56
53
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
54
|
+
Hw5_unit.a.intVal = op.arg1
|
55
|
+
Hw5_unit.b.intVal = op.arg2
|
56
|
+
Hw5_unit.in_op.intVal = op.type
|
57
|
+
Hw5_unit.in_databits.intVal = op.tag
|
61
58
|
|
62
59
|
issuedOps << op
|
63
60
|
numIssued += 1
|
@@ -66,18 +63,18 @@ class Hw5_unit_test_spec < Test::Unit::TestCase
|
|
66
63
|
relay_verilog
|
67
64
|
|
68
65
|
# verify result of finished operation
|
69
|
-
unless
|
70
|
-
finishedOp =
|
71
|
-
|
72
|
-
|
66
|
+
unless Hw5_unit.out_databits.x?
|
67
|
+
finishedOp = Operation.new(
|
68
|
+
Hw5_unit.out_op.intVal,
|
69
|
+
Hw5_unit.out_databits.intVal
|
73
70
|
)
|
74
|
-
finishedOp.result =
|
71
|
+
finishedOp.result = Hw5_unit.res.intVal & ALU_RESULT_MASK
|
75
72
|
|
76
73
|
expectedOp = issuedOps.shift
|
77
74
|
assert_equal expectedOp.type, finishedOp.type, "incorrect operation"
|
78
75
|
assert_equal expectedOp.tag, finishedOp.tag, "incorrect tag"
|
79
76
|
|
80
|
-
unless finishedOp.type ==
|
77
|
+
unless finishedOp.type == OP_NOP
|
81
78
|
assert_equal expectedOp.compute & ALU_RESULT_MASK, finishedOp.result, "incorrect result"
|
82
79
|
end
|
83
80
|
|