origen_link 0.1.0 → 0.1.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: faee2177091aa943a5592a6bdf44edc8813eb3b8
4
- data.tar.gz: f50c5b16dc546bd39c7fb45bacb11bd9340053f1
3
+ metadata.gz: 7b819630a6b626e6c330114c40f70108f7850657
4
+ data.tar.gz: 51a6ddf9796af5b1569c3b61a9e8f8d2b3c955c9
5
5
  SHA512:
6
- metadata.gz: b16813b53e7e2a87008c86055991cc18e4b113502e02437ca04ba1283d5950ffb9c41c618fb0d0e69990030ba6b82addfaa9ca552747c2607b2fab1398665af9
7
- data.tar.gz: 71a143e7bf8008e829af1adf9cb5c6bfe7da1ec5748e824221fbf29648bcb698c19139b6a96d71064db9e81fb5938ff117f64912d6cc371128b9b5661eb9fbe3
6
+ metadata.gz: 379e3b256c9becd833c2d2fd76fcfba2c3b1b7c3f4922986e6ca8523eb0bda24919366189c06695577aea979be102a7a2a0fb84e4b8f55973d22cd14927b6117
7
+ data.tar.gz: 222fdaf6916110972cacb9a25f1f2cf0b60ba8406770f8518f8777b00e771c1755eff011ecc46465c4dac7f5035e5ff19eb57ed8dd1a4acf60a423d4db174941
data/config/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module OrigenLink
2
2
  MAJOR = 0
3
3
  MINOR = 1
