origen_testers 0.19.0 → 0.19.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/config/application.rb +34 -1
  3. data/config/version.rb +1 -1
  4. data/lib/origen_testers/flow.rb +1 -0
  5. data/lib/origen_testers/interface.rb +28 -0
  6. data/lib/origen_testers/pattern_compilers/v93k.rb +3 -1
  7. data/lib/origen_testers/smartest_based_tester/base.rb +14 -1
  8. data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +10 -10
  9. data/lib/origen_testers/test/interface.rb +3 -0
  10. data/pattern/tester_overlay.rb +12 -1
  11. data/program/_erase.rb +1 -1
  12. data/program/components/_prb1_main.rb +3 -3
  13. data/program/test.rb +2 -2
  14. data/templates/origen_guides/pattern/common.md.erb +376 -0
  15. data/templates/origen_guides/pattern/creating.md.erb +133 -0
  16. data/templates/origen_guides/pattern/custom.md.erb +5 -0
  17. data/templates/origen_guides/pattern/documenting.md.erb +431 -0
  18. data/templates/origen_guides/pattern/introduction.md.erb +38 -0
  19. data/templates/origen_guides/pattern/j750.md.erb +10 -0
  20. data/templates/origen_guides/pattern/name.md.erb +511 -0
  21. data/templates/origen_guides/pattern/pins.md.erb +125 -0
  22. data/templates/origen_guides/pattern/registers.md.erb +300 -0
  23. data/templates/origen_guides/pattern/running.md.erb +105 -0
  24. data/templates/origen_guides/pattern/timing.md.erb +281 -0
  25. data/templates/origen_guides/pattern/ultraflex.md.erb +10 -0
  26. data/templates/origen_guides/pattern/v93k.md.erb +41 -0
  27. data/templates/origen_guides/program/code.md.erb +78 -0
  28. data/templates/origen_guides/program/custom.md.erb +5 -0
  29. data/templates/origen_guides/program/doc.md.erb +402 -0
  30. data/templates/origen_guides/program/flowapi.md.erb +249 -0
  31. data/templates/origen_guides/program/flows.md.erb +429 -0
  32. data/templates/origen_guides/program/generating.md.erb +97 -0
  33. data/templates/origen_guides/program/interface.md.erb +248 -0
  34. data/templates/origen_guides/program/introduction.md.erb +56 -0
  35. data/templates/origen_guides/program/j750.md.erb +514 -0
  36. data/templates/origen_guides/program/philosophy.md.erb +99 -0
  37. data/templates/origen_guides/program/resources.md.erb +141 -0
  38. data/templates/origen_guides/program/ultraflex.md.erb +5 -0
  39. data/templates/origen_guides/program/v93k.md.erb +456 -0
  40. data/templates/web/layouts/_guides.html.erb +10 -0
  41. data/templates/web/partials/_placeholder.md.erb +10 -0
  42. metadata +33 -5
