ruby-vpi 9.0.0 → 10.0.0
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/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
|
|