4
- BUGFIX = 0
4
+ BUGFIX = 2
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -0,0 +1,94 @@
1
+ module OrigenLink
2
+ module CaptureSupport
3
+ # Capture a vector
4
+ #
5
+ # This method applies a store vector request to the previous vector, note that is does
6
+ # not actually generate a new vector.
7
+ #
8
+ # The captured data is added to the captured_data array.
9
+ #
10
+ # This method is indended to be used by pin drivers, see the #capture method for the application
11
+ # level API.
12
+ #
13
+ # @example
14
+ # $tester.cycle # This is the vector you want to capture
15
+ # $tester.store # This applies the store request
16
+ def store(*pins)
17
+ options = pins.last.is_a?(Hash) ? pins.pop : {}
18
+ fail 'The store is not implemented yet on Link'
19
+ end
20
+
21
+ # Capture the next vector generated
22
+ #
23
+ # This method applies a store request to the next vector to be generated,
24
+ # note that is does not actually generate a new vector.
25
+ #
26
+ # The captured data is added to the captured_data array.
27
+ #
28
+ # This method is indended to be used by pin drivers, see the #capture method for the application
29
+ # level API.
30
+ #
31
+ # @example
32
+ # tester.store_next_cycle
33
+ # tester.cycle # This is the vector that will be captured
34
+ def store_next_cycle(*pins)
35
+ options = pins.last.is_a?(Hash) ? pins.pop : {}
36
+ flush_vector
37
+ @store_pins = pins
38
+ end
39
+
40
+ # Capture any store data within the given block, return it and then internally clear the tester's
41
+ # capture memory.
42
+ #
43
+ # @example
44
+ #
45
+ # v = tester.capture do
46
+ # my_reg.store!
47
+ # end
48
+ # v # => Data value read from my_reg on the DUT
49
+ def capture(*args)
50
+ if block_given?
51
+ yield
52
+ synchronize
53
+ d = @captured_data
54
+ @captured_data = []
55
+ d
56
+ else
57
+ # On other testers capture is an alias of store
58
+ store(*args)
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def capture_data(response)
65
+ if @store_pins.size > 1
66
+ fail 'Data capture on multiple pins is not implemented yet'
67
+ else
68
+ captured_data[0] ||= 0
69
+ captured_data[0] = (captured_data[0] << 1) | extract_value(response, @store_pins[0])
70
+ @store_pins = []
71
+ end
72
+ end
73
+
74
+ def extract_value(response, pin)
75
+ v = response[index_of(pin) + 2]
76
+ if v == '`'
77
+ 1
78
+ elsif v == '.'
79
+ 0
80
+ else
81
+ fail "Failed to extract value for pin #{pin.name}, character in response is: #{v}"
82
+ end
83
+ end
84
+
85
+ # Returns the vector index (position) of the given pin
86
+ def index_of(pin)
87
+ i = @pinorder.split(',').index(pin.name.to_s)
88
+ unless i
89
+ fail "Data capture of pin #{pin.name} has been requested, but it has not been included in the Link pinmap!"
90
+ end
91
+ i
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,84 @@
1
+ module OrigenLink
2
+ module ConfigurationCommands
3
+ # pinmap=
4
+ # This method is used to setup the pin map on the debugger device.
5
+ # The argument should be a string with <pin name>, <gpio #>, <pin name>
6
+ # <gpio #>, etc
7
+ #
8
+ # example:
9
+ # tester.pinmap = 'tclk,26,tms,19,tdi,16,tdo,23'
10
+ def pinmap=(pinmap)
11
+ @pinmap = pinmap.gsub(/\s+/, '')
12
+ response = send_cmd('pin_assign', @pinmap)
13
+ setup_cmd_response_logger('pin_assign', response)
14
+ end
15
+
16
+ # pinorder=
17
+ # This method is used to setup the pin order on the debugger device.
18
+ # The pin order will indicate the order that pin data appears in vector
19
+ # data.
20
+ #
21
+ # This is a duplicate of pattern_pin_order and can be handled behind the
22
+ # scenes in the future.
23
+ #
24
+ # example:
25
+ # tester.pinorder = 'tclk,tms,tdi,tdo'
26
+ def pinorder=(pinorder)
27
+ @pinorder = pinorder.gsub(/\s+/, '')
28
+ response = send_cmd('pin_patternorder', @pinorder)
29
+ setup_cmd_response_logger('pin_patternorder', response)
30
+ end
31
+
32
+ # pinformat=
33
+ # This method is used to setup the pin clock format on the debugger device.
34
+ # The supported formats are rl and rh
35
+ #
36
+ # example:
37
+ # tester.pinformat = 'func_25mhz,tclk,rl'
38
+ def pinformat=(pinformat)
39
+ @pinformat = replace_tset_name_w_number(pinformat.gsub(/\s+/, ''))
40
+ response = send_cmd('pin_format', @pinformat)
41
+ setup_cmd_response_logger('pin_format', response)
42
+ end
43
+
44
+ # pintiming=
45
+ # This method is used to setup the pin timing on the debugger device.
46
+ # Timing is relative to the rise and fall of a clock
47
+ #
48
+ # timing value: 0 1 2
49
+ # clock waveform: ___/***\___
50
+ #
51
+ # example:
52
+ # tester.pintiming = 'func_25mhz,tms,0,tdi,0,tdo,1'
53
+ def pintiming=(pintiming)
54
+ @pintiming = replace_tset_name_w_number(pintiming.gsub(/\s+/, ''))
55
+ response = send_cmd('pin_timing', @pintiming)
56
+ setup_cmd_response_logger('pin_timing', response)
57
+ end
58
+
59
+ # replace_tset_name_w_number(csl)
60
+ # This method is used by pinformat= and pintiming=
61
+ # This method receives a comma separated list of arguments
62
+ # the first of which is a timeset name. A comma
63
+ # separated list is returned with the timeset name replaced
64
+ # by it's lookup number. If it is a new timset, a lookup
65
+ # number is associated with the name.
66
+ def replace_tset_name_w_number(csl)
67
+ args = csl.split(',')
68
+ args[0] = get_tset_number(args[0])
69
+ args.join(',')
70
+ end
71
+
72
+ # get_tset_number(name)
73
+ # This method returns the test number associated with the
74
+ # passed in tset name. If the name is unknown a new lookup
75
+ # number is returned.
76
+ def get_tset_number(name)
77
+ unless @tsets_programmed.key?(name)
78
+ @tsets_programmed[name] = @tset_count
79
+ @tset_count += 1
80
+ end
81
+ @tsets_programmed[name]
82
+ end
83
+ end
84
+ end
@@ -264,11 +264,17 @@ module OrigenLink
264
264
  end
265
265
  # process time 2 events
266
266
  response = process_events(@cycletiming[tset]['timing'][2], pindata).merge(response)