@@ -0,0 +1,133 @@
1
+ % render "layouts/guides.html" do
2
+
3
+ Patterns are generated by regular Ruby files that should live within the <code>pattern</code>
4
+ directory - a sub-directory within there is fine and is in fact encouraged to help
5
+ keep things organized as the number of patterns increases.
6
+ However keep in mind that each pattern should be uniquely named - i.e. no other files of the
7
+ same name should live in
8
+ any of the sub-directories of <code>pattern</code>.
9
+
10
+ Each pattern file should have the following structure:
11
+
12
+ ~~~ruby
13
+ Pattern.create do
14
+ # Pattern specific content goes here
15
+ end
16
+ ~~~
17
+
18
+ #### Startup and Shutdown Sequences
19
+
20
+ Startup and shutdown sequences will generally be the same for all patterns and these should
21
+ be implemented by using the [callbacks](<%= path "guides/misc/callbacks" %>) that support
22
+ [pattern generation](<%= path "guides/misc/callbacks/#pattern_generation" %>).
23
+
24
+ Any options supplied to <code>Pattern.create</code> will be passed into the <code>startup</code> and
25
+ <code>shutdown</code> methods when they are called, thereby providing a mechanism for per-pattern
26
+ customization of the startup/shutdown sequences.
27
+
28
+ Here is an example of an SoC controller with some startup and shutdown callbacks implemented:
29
+
30
+ ~~~ruby
31
+ class MyDeviceController
32
+ include Origen::Controller
33
+
34
+ def startup(options)
35
+ options = {
36
+ mode: :functional_test,
37
+ }.merge(options)
38
+ if options[:mode] == :functional_test
39
+ enter_functional_test_mode
40
+ elsif options[:mode] == :bist
41
+ enter_bist_test_mode
42
+ else
43
+ raise "Unknown mode requested - #{options[:mode]}"
44
+ end
45
+ end
46
+
47
+ def shutdown(options)
48
+ options = {
49
+ reset: true,
50
+ }.merge(options)
51
+ reset_device if options[:reset]
52
+ end
53
+ end
54
+ ~~~
55
+
56
+ So by default this pattern will enter functional test mode at the start and reset the device at the end:
57
+
58
+ ~~~ruby
59
+ Pattern.create do
60
+ # Pattern specific content goes here
61
+ end
62
+ ~~~
63
+
64
+ This one will enter BIST mode instead at the start:
65
+
66
+ ~~~ruby
67
+ Pattern.create(mode: :bist) do
68
+ # Pattern specific content goes here
69
+ end
70
+ ~~~
71
+
72
+ and this one would exit without resetting the device:
73
+
74
+ ~~~ruby
75
+ Pattern.create(mode: :bist, reset: false) do
76
+ # Pattern specific content goes here
77
+ end
78
+ ~~~
79
+
80
+ <div class="alert alert-info">
81
+ <strong>Note</strong> - The top-level is guaranteed to be called first and last for the startup and shutdown
82
+ callbacks respectively. However the calling order of lower level startup/shutdown listeners is undefined, if
83
+ you have multiple and care about the order you should designate one as the master which will be called by Origen, it
84
+ should then co-ordinate calling any additional startup/shutdown methods as required.
85
+ </div>
86
+
87
+ #### The Golden Rules for Building Maintainable Patterns
88
+
89
+ Origen provides a framework in which you can build very complex patterns that remain
90
+ easy to maintain, but as with any tool it is also possible to use it to create something
91
+ with which to hang yourself!
92
+
93
+ In order to avoid going down a path that will lead to an unmaintainable mess, it is
94
+ strongly recommended that the following rules are observed:
95
+
96
+ * Patterns should not talk to the current tester object directly
97
+ * Patterns should not attempt to control pin states
98
+ * Patterns should not attempt to access registers directly
99
+
100
+ Probably the most tempting one to break is the last one, however
101
+ generally manipulating register states outside of the owning model is a sign of poor
102
+ application design and breaking the encapsulation that should be provided by a model
103
+ representing a silicon module.
104
+ Instead the model's controller should provide an external interface which would remain constant even if the
105
+ internal operation of a given operation changes significantly from one silicon revision to the next.
106
+ See the [Controller guides](<%= path "guides/controllers/introduction" %>) for more.
107
+
108
+ If the above rules are followed pattern source files should typically be very small and should
109
+ generally only call a handful of methods on the target object(s), here are a few examples:
110
+
111
+ ~~~ruby
112
+ # Pattern to measure the output of the Vreg module
113
+ Pattern.create do
114
+ $dut.vreg.measure
115
+ end
116
+ ~~~
117
+
118
+ ~~~ruby
119
+ # Pattern to measure the output of the Vreg module for a specific setting
120
+ Pattern.create do
121
+ $dut.vreg.measure(setting: 12)
122
+ end
123
+ ~~~
124
+
125
+ ~~~ruby
126
+ # Pattern to program a checkerboard and then read it
127
+ Pattern.create do
128
+ $dut.nvm.program(pattern: :ckbd)
129
+ $dut.nvm.read(pattern: :ckbd)
130
+ end
131
+ ~~~
132
+
133
+ % end
@@ -0,0 +1,5 @@
1
+ % render "layouts/guides.html" do
2
+
3
+ <%= render "partials/placeholder.md" %>
4
+
5
+ % end
@@ -0,0 +1,431 @@
1
+ % render "layouts/guides.html" do
2
+
3
+ Origen encourages an agile approach to documentation and pattern generation is
4
+ no exception.
5
+ Tools are provided to create test patterns that are self-documenting and by taking
6
+ a little care you can produce very detailed (and of course 100% accurate) documentation
7
+ of your test patterns for free.
8
+
9
+ The pattern generation command has the following switches:
10
+
11
+ ~~~text
12
+ origen g bistcom # Generate a regular pattern
13
+ origen g bistcom --doc # Output documentation of that pattern to the terminal
14
+ origen g bistcom --html # Generate pre-formatted HTML documentation for inclusion in a web page
15
+ ~~~
16
+
17
+ The following methods are available to control the documentation output from the pattern
18
+ generator...
19
+
20
+ #### Debug Documentation
21
+
22
+ Comments that may help with debug of patterns on the tester can be injected into
23
+ the pattern via the <code>cc</code> method, as with all methods related to
24
+ pattern documentation this is globally available.
25
+
26
+ ~~~ruby
27
+ cc "Entering test mode now"
28
+ test.mode.write!(RAMBIST_MODE)
29
+ reset!
30
+ ~~~
31
+
32
+ The method argument is a regular string and dynamic segments can be embedded and
33
+ formatted using any regular Ruby.
34
+
35
+ ~~~ruby
36
+ delay_cycles = 100
37
+ cc "Wait for #{delay_cycles} cycles for the mode to latch"
38
+
39
+ address = 0x12
40
+ cc "Set the target address to: 0x%04X" % address
41
+ ~~~
42
+
43
+ This will produce pattern output that looks like this:
44
+
45
+ ~~~text
46
+ // Wait for 100 cycles for the mode to latch
47
+ // Set the target address to 0x0012
48
+ ~~~
49
+
50
+ <code>c1</code> is an alias for <code>cc</code>.
51
+
52
+ These low level comments will appear in the pattern but they will not be included
53
+ when a document of the pattern is generated.
54
+
55
+ A <code>c2</code> method is available to elevate the importance of a subset of
56
+ these low level comments
57
+ such that they will be included in generated documentation.
58
+
59
+ ~~~ruby
60
+ cc "You won't see me in the docs"
61
+ c1 "Or me"
62
+ c2 "But you will see me!"
63
+ ~~~
64
+
65
+ #### Documenting Major Steps
66
+
67
+ Major steps in the pattern can be highlighted using the <code>ss</code> method.
68
+
69
+ ~~~ruby
70
+ ss "Enter RAM BIST mode"
71
+
72
+ # A block form is also available
73
+ ss do
74
+ vdd_core = 1.7
75
+ cc "Enter RAM BIST mode with the following options:"
76
+ cc " Vdd core - #{vdd_core}v"
77
+ end
78
+ ~~~
79
+
80
+ This will produce the following output in the pattern:
81
+
82
+ ~~~text
83
+ // #######################################################################
84
+ // # Enter RAM BIST mode
85
+ // #######################################################################
86
+
87
+ // #######################################################################
88
+ // # Enter RAM BIST mode with the following options:
89
+ // # Vdd core - 1.7v
90
+ // #######################################################################
91
+ ~~~
92
+
93
+ Any comments defined in this way are considered more important than the regular
94
+ <code>cc</code> comments and they will be automatically included in the
95
+ generated documentation.
96
+
97
+ #### Documenting Structure
98
+
99
+ When presenting documentation it is useful to know something about the structure
100
+ of the pattern, this allows vectors to be grouped into sections like 'startup',
101
+ 'shutdown', etc.
102
+
103
+ Such structure can be described using the <code>pp</code> method:
104
+
105
+ ~~~ruby
106
+ pp "Startup" do
107
+ $dut.enter_ram_bist_mode
108
+ $dut.ram.configure_for_test
109
+ end
110
+
111
+ def enter_ram_bist_mode
112
+ pp "Enter RAM BIST mode" do
113
+ # Mode entry code here...
114
+ end
115
+ end
116
+ ~~~
117
+
118
+ This would produce comments in the pattern that look like this:
119
+
120
+ ~~~text
121
+ // #######################################################################
122
+ // # Startup
123
+ // #######################################################################
124
+
125
+ // #######################################################################
126
+ // # Enter RAM BIST mode
127
+ // #######################################################################
128
+ ~~~
129
+
130
+ However this difference vs. the <code>ss</code> method is that information about
131
+ the structure has been provided - it can be determined that the enter RAM bist
132
+ section is a sub-section of the wider startup sequence.
133
+
134
+ This comes into play when the pattern documentation is generated as HTML,
135
+ now we will see something like this (click to expand):
136
+
137
+ <div class="panel-group">
138
+ <div class="panel panel-default">
139
+ <div class="panel-heading clickable" data-toggle="collapse" data-parent="#panel2" href="#collapseComment1">
140
+ <a class="no-underline">
141
+ Startup
142
+ </a>
143
+ </div>
144
+ <div id="collapseComment1" class="panel-collapse collapse">
145
+ <div class="panel-body" markdown="1">
146
+
147
+ <div class="panel panel-default">
148
+ <div class="panel-heading clickable" data-toggle="collapse" data-parent="#panel2" href="#collapseComment2">
149
+ <a class="no-underline">
150
+ Enter RAM BIST mode
151
+ </a>
152
+ </div>
153
+ <div id="collapseComment2" class="panel-collapse collapse">
154
+ <div class="panel-body" markdown="1">
155
+
156
+ ~~~text
157
+ # Some comments generated by the RAM BIST entry sequence
158
+ ~~~
159
+
160
+ </div>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+ </div>
167
+
168
+ #### Adding Annotations
169
+
170
+ Sometimes it will be helpful to add some annotations to describe what sections
171
+ of the pattern are doing, this can be done via the <code>annotate</code>
172
+ method.
173
+
174
+ Any annotations will not be output in the actual pattern but will be included
175
+ in generated documentation.
176
+
177
+ Here is the above example with some annotations added:
178
+
179
+ ~~~ruby
180
+ pp "Startup" do
181
+ annotate "Perform startup operations that are common to all patterns."
182
+ $dut.enter_ram_bist_mode
183
+ $dut.ram.configure_for_test
184
+ end
185
+
186
+ def enter_ram_bist_mode
187
+ pp "Enter RAM BIST mode" do
188
+
189
+ annotate <<-END
190
+ This is an example of a multi-line annotation. Anything you write here
191
+ will be parsed as markdown, so you can do things like:
192
+
193
+ * Create bullet
194
+ * Lists
195
+
196
+ ~~~ruby
197
+ # Embed some code examples
198
+ $dut.enter_ram_bist_mode
199
+ ~~~
200
+
201
+ Or create [links](http://origen.freescale.net)
202
+ END
203
+
204
+ # Mode entry code here...
205
+ end
206
+ end
207
+ ~~~
208
+
209
+ This would produce the following snippet of documentation:
210
+
211
+
212
+
213
+ <div class="panel-group">
214
+ <div class="panel panel-default">
215
+ <div class="panel-heading clickable" data-toggle="collapse" data-parent="#panel2" href="#collapseComment3">
216
+ <a class="no-underline">
217
+ Startup
218
+ </a>
219
+ </div>
220
+ <div id="collapseComment3" class="panel-collapse collapse">
221
+ <div class="panel-body" markdown="1">
222
+
223
+ Perform startup operations that are common to all patterns.
224
+
225
+ <div class="panel panel-default">
226
+ <div class="panel-heading clickable" data-toggle="collapse" data-parent="#panel2" href="#collapseComment4">
227
+ <a class="no-underline">
228
+ Enter RAM BIST mode
229
+ </a>
230
+ </div>
231
+ <div id="collapseComment4" class="panel-collapse collapse">
232
+ <div class="panel-body" markdown="1">
233
+
234
+ This is an example of a multi-line annotation. Anything you write here
235
+ will be parsed as markdown, so you can do things like:
236
+
237
+ * Create bullet
238
+ * Lists
239
+
240
+ ~~~ruby
241
+ # Embed some code examples
242
+ $dut.enter_ram_bist_mode
243
+ ~~~
244
+
245
+ Or create [links](http://origen.freescale.net)
246
+
247
+ ~~~text
248
+ # Some comments generated by the RAM BIST entry sequence
249
+ ~~~
250
+
251
+ </div>
252
+ </div>
253
+ </div>
254
+ </div>
255
+ </div>
256
+ </div>
257
+ </div>
258
+
259
+
260
+ #### Summarizing Long Sections
261
+
262
+ Sometimes it is not necessary to list out every comment or operation when documenting
263
+ a pattern. For example if the pattern downloads some functional code to be executing
264
+ on the chip it is not really necessary to include the entire code download in the
265
+ pattern document.
266
+
267
+ For these scenarios a <code>snip</code> method is available which will output the
268
+ given number of documentation lines and then enter a message to indicate that
269
+ the remainder of the output has been snipped for efficiency.
270
+
271
+ Here is an example of how to use it, here the comments generated by the contained
272
+ section will be limited to 10 lines:
273
+
274
+ ~~~ruby
275
+ snip 10 do
276
+ # Download some verbose LRE code here
277
+ end
278
+ ~~~
279
+
280
+ #### Pattern Headers
281
+
282
+ When you generate a pattern, you'll notice the top section contains some useful information, such as the user that generated the pattern, a
283
+ timestamp, the current environment, version of the application, the gems used, etc. This section is called the <code>pattern header</code> and may look something
284
+ like this:
285
+
286
+ ~~~
287
+ // ***************************************************************************
288
+ // GENERATED:
289
+ // Time: 24-Jun-2018 10:06AM
290
+ // By: coreyeng
291
+ // Mode: debug
292
+ // Command: origen g iterator_postfix_test_x_bx -t debug.rb
293
+ // ***************************************************************************
294
+ // ENVIRONMENT:
295
+ // Application
296
+ // Source: git@github.com:Origen-SDK/origen.git
297
+ // Version: 0.33.1
298
+ // Branch: fixes(c4e8e1d0db0) (+local edits)
299
+ // Origen
300
+ // Source: https://github.com/Origen-SDK/origen
301
+ // Version: 0.33.1
302
+ // Plugins
303
+ // atp: 1.1.0
304
+ // origen_core_support: 0.2.3
305
+ // origen_debuggers: 0.6.0
306
+ // origen_doc_helpers: 0.5.2
307
+ // origen_testers: 0.16.1
308
+ // origen_updater: 0.7.0
309
+ // ***************************************************************************
310
+ ~~~
311
+
312
+ The pattern header can also serve as place for the application, current plugin, or other shared plugins, to add specific comments that relate to
313
+ how that pattern was generated or how it should be used.
314
+
315
+ Three [configuration attributes](<%= path "guides/plugins/app/" %>)
316
+ exist that will inject additional comments into the pattern header: <code>shared_pattern_header</code>, <code>application_pattern_header</code>,
317
+ and <code>current_plugin_pattern_header</code>.
318
+
319
+ These configuration attributes should be <code>blocks</code> that accept an <code>options hash</code> and return either a <code>String</code>,
320
+ <code>Array of Strings</code>, or another <code>block</code>. <code>Strings</code> and <code>Arrays</code> will have the formatting handled
321
+ for you, but <code>blocks</code> can handle the formatting themselves and can provide custom header comment formatting.
322
+
323
+ Assume we have two plugins, <code>plugin1</code> and <code>plugin2</code> that are each needed to generate a pattern located in the
324
+ application <code>my_app</code>. With <u>no plugin set</u> and with the configuration attributes set as follows:
325
+
326
+ ~~~ruby
327
+ # plugin1/config/application.rb
328
+
329
+ config.shared_pattern_header do
330
+ "Hi from shared #{Origen.app!.name}!"
331
+ end
332
+
333
+ config.current_plugin_pattern_header do
334
+ "Hi from current plugin: #{Origen.app!.name}!"
335
+ end
336
+
337
+ # plugin2/config/application.rb
338
+
339
+ config.shared_pattern_header do
340
+ "Hi from shared #{Origen.app!.name}!"
341
+ end
342
+
343
+ config.current_plugin_pattern_header do
344
+ "Hi from current plugin: #{Origen.app!.name}!"
345
+ end
346
+
347
+ # my_app/config/application.rb
348
+
349
+ config.shared_pattern_header do
350
+ "Hi from application #{Origen.app!.name}!"
351
+ end
352
+ ~~~
353
+
354
+ generating a pattern, will yield the following appended to the pattern header:
355
+
356
+ ~~~
357
+ // ***************************************************************************
358
+ // Header Comments From Shared Plugins:
359
+ // Header Comments From Shared Plugin: plugin1:
360
+ // Hi from shared plugin1!
361
+ // Header Comments From Shared Plugin: plugin2:
362
+ // Hi from shared plugin2!
363
+ // ***************************************************************************
364
+ // Header Comments From Application: my_app:
365
+ // Hi from application my_app!
366
+ // ***************************************************************************
367
+ ~~~
368
+
369
+ You'll notice here that there's no <code>current_plugin_pattern_header</code> printed. This will be printed when
370
+ the current plugin is set to a plugin that has this configuration attribute. Setting the current plugin to
371
+ <code>plugin1</code>, you'll now get both shared headers, the current plugin's header, and the application header:
372
+
373
+ ~~~
374
+ // ***************************************************************************
375
+ // Header Comments From Shared Plugins:
376
+ // Header Comments From Shared Plugin: plugin1:
377
+ // Hi from shared plugin1!
378
+ // Header Comments From Shared Plugin: plugin2:
379
+ // Hi from shared plugin2!
380
+ // ***************************************************************************
381
+ // Header Comments From The Current Plugin: plugin1:
382
+ // Hi from current plugin plugin1!
383
+ // ***************************************************************************
384
+ // Header Comments From Application: my_app:
385
+ // Hi from application my_app!
386
+ // ***************************************************************************
387
+ ~~~
388
+
389
+ As previously said, you can provide either a <code>block, proc, or lambda</code> (anything that responds to <code>call</code> will work) and use
390
+ <code>cc, ss, c2</code>, etc. to handle arbitrary headers or formatting. For example, changing <code>shared_pattern_header</code> in <code>plugin2</code>:
391
+
392
+ ~~~ruby
393
+ # plugin2/config/application.rb
394
+
395
+ config.shared_pattern_header do
396
+ proc do
397
+ c2 "Hi from block in #{Origen.app!.name}"
398
+ end
399
+ end
400
+ ~~~
401
+
402
+ Will show the following in the pattern header:
403
+
404
+ ~~~
405
+ // ***************************************************************************
406
+ // Header Comments From Shared Plugins:
407
+ // Header Comments From Shared Plugin: plugin1:
408
+ // Hi from shared plugin1!
409
+ // Header Comments From Shared Plugin: plugin2:
410
+ // Hi from block in plugin2!
411
+ // ***************************************************************************
412
+ // Header Comments From The Current Plugin: plugin1:
413
+ // Hi from current plugin plugin1!
414
+ // ***************************************************************************
415
+ // Header Comments From Application: my_app:
416
+ // Hi from application my_app!
417
+ // ***************************************************************************
418
+ ~~~
419
+
420
+ <div class ="alert alert-info" role="alert">
421
+ <strong>Info:</strong> Although the guides here show an <code>option hash</code>, there are currently no options <i>actually</i> being passed in, i.e., its just
422
+ an empty hash. This is only because this is a new feature, and by using an options hash here, future versions of Origen will be able to add any options that should
423
+ go to the pattern header without affecting the method prototype.
424
+ </div>
425
+
426
+ <div class="alert alert-warning" role="alert">
427
+ <strong>Deprecated:</strong> You may see <code>config.pattern_header</code> in some legacy applications. <code>config.pattern_header</code> is limited to only the
428
+ current plugin and must handle formatting itself. This is now deprecated but is left in for legacy purposes.
429
+ </div>
430
+
431
+ % end