267
- if (count == 0) || (@cycle_failure)
268
- message = ''
269
- @patternorder.each do |pin|
270
- message += response[pin]
271
- end
267
+ # changing response format to return all data for easier debug, below is original method
268
+ # TODO: remove the commented code once return format and delay handling is finalized
269
+ # if (count == 0) || (@cycle_failure)
270
+ # message = ''
271
+ # @patternorder.each do |pin|
272
+ # message += response[pin]
273
+ # end
274
+ # end
275
+ message = message + ' ' unless count == 0
276
+ @patternorder.each do |pin|
277
+ message += response[pin]
272
278
  end
273
279
  end # end cycle through repeats
274
280
  if @cycle_failure
@@ -276,7 +282,9 @@ module OrigenLink
276
282
  else
277
283
  rtnmsg = 'P:' + message
278
284
  end
279
- rtnmsg += ' Repeat ' + repeat_count.to_s if repeat_count > 1
285
+ # no need to return repeat count since all data is returned
286
+ # TODO: remove the commented code once return format and delay handling is finalized
287
+ # rtnmsg += ' Repeat ' + repeat_count.to_s if repeat_count > 1
280
288
  rtnmsg
281
289
  end
282
290
 
@@ -45,6 +45,7 @@ module OrigenLink
45
45
  @max_receive_time = (t4 - t3) if @max_receive_time < (t4 - t3)
46
46
  @total_packets += 1
47
47
  Origen.log.error 'nil response from server (likely died) for command(' + cmdstr + ':' + argstr + ')' if response.nil?
48
+ @pattern_link_messages << "#{cmdstr}:#{argstr}"
48
49
  response # ensure the response is passed along
49
50
  end
50
51
 
@@ -72,6 +73,7 @@ module OrigenLink
72
73
  @total_recv_time += (t4 - t3)
73
74
  @max_receive_time = (t4 - t3) if @max_receive_time < (t4 - t3)
74
75
  @total_packets += 1
76
+ @pattern_link_messages.concat(vector_batch)
75
77
  response
76
78
  end
77
79
 
@@ -6,23 +6,23 @@ module OrigenLink
6
6
  include OrigenJTAG
7
7
 
8
8
  JTAG_CONFIG = {
9
- #:tclk_format => :rl,
10
- tclk_format: :rh,
11
- #:tclk_multiple => 1,
12
- tclk_multiple: 4,
13
- tdo_strobe: :tclk_high,
14
- tdo_store_cycle: 3,
15
- init_state: :idle
9
+ tclk_format: :rl,
10
+ # tclk_format: :rh,
11
+ tclk_multiple: 1,
12
+ # tclk_multiple: 4,
13
+ tdo_strobe: :tclk_high,
14
+ # tdo_store_cycle: 3,
15
+ init_state: :idle
16
16
  }
17
17
 
18
18
  def startup(options)
19
19
  pp 'Enter test mode' do
20
20
  # if tester.link?
21
21
  if tester.to_s == 'OrigenLink::VectorBased'
22
- tester.initialize_pattern
22
+ # tester.initialize_pattern
23
23
  # below is for testing return format timing, requires tclk to be rl and multiple of 1
24
- # tester.pinformat = 'func_25mhz,tclk,rl'
25
- # tester.pintiming = 'func_25mhz,tdi,0,tms,0,tdo,1'
24
+ tester.pinformat = 'func_25mhz,tclk,rl'
25
+ tester.pintiming = 'func_25mhz,tdi,0,tms,0,tdo,1'
26
26
  end
27
27
  tester.set_timeset('func_25mhz', 40) # Where 40 is the period in ns
28
28
  tester.wait time_in_us: 100
@@ -36,7 +36,7 @@ module OrigenLink
36
36
  end
37
37
  # if tester.link?
38
38
  if tester.to_s == 'OrigenLink::VectorBased'
39
- tester.finalize_pattern
39
+ # tester.finalize_pattern
40
40
  end
41
41
  end
42
42
  end
@@ -1,5 +1,7 @@
1
1
  require 'origen_testers'
2
2
  require 'origen_link/server_com'
3
+ require 'origen_link/capture_support'
4
+ require 'origen_link/configuration_commands'
3
5
  require 'origen_link/callback_handlers'
4
6
  module OrigenLink
5
7
  # OrigenLink::VectorBased
@@ -30,6 +32,8 @@ module OrigenLink
30
32
  class VectorBased
31
33
  include OrigenTesters::VectorBasedTester
32
34
  include ServerCom
35
+ include CaptureSupport
36
+ include ConfigurationCommands
33
37
 
34
38
  # these attributes are exposed for testing purposes, a user would not need to read them
35
39
  attr_reader :fail_count, :vector_count, :total_comm_time, :total_connect_time, :total_xmit_time
@@ -62,6 +66,8 @@ module OrigenLink
62
66
  @store_pins_batch = {}
63
67
  @comment_batch = {}
64
68
  @batch_vectors = true
69
+ @pattern_link_messages = []
70
+ @pattern_comments = {}
65
71
  end
66
72
 
67
73
  # push_comment
@@ -75,6 +81,8 @@ module OrigenLink
75
81
  else
76
82
  @comment_batch[key] = msg
77
83
  end
84
+ pattern_key = @pattern_link_messages.length + key
85
+ @pattern_comments[pattern_key] = @comment_batch[key]
78
86
  else
79
87
  microcode msg
80
88
  end
@@ -111,65 +119,6 @@ module OrigenLink
111
119
  @vector_count += 1
112
120
  end
113
121
 
114
- # Capture a vector
115
- #
116
- # This method applies a store vector request to the previous vector, note that is does
117
- # not actually generate a new vector.
118
- #
119
- # The captured data is added to the captured_data array.
120
- #
121
- # This method is indended to be used by pin drivers, see the #capture method for the application
122
- # level API.
123
- #
124
- # @example
125
- # $tester.cycle # This is the vector you want to capture
126
- # $tester.store # This applies the store request
127
- def store(*pins)
128
- options = pins.last.is_a?(Hash) ? pins.pop : {}
129
- fail 'The store is not implemented yet on Link'
130
- end
131
-
132
- # Capture the next vector generated
133
- #
134
- # This method applies a store request to the next vector to be generated,
135
- # note that is does not actually generate a new vector.
136
- #
137
- # The captured data is added to the captured_data array.
138
- #
139
- # This method is indended to be used by pin drivers, see the #capture method for the application
140
- # level API.
141
- #
142
- # @example
143
- # tester.store_next_cycle
144
- # tester.cycle # This is the vector that will be captured
145
- def store_next_cycle(*pins)
146
- options = pins.last.is_a?(Hash) ? pins.pop : {}
147
- flush_vector
148
- @store_pins = pins
149
- end
150
-
151
- # Capture any store data within the given block, return it and then internally clear the tester's
152
- # capture memory.
153
- #
154
- # @example
155
- #
156
- # v = tester.capture do
157
- # my_reg.store!
158
- # end
159
- # v # => Data value read from my_reg on the DUT
160
- def capture(*args)
161
- if block_given?
162
- yield
163
- synchronize
164
- d = @captured_data
165
- @captured_data = []
166
- d
167
- else
168
- # On other testers capture is an alias of store
169
- store(*args)
170
- end
171
- end
172
-
173
122
  # flush_vector
174
123
  # Just as the name suggests, this method "flushes" a vector. This is necessary because
175
124
  # of repeat compression (a vector isn't sent until different vector data is encountered)
@@ -230,6 +179,10 @@ module OrigenLink
230
179
  # if called from finalize_pattern -> synchronize, open the output_file and store results
231
180
  output_obj = nil
232
181
  output_obj = File.open(output_file, 'a+') unless output_file == ''
182
+
183
+ # in case there were only comments and no vectors, place comments (if any)
184
+ microcode @comment_batch[0] if response.size == 0
185
+
233
186
  response.each_index do |index|
234
187
  # restore store pins state for processing
235
188
  if @store_pins_batch.key?(index)
@@ -237,17 +190,19 @@ module OrigenLink
237
190
  else
238
191
  @store_pins = []
239
192
  end
193
+ process_vector_response(response[index], output_obj)
240
194
  if @comment_batch.key?(index)
241
- unless output_file == ''
242
- # get the header placed correctly
243
- if index == response.length - 1
244
- output_obj.puts 'last comment'
245
- output_obj.lineno = 0
246
- end
195
+ if output_file == ''
196
+ microcode @comment_batch[index]
197
+ else
198
+ # get the header placed correctly, the below code doesn't work
199
+ # if index == response.length - 1
200
+ # output_obj.puts 'last comment'
201
+ # output_obj.lineno = 0
202
+ # end
247
203
  output_obj.puts(@comment_batch[index])
248
204
  end
249
205
  end
250
- process_vector_response(response[index], output_obj)
251
206
  end
252
207
  output_obj.close unless output_file == ''
253
208
  else
@@ -265,10 +220,34 @@ module OrigenLink
265
220
  vector_response.strip!
266
221
  vector_response += msg
267
222
  end
268
- if output_obj.nil?
269
- microcode vector_response
270
- else
271
- output_obj.puts(vector_response)
223
+ vector_cycles = vector_response.split(/\s+/)
224
+ expected_msg = ''
225
+ expected_msg = ' ' + vector_cycles.pop if vector_cycles[vector_cycles.length - 1] =~ /Expected/
226
+ pfstatus = vector_cycles[0].chr
227
+ vector_cycles[0] = vector_cycles[0].byteslice(2, vector_cycles[0].length - 2)
228
+
229
+ vector_cycles.each do |cycle|
230
+ thiscyclefail = false
231
+ if pfstatus == 'F'
232
+ # check to see if this cycle failed
233
+ 0.upto(cycle.length - 1) do |index|
234
+ thiscyclefail = true if (cycle[index] == 'H') && (expected_msg[expected_msg.length - cycle.length + index] == 'L')
235
+ thiscyclefail = true if (cycle[index] == 'L') && (expected_msg[expected_msg.length - cycle.length + index] == 'X')
236
+ end
237
+ end
238
+ if thiscyclefail
239
+ expected_msg_prnt = expected_msg
240
+ prepend = 'F:'
241
+ else
242
+ expected_msg_prnt = ''
243
+ prepend = 'P:'
244
+ end
245
+
246
+ if output_obj.nil?
247
+ microcode prepend + cycle + expected_msg_prnt
248
+ else
249
+ output_obj.puts(prepend + cycle + expected_msg_prnt)
250
+ end
272
251
  end
273
252
 
274
253
  unless vector_response.chr == 'P'
@@ -287,6 +266,8 @@ module OrigenLink
287
266
  @vector_batch.delete_if { true }
288
267
  @store_pins_batch.clear
289
268
  @comment_batch.clear
269
+ @pattern_link_messages.delete_if { true }
270
+ @pattern_comments.clear
290
271
 
291
272
  @total_packets = 0
292
273
  @total_comm_time = 0
@@ -327,6 +308,15 @@ module OrigenLink
327
308
  # Origen.log.error("FAIL - pattern execution failed (#{@fail_count} failures)")
328
309
  Origen.app.stats.report_fail
329
310
  end
311
+ commands_file = Origen.app.current_job.output_file.split('.')[0] + '_link_cmds.txt'
312
+ File.open(commands_file, 'w') do |file|
313
+ file.puts("pin_assign:#{@pinmap}")
314
+ file.puts("pin_patternorder:#{@pinorder}")
315
+ @pattern_link_messages.each_index do |index|
316
+ file.puts(@pattern_link_messages[index])
317
+ file.puts(@pattern_comments[index]) if @pattern_comments.key?(index)
318
+ end
319
+ end
330
320
  end
331
321
 
332
322
  # to_s
@@ -339,117 +329,31 @@ module OrigenLink
339
329
  'OrigenLink::VectorBased'
340
330
  end
341
331
 
342
- # pinmap=
343
- # This method is used to setup the pin map on the debugger device.
344
- # The argument should be a string with <pin name>, <gpio #>, <pin name>
345
- # <gpio #>, etc
346
- #
347
- # example:
348
- # tester.pinmap = 'tclk,26,tms,19,tdi,16,tdo,23'
349
- def pinmap=(pinmap)
350
- @pinmap = pinmap.gsub(/\s+/, '')
351
- response = send_cmd('pin_assign', @pinmap)
352
- setup_cmd_response_logger('pin_assign', response)
353
- end
354
-
355
- # pinorder=
356
- # This method is used to setup the pin order on the debugger device.
357
- # The pin order will indicate the order that pin data appears in vector
358
- # data.
332
+ # transaction
333
+ # returns true/false indicating whether the transaction passed
334
+ # true = pass
335
+ # false = fail
359
336
  #
360
- # This is a duplicate of pattern_pin_order and can be handled behind the
361
- # scenes in the future.
337
+ # TODO: capture transaction vector data and response for use in debug
362
338
  #
363
- # example:
364
- # tester.pinorder = 'tclk,tms,tdi,tdo'
365
- def pinorder=(pinorder)
366
- @pinorder = pinorder.gsub(/\s+/, '')
367
- response = send_cmd('pin_patternorder', @pinorder)
368
- setup_cmd_response_logger('pin_patternorder', response)
369
- end
370
-
371
- # pinformat=
372
- # This method is used to setup the pin clock format on the debugger device.
373
- # The supported formats are rl and rh
374
- #
375
- # example:
376
- # tester.pinformat = 'func_25mhz,tclk,rl'
377
- def pinformat=(pinformat)
378
- @pinformat = replace_tset_name_w_number(pinformat.gsub(/\s+/, ''))
379
- response = send_cmd('pin_format', @pinformat)
380
- setup_cmd_response_logger('pin_format', response)
381
- end
382
-
383
- # pintiming=
384
- # This method is used to setup the pin timing on the debugger device.
385
- # Timing is relative to the rise and fall of a clock
386
- #
387
- # timing value: 0 1 2
388
- # clock waveform: ___/***\___
389
- #
390
- # example:
391
- # tester.pintiming = 'func_25mhz,tms,0,tdi,0,tdo,1'
392
- def pintiming=(pintiming)
393
- @pintiming = replace_tset_name_w_number(pintiming.gsub(/\s+/, ''))
394
- response = send_cmd('pin_timing', @pintiming)
395
- setup_cmd_response_logger('pin_timing', response)
396
- end
397
-
398
- # replace_tset_name_w_number(csl)
399
- # This method is used by pinformat= and pintiming=
400
- # This method receives a comma separated list of arguments
401
- # the first of which is a timeset name. A comma
402
- # separated list is returned with the timeset name replaced
403
- # by it's lookup number. If it is a new timset, a lookup
404
- # number is associated with the name.
405
- def replace_tset_name_w_number(csl)
406
- args = csl.split(',')
407
- args[0] = get_tset_number(args[0])
408
- args.join(',')
409
- end
410
-
411
- # get_tset_number(name)
412
- # This method returns the test number associated with the
413
- # passed in tset name. If the name is unknown a new lookup
414
- # number is returned.
415
- def get_tset_number(name)
416
- unless @tsets_programmed.key?(name)
417
- @tsets_programmed[name] = @tset_count
418
- @tset_count += 1
419
- end
420
- @tsets_programmed[name]
421
- end
422
-
423
- private
424
-
425
- def capture_data(response)
426
- if @store_pins.size > 1
427
- fail 'Data capture on multiple pins is not implemented yet'
428
- else
429
- captured_data[0] ||= 0
430
- captured_data[0] = (captured_data[0] << 1) | extract_value(response, @store_pins[0])
431
- @store_pins = []
432
- end
433
- end
434
-
435
- def extract_value(response, pin)
436
- v = response[index_of(pin) + 2]
437
- if v == '`'
438
- 1
439
- elsif v == '.'
440
- 0
339
+ # if !tester.transaction {dut.reg blah blah}
340
+ # puts 'transaction failed'
341
+ # end
342
+ def transaction
343
+ if block_given?
344
+ synchronize
345
+ transaction_fail_count = @fail_count
346
+ yield
347
+ synchronize
348
+ transaction_fail_count = @fail_count - transaction_fail_count
349
+ if transaction_fail_count == 0
350
+ true
351
+ else
352
+ false
353
+ end
441
354
  else
442
- fail "Failed to extract value for pin #{pin.name}, character in response is: #{v}"
443
- end
444
- end
445
-
446
- # Returns the vector index (position) of the given pin
447
- def index_of(pin)
448
- i = @pinorder.split(',').index(pin.name.to_s)
449
- unless i
450
- fail "Data capture of pin #{pin.name} has been requested, but it has not been included in the Link pinmap!"
355
+ true
451
356
  end
452
- i
453
357
  end
454
358
  end
455
359
  end
@@ -1,4 +1,4 @@
1
- Pattern.create(options={:name => "JTAG_Test"})do
1
+ Pattern.create(options={:name => "JTAG_Test_100ops"})do
2
2
  $dut.jtag.reset
3
3
  $dut.jtag.idle
4
4
  1.upto(50) do
@@ -0,0 +1,23 @@
1
+ Pattern.create(options={:name => "JTAG_CaptureID"})do
2
+ $dut.jtag.reset
3
+ $dut.jtag.idle
4
+ ss "reading default ID"
5
+ $dut.reg(:testreg).bits(31..0).store
6
+ default_id = tester.capture {$dut.jtag.read_dr $dut.reg(:testreg), size: 32 }
7
+ default_id_str = default_id[0].to_s(2)
8
+ default_id_str.reverse!
9
+ default_id = default_id_str.to_i(2)
10
+ puts '**************************************************'
11
+ puts 'Captured default ID through JTAG: 0x' + default_id.to_s(16)
12
+ puts '**************************************************'
13
+ $dut.jtag.write_ir 0, size: 4
14
+ ss "reading JTAG ID"
15
+ $dut.reg(:testreg).bits(31..0).store
16
+ jtag_id = tester.capture {$dut.jtag.read_dr $dut.reg(:testreg), size: 32 }
17
+ jtag_id_str = jtag_id[0].to_s(2)
18
+ jtag_id_str.reverse!
19
+ jtag_id = jtag_id_str.to_i(2)
20
+ puts '**************************************************'
21
+ puts 'Captured JTAG ID: 0x' + jtag_id.to_s(16)
22
+ puts '**************************************************'
23
+ end
@@ -0,0 +1,19 @@
1
+ Pattern.create(options={:name => "transaction_test"})do
2
+ $dut.jtag.reset
3
+ $dut.jtag.idle
4
+ ss "reading Halo debugger ID - setting correct compare value"
5
+ result = tester.transaction do
6
+ $dut.reg(:testreg).read(0x5ba00477)
7
+ $dut.jtag.read_dr $dut.reg(:testreg), size: 32
8
+ end
9
+ result_comment = "transaction result: #{result}"
10
+ ss result_comment
11
+
12
+ ss "reading Halo debugger ID - setting wrong compare value"
13
+ result = tester.transaction do
14
+ $dut.reg(:testreg).read(0x5bd00477)
15
+ $dut.jtag.read_dr $dut.reg(:testreg), size: 32
16
+ end
17
+ result_comment = "transaction result: #{result}"
18
+ ss result_comment
19
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen_link
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Derouen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-05 00:00:00.000000000 Z
11
+ date: 2016-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
@@ -95,6 +95,8 @@ files:
95
95
  - config/version.rb
96
96
  - lib/origen_link.rb
97
97
  - lib/origen_link/callback_handlers.rb
98
+ - lib/origen_link/capture_support.rb
99
+ - lib/origen_link/configuration_commands.rb
98
100
  - lib/origen_link/server/jtag.rb
99
101
  - lib/origen_link/server/pin.rb
100
102
  - lib/origen_link/server/sequencer.rb
@@ -106,8 +108,10 @@ files:
106
108
  - lib/tasks/origen_link.rake
107
109
  - pattern/example.rb
108
110
  - pattern/jtag_100_operations.rb
111
+ - pattern/jtag_capture_id.rb
109
112
  - pattern/jtag_comm_fail_test.rb
110
113
  - pattern/jtag_comm_test.rb
114
+ - pattern/transaction_test.rb
111
115
  - templates/web/index.md.erb
112
116
  - templates/web/layouts/_basic.html.erb
113
117
  - templates/web/partials/_navbar.html.erb
@@ -131,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
135
  version: 1.8.11
132
136
  requirements: []
133
137
  rubyforge_project:
134
- rubygems_version: 2.6.2
138
+ rubygems_version: 2.2.2
135
139
  signing_key:
136
140
  specification_version: 4
137
141
  summary: Origen interface to a live DUT tester