origen_jtag 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9920632e33d08faa8fb93b0ecdd6af4e593e888a
4
- data.tar.gz: bc0fc81b5fcbcb71ccd669ea535f4ea80a6dc1c3
3
+ metadata.gz: 02b837da449c42cd29928bf58d3f793a1e9f7e45
4
+ data.tar.gz: 671bab411d61f7b7b14e1a9bc52c88b4f27345f6
5
5
  SHA512:
6
- metadata.gz: 5ecb02a03b825efa5787a0a3208603c0e92ba90192551420ff9466aa2dead851b4daf4d04e81fd70fda5021dee58a4b5e1f71c6eaceabcbc4106a321517d7d66
7
- data.tar.gz: 11e95ae8171b60984b8627ac51f9773d8604105bc28cb44f2d515b6b7a3ee8c78e8c2f4573871e7aa13cef78440bf62ca56df7a9d15f8b00fa0e6ff55b726566
6
+ metadata.gz: c8b11e4b45bf3d52e6c2044c5e92c13b2b5bce3e7a97d0a27d97dc613fedbdca7fd403c23e614bc2d4a326a480c7e5766ab8c10b1f8cfb69890a6d4fc8db5b81
7
+ data.tar.gz: eceb297fc81700389c1edef3f99b5574a4019240c934366bf5b25eb918824b9daf0ce3dc909cff4da95e51c3d8bb0a59b1fe7ac9a0b246834b0457247cc0a89f
data/config/boot.rb ADDED
@@ -0,0 +1,24 @@
1
+ # This file is used to boot your plugin when it is running in standalone mode
2
+ # from its own workspace - i.e. when the plugin is being developed.
3
+ #
4
+ # It will not be loaded when the plugin is imported by a 3rd party app - in that
5
+ # case only lib/origen_jtag.rb is loaded.
6
+ #
7
+ # Therefore this file can be used to load anything extra that you need to boot
8
+ # the development environment for this app. For example this is typically used
9
+ # to load some additional test classes to use your plugin APIs so that they can
10
+ # be tested and/or interacted with in the console.
11
+ require 'origen_jtag'
12
+
13
+ module OrigenJTAGDev
14
+ # Example of how to explicitly require a file
15
+ # require "origen_jtag_dev/my_file"
16
+
17
+ # Load all files in the lib/origen_jtag_dev directory.
18
+ # Note that there is no problem from requiring a file twice (Ruby will ignore
19
+ # the second require), so if you have a file that must be required first, then
20
+ # explicitly require it up above and then let this take care of the rest.
21
+ Dir.glob("#{File.dirname(__FILE__)}/../lib/origen_jtag_dev/**/*.rb").sort.each do |file|
22
+ require file
23
+ end
24
+ end
data/config/commands.rb CHANGED
@@ -18,27 +18,32 @@ aliases ={
18
18
  case @command
19
19
 
20
20
  ## Run the unit tests
21
- #when "specs"
22
- # require "rspec"
23
- # exit RSpec::Core::Runner.run(['spec'])
21
+ when "specs"
22
+ require "rspec"
23
+ exit RSpec::Core::Runner.run(['spec'])
24
24
 
25
- when "examples"
25
+ when "examples", "test"
26
26
  Origen.load_application
27
27
  status = 0
28
28
 
29
29
  # Pattern generator tests
30
- ARGV = %w(jtag_workout -t v93k.rb -r approved)
30
+ ARGV = %w(jtag_workout -t debug_RH1 -e v93k -r approved)
31
31
  load "#{Origen.top}/lib/origen/commands/generate.rb"
32
- ARGV = %w(jtag_workout -t debug_RH1 -r approved)
32
+ ARGV = %w(jtag_workout -t debug_RH1 -e j750.rb -r approved)
33
33
  load "#{Origen.top}/lib/origen/commands/generate.rb"
34
- ARGV = %w(jtag_workout -t debug_RL1 -r approved)
34
+ ARGV = %w(jtag_workout -t debug_RL1 -e j750.rb -r approved)
35
35
  load "#{Origen.top}/lib/origen/commands/generate.rb"
36
36
 
37
- ARGV = %w(jtag_workout -t v93k_RH4.rb -r approved)
37
+ ARGV = %w(jtag_workout -t debug_RH2.rb -e j750.rb -r approved)
38
38
  load "#{Origen.top}/lib/origen/commands/generate.rb"
39
- ARGV = %w(jtag_workout -t debug_RH4 -r approved)
39
+ ARGV = %w(jtag_workout -t debug_RH2_1.rb -e j750.rb -r approved)
40
40
  load "#{Origen.top}/lib/origen/commands/generate.rb"
41
- ARGV = %w(jtag_workout -t debug_RL4 -r approved)
41
+
42
+ ARGV = %w(jtag_workout -t debug_RH4 -e v93k -r approved)
43
+ load "#{Origen.top}/lib/origen/commands/generate.rb"
44
+ ARGV = %w(jtag_workout -t debug_RH4 -e j750.rb -r approved)
45
+ load "#{Origen.top}/lib/origen/commands/generate.rb"
46
+ ARGV = %w(jtag_workout -t debug_RL4 -e j750.rb -r approved)
42
47
  load "#{Origen.top}/lib/origen/commands/generate.rb"
43
48
 
44
49
  if Origen.app.stats.changed_files == 0 &&
@@ -52,6 +57,12 @@ when "examples"
52
57
  status = 1
53
58
  end
54
59
  puts
60
+ if @command == "test"
61
+ Origen.app.unload_target!
62
+ require "rspec"
63
+ result = RSpec::Core::Runner.run(['spec'])
64
+ status = status == 1 ? 1 : result
65
+ end
55
66
  exit status
56
67
 
57
68
  # Always leave an else clause to allow control to fall back through to the
@@ -61,7 +72,9 @@ when "examples"
61
72
  # before handing control back to Origen. Un-comment the example below to get started.
62
73
  else
63
74
  @application_commands = <<-EOT
75
+ specs Run the specs (tests), -c will enable coverage
64
76
  examples Run the examples (tests), -c will enable coverage
77
+ test Run both specs and examples, -c will enable coverage
65
78
  EOT
66
79
 
67
80
  end
data/config/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module OrigenJTAG
2
2
  MAJOR = 0
3
- MINOR = 13
3
+ MINOR = 14
4
4
  BUGFIX = 0
5
5
  DEV = nil
6
6
 
@@ -42,7 +42,7 @@ module OrigenJTAG
42
42
  # Fallback defaults
43
43
  options = {
44
44
  verbose: false,
45
- tclk_format: :rh, # format of JTAG clock used: ReturnHigh (:rh), ReturnLo (:rl)
45
+ tclk_format: :rh, # format of JTAG clock used: ReturnHigh (:rh), ReturnLo (:rl)
46
46
  tclk_multiple: 1, # number of cycles for one clock pulse, assumes 50% duty cycle. Uses tester non-return format to spread TCK across multiple cycles.
47
47
  # e.g. @tclk_multiple = 2, @tclk_format = :rh, means one cycle with Tck low (non-return), one with Tck high (NR)
48
48
  # @tclk_multiple = 4, @tclk_format = :rl, means 2 cycles with Tck high (NR), 2 with Tck low (NR)
@@ -108,111 +108,91 @@ module OrigenJTAG
108
108
  includes_last_bit: true,
109
109
  no_subr: false # do not use subroutine for any overlay
110
110
  }.merge(options)
111
+
112
+ # save compression state for restoring afterwards
113
+ compression_on = !Origen.tester.dont_compress
114
+
115
+ # clean incoming data
111
116
  size = extract_size(reg_or_val, options)
117
+ tdi_reg = extract_shift_in_data(reg_or_val, size, options)
118
+ tdo_reg = extract_shift_out_data(reg_or_val, size, options)
119
+ global_ovl, ovl_reg = extract_overlay_data(reg_or_val, size, options)
120
+
121
+ # tester does not support direct labels, so can't do
112
122
  if options[:no_subr] && !$tester.respond_to?('label')
113
- # tester does not support direct labels, so can't do
114
123
  cc 'This tester does not support use of labels, cannot do no_subr option as requested'
115
124
  cc ' going with subroutine overlay instead'
116
125
  options[:no_subr] = false
117
126
  end
118
- if options.key?(:arm_debug_comment)
119
- cc options[:arm_debug_comment]
120
- end
121
- if options.key?(:arm_debug_overlay)
122
- $tester.label(options[:arm_debug_overlay])
127
+
128
+ # insert global label if specified
129
+ if global_ovl
130
+ if $tester.respond_to?('label')
131
+ $tester.label(global_ovl, true)
132
+ else
133
+ cc "Unsupported global label: #{global_ovl}"
134
+ end
123
135
  end
124
- size = extract_size(reg_or_val, options)
125
- contains_bits = (contains_bits?(reg_or_val) || is_a_bit?(reg_or_val))
126
- owner.pin(:tdi).drive(0) # Drive state when reading out
127
- owner.pin(:tms).drive(0)
136
+
137
+ # loop through each data bit
128
138
  last_overlay_label = ''
129
139
  size.times do |i|
130
- call_subroutine = false
131
- direct_overlay = false
132
- if options[:read]
133
- # If it's a register support bit-wise reads
134
- if contains_bits
135
- if reg_or_val[i]
136
- if reg_or_val[i].is_to_be_stored?
137
- Origen.tester.store_next_cycle(owner.pin(:tdo))
138
- owner.pin(:tdo).dont_care if Origen.tester.j750?
139
- elsif reg_or_val[i].has_overlay?
140
- if Origen.mode.simulation?
141
- owner.pin(:tdo).dont_care
142
- else
143
- if options[:no_subr]
144
- Origen.tester.dont_compress = true
145
- if reg_or_val[i].overlay_str != last_overlay_label
146
- $tester.label(reg_or_val[i].overlay_str)
147
- last_overlay_label = reg_or_val[i].overlay_str
148
- end
149
- owner.pin(:tdo).assert(reg_or_val[i] ? reg_or_val[i] : 0)
150
- else
151
- call_subroutine = reg_or_val[i].overlay_str
152
- end
153
- end
154
- elsif reg_or_val[i].is_to_be_read?
155
- owner.pin(:tdo).assert(reg_or_val[i] ? reg_or_val[i] : 0)
156
- elsif options.key?(:compare_data)
157
- if i.eql?(0) || i.eql?(1) || i.eql?(2)
158
- # Skip comparing first three status bits
159
- owner.pin(:tdo).dont_care
160
- else
161
- owner.pin(:tdo).assert(reg_or_val[i] ? reg_or_val[i] : 0)
162
- end
163
- else
164
- owner.pin(:tdo).dont_care
165
- end
166
- # If the read width extends beyond the register boundary, don't care
167
- # the extra bits
168
- else
169
- owner.pin(:tdo).dont_care
170
- end
171
- # Otherwise read the whole thing
172
- else
173
- Origen.tester.dont_compress = false
174
- owner.pin(:tdo).assert(reg_or_val[i] ? reg_or_val[i] : 0)
140
+ store_tdo_this_tclk = false
141
+
142
+ # Set up pin actions for bit transaction (tclk cycle)
143
+
144
+ # TDI
145
+ owner.pin(:tdi).drive(tdi_reg[i])
146
+
147
+ # TDO
148
+ owner.pin(:tdo).dont_care # default setting
149
+ if tdo_reg[i]
150
+ if tdo_reg[i].is_to_be_stored? # store
151
+ store_tdo_this_tclk = true
152
+ owner.pin(:tdo).dont_care if Origen.tester.j750?
153
+ elsif tdo_reg[i].is_to_be_read? # compare/assert
154
+ owner.pin(:tdo).assert(tdo_reg[i])
175
155
  end
176
- else
177
- if contains_bits && reg_or_val[i] && reg_or_val[i].has_overlay?
178
- if Origen.mode.simulation?
179
- owner.pin(:tdi).drive(reg_or_val[i] ? reg_or_val[i] : 0)
180
- else
181
- if options[:no_subr]
182
- Origen.tester.dont_compress = true
183
- if reg_or_val[i].overlay_str != last_overlay_label
184
- $tester.label(reg_or_val[i].overlay_str)
185
- last_overlay_label = reg_or_val[i].overlay_str
186
- end
187
- owner.pin(:tdi).drive(reg_or_val[i] ? reg_or_val[i] : 0)
188
- else
189
- call_subroutine = reg_or_val[i].overlay_str
190
- end
191
- end
192
- elsif options.key?(:arm_debug_overlay)
193
- if Origen.mode.simulation?
194
- owner.pin(:tdi).drive(reg_or_val[i] ? reg_or_val[i] : 0)
195
- else
196
- $tester.label('// JTAG DATA Pin: ' + i.to_s)
197
- owner.pin(:tdi).drive(reg_or_val[i] ? reg_or_val[i] : 0)
156
+ end
157
+
158
+ # TMS
159
+ owner.pin(:tms).drive(0)
160
+
161
+ # Overlay - reconfigure pin action for overlay if necessary
162
+ if ovl_reg[i] && ovl_reg[i].has_overlay? && !Origen.mode.simulation?
163
+ if options[:no_subr]
164
+ Origen.tester.dont_compress = true
165
+ if ovl_reg[i].overlay_str != last_overlay_label
166
+ $tester.label(ovl_reg[i].overlay_str)
167
+ last_overlay_label = ovl_reg[i].overlay_str
198
168
  end
169
+ owner.pin(:tdo).assert(tdo_reg[i]) if options[:read]
199
170
  else
200
- Origen.tester.dont_compress = false
201
- owner.pin(:tdi).drive(reg_or_val[i] ? reg_or_val[i] : 0)
171
+ owner.pin(:tdi).drive(0)
172
+ call_subroutine = ovl_reg[i].overlay_str
202
173
  end
203
174
  end
175
+
176
+ # With JTAG pin actions queued up, use block call to tclk_cycle to
177
+ # execute a single TCLK period. Special handling of subroutines,
178
+ # case of last bit in shift, and store vector (within a multi-cycle
179
+ # tclk config).
204
180
  if call_subroutine
205
181
  Origen.tester.call_subroutine(call_subroutine)
206
182
  @last_data_vector_shifted = true
207
183
  else
208
184
  @last_data_vector_shifted = false
209
- # Don't latch the last bit, that will be done when
210
- # leaving the state.
185
+ @next_data_vector_to_be_stored = false
186
+
187
+ # Don't latch the last bit, that will be done when leaving the state.
211
188
  if i != size - 1 || options[:cycle_last]
212
189
  if i == size - 1 && options[:includes_last_bit]
213
190
  owner.pin(:tms).drive(1)
214
191
  end
215
192
  tclk_cycle do
193
+ if store_tdo_this_tclk && @next_data_vector_to_be_stored
194
+ Origen.tester.store_next_cycle(owner.pin(:tdo))
195
+ end
216
196
  Origen.tester.cycle
217
197
  end
218
198
  owner.pin(:tdo).dont_care
@@ -221,11 +201,12 @@ module OrigenJTAG
221
201
  end
222
202
  end
223
203
  end
224
- # Clear read and similar flags to reflect that the request has just
225
- # been fulfilled
204
+
205
+ # Clear read and similar flags to reflect that the request has just been fulfilled
226
206
  reg_or_val.clear_flags if reg_or_val.respond_to?(:clear_flags)
207
+
227
208
  # put back compression if turned on above
228
- Origen.tester.dont_compress = false
209
+ Origen.tester.dont_compress = false if compression_on
229
210
  end
230
211
 
231
212
  # Cycles the tester through one TCLK cycle
@@ -250,7 +231,7 @@ module OrigenJTAG
250
231
  mask_tdo_half1 = ((@tclk_format == :rl) && (@tdo_strobe == :tclk_high) && (@tclk_multiple > 1)) ||
251
232
  ((@tclk_format == :rh) && (@tdo_strobe == :tclk_low) && (@tclk_multiple > 1))
252
233
 
253
- # determine whether TDO is set to capture for this TCK cycle
234
+ # determine whether TDO is set to capture for this TCLK cycle
254
235
  tdo_to_be_captured = owner.pin(:tdo).to_be_captured?
255
236
 
256
237
  # If TDO is already suspended (by an application) then don't do the
@@ -260,9 +241,7 @@ module OrigenJTAG
260
241
  @tclk_multiple.times do |i|
261
242
  # 50% duty cycle if @tclk_multiple is even, otherwise slightly off
262
243
 
263
- if tdo_to_be_captured
264
- owner.pin(:tdo).state = @tdo_store_cycle == i ? :capture : :dont_care
265
- end
244
+ @next_data_vector_to_be_stored = @tdo_store_cycle == i ? true : false
266
245
 
267
246
  if i < (@tclk_multiple + 1) / 2
268
247
  # first half of cycle
@@ -340,9 +319,6 @@ module OrigenJTAG
340
319
  end
341
320
  val = reg_or_val.respond_to?(:data) ? reg_or_val.data : reg_or_val
342
321
  shift_dr(write: val.to_hex) do
343
- if options[:overlay] == true
344
- $tester.label(options[:overlay_label], true) # apply global label
345
- end
346
322
  shift(reg_or_val, options)
347
323
  end
348
324
  end
@@ -376,9 +352,6 @@ module OrigenJTAG
376
352
  cc "#{options[:msg]}\n"
377
353
  end
378
354
  shift_dr(read: Origen::Utility.read_hex(reg_or_val)) do
379
- if options[:overlay] == true
380
- $tester.label(options[:overlay_label], true) # apply global label
381
- end
382
355
  shift(reg_or_val, options)
383
356
  end
384
357
  end
@@ -456,6 +429,8 @@ module OrigenJTAG
456
429
 
457
430
  private
458
431
 
432
+ # Return size of transaction. Options[:size] has priority and need not match the
433
+ # register size. Any mismatch will be handled by the api.
459
434
  def extract_size(reg_or_val, options = {})
460
435
  size = options[:size]
461
436
  unless size
@@ -468,6 +443,84 @@ module OrigenJTAG
468
443
  size
469
444
  end
470
445
 
446
+ # Combine any legacy options into a single global overlay and create
447
+ # new bit collection to track any bit-wise overlays.
448
+ def extract_overlay_data(reg_or_val, size, options = {})
449
+ if reg_or_val.respond_to?(:data)
450
+ ovl = reg_or_val.dup
451
+ else
452
+ ovl = Reg.dummy(size)
453
+ end
454
+
455
+ if options[:overlay]
456
+ global = options[:overlay_label]
457
+ elsif options.key?(:arm_debug_overlay) # prob don't need this anymore
458
+ global = options[:arm_debug_overlay] # prob don't need this anymore
459
+ else
460
+ global = nil
461
+ end
462
+
463
+ [global, ovl]
464
+ end
465
+
466
+ # Create data that will be shifted in on TDI, create new bit collection
467
+ # on the fly if reg_or_val arg is data only. Consider read operation
468
+ # where caller has requested (specific) shift in data to be used.
469
+ def extract_shift_in_data(reg_or_val, size, options = {})
470
+ if reg_or_val.respond_to?(:data)
471
+ if options[:read]
472
+ data = options[:shift_in_data] || 0
473
+ tdi = Reg.dummy(size)
474
+ tdi.write(data)
475
+ else
476
+ tdi = reg_or_val.dup
477
+ end
478
+ else
479
+ # Not a register model, so can't support bit-wise overlay
480
+ tdi = Reg.dummy(size)
481
+ if options[:read]
482
+ data = options[:shift_in_data] || 0
483
+ tdi.write(data)
484
+ else
485
+ tdi.write(reg_or_val)
486
+ end
487
+ end
488
+ tdi
489
+ end
490
+
491
+ # Create data that will be shifted out on TDO, create new bit collection
492
+ # on the fly if reg_or_val arg is data only. Consider write operation
493
+ # where caller has requested (specific) shift out data to be compared.
494
+ def extract_shift_out_data(reg_or_val, size, options = {})
495
+ if reg_or_val.respond_to?(:data)
496
+ if options[:read]
497
+ tdo = reg_or_val.dup
498
+ else
499
+ tdo = Reg.dummy(size)
500
+ if options[:shift_out_data]
501
+ tdo.write(options[:shift_out_data])
502
+ tdo.read
503
+ else
504
+ tdo.write(0)
505
+ end
506
+ end
507
+ else
508
+ tdo = Reg.dummy(size)
509
+ if options[:read]
510
+ tdo.write(reg_or_val)
511
+ tdo.read
512
+ else
513
+ if options[:shift_out_data]
514
+ tdo.write(options[:shift_out_data])
515
+ tdo.read
516
+ else
517
+ tdo.write(0)
518
+ end
519
+ end
520
+ end
521
+ tdo
522
+ end
523
+
471
524
  # Validates that the parent object (the owner) has defined the necessary
472
525
  # pins to implement the JTAG
473
526
  def validate_pins
@@ -1,14 +1,14 @@
1
- module OrigenJTAG
1
+ module OrigenJTAGDev
2
2
  # This is a dummy DUT model which is used
3
3
  # to instantiate and test the JTAG locally
4
4
  # during development.
5
5
  #
6
6
  # It is not included when this library is imported.
7
7
  class DUT
8
+ include Origen::TopLevel
8
9
  include OrigenJTAG
9
- include Origen::Callbacks
10
- include Origen::Registers
11
- include Origen::Pins
10
+
11
+ attr_reader :jtag_config
12
12
 
13
13
  JTAG_CONFIG = {
14
14
  verbose: true,
@@ -25,40 +25,66 @@ module OrigenJTAG
25
25
  JTAG_CONFIG[:tdo_strobe] = options[:tdo_strobe] if options[:tdo_strobe]
26
26
  JTAG_CONFIG[:tdo_store_cycle] = options[:tdo_store_cycle] if options[:tdo_store_cycle]
27
27
  JTAG_CONFIG[:init_state] = options[:init_state] if options[:init_state]
28
+
29
+ instantiate_registers(options)
30
+ instantiate_pins(options)
31
+ end
32
+
33
+ def instantiate_registers(options = {})
34
+ reg :test16, 0x0012, size: 16 do |reg|
35
+ reg.bit 15..8, :bus
36
+ reg.bit 0, :bit
37
+ end
38
+
39
+ reg :test32, 0x0014, size: 32 do |reg|
40
+ reg.bit 31..16, :bus
41
+ reg.bit 0, :bit
42
+ end
28
43
  end
29
44
 
45
+ def instantiate_pins(options = {})
46
+ add_pin :tclk
47
+ add_pin :tdi
48
+ add_pin :tdo
49
+ add_pin :tms
50
+ end
51
+
52
+ def startup(options = {})
53
+ tester.set_timeset('nvmbist', 40)
54
+ end
55
+
56
+ # Getter for top-level tclk_format setting
30
57
  def tclk_format
31
58
  JTAG_CONFIG[:tclk_format]
32
59
  end
33
60
 
61
+ # Getter for top-level tclk_multiple setting
34
62
  def tclk_multiple
35
63
  JTAG_CONFIG[:tclk_multiple]
36
64
  end
37
65
 
66
+ # Getter for top-level tdo_strobe setting
38
67
  def tdo_strobe
39
68
  JTAG_CONFIG[:tdo_strobe]
40
69
  end
41
70
 
71
+ # Getter for top-level tdo_store_cycle setting
42
72
  def tdo_store_cycle
43
73
  JTAG_CONFIG[:tdo_store_cycle]
44
74
  end
45
75
 
76
+ # Getter for top-level init_state setting
46
77
  def init_state
47
78
  JTAG_CONFIG[:init_state]
48
79
  end
49
80
 
50
- def on_create
51
- add_reg :test16, 0x0012, 16, bus: { pos: 8, bits: 8 },
52
- bit: { pos: 0 }
53
-
54
- add_reg :test32, 0x0014, 32, bus: { pos: 16, bits: 16 },
55
- bit: { pos: 0 }
56
-
57
- $tester.set_timeset('nvmbist', 40)
58
- add_pin :tclk
59
- add_pin :tdi
60
- add_pin :tdo
61
- add_pin :tms
81
+ # Wouldn't want to do this in reality, but allows some flexibility duing gem testing
82
+ def update_jtag_config(cfg, val)
83
+ if JTAG_CONFIG.key?(cfg)
84
+ JTAG_CONFIG[cfg] = val
85
+ else
86
+ fail "#{cfg} not a part of JTAG_CONFIG"
87
+ end
62
88
  end
63
89
  end
64
90
  end
@@ -1,4 +1,7 @@
1
- Pattern.create(options={:name => "jtag_workout_#{$dut.tclk_format.upcase}#{$dut.tclk_multiple}"}) do
1
+ pat_name = "jtag_workout_#{$dut.tclk_format.upcase}#{$dut.tclk_multiple}"
2
+ pat_name = pat_name + "_#{dut.tdo_store_cycle}" if dut.tdo_store_cycle != 0
3
+
4
+ Pattern.create(options = { name: pat_name }) do
2
5
  def test(msg)
3
6
  ss "Test - #{msg}"
4
7
  end
@@ -8,185 +11,190 @@ Pattern.create(options={:name => "jtag_workout_#{$dut.tclk_format.upcase}#{$dut.
8
11
 
9
12
  # First tests of the TAP Controller
10
13
 
11
- test "Transition TAP controller in and out of Shift-DR"
12
- jtag.shift_dr { }
14
+ test 'Transition TAP controller in and out of Shift-DR'
15
+ jtag.shift_dr {}
13
16
 
14
- test "Transition TAP controller in and out of Pause-DR"
15
- jtag.pause_dr { }
17
+ test 'Transition TAP controller in and out of Pause-DR'
18
+ jtag.pause_dr {}
16
19
 
17
- test "Transition TAP controller in and out of Shift-IR"
18
- jtag.shift_ir { }
20
+ test 'Transition TAP controller in and out of Shift-IR'
21
+ jtag.shift_ir {}
19
22
 
20
- test "Transition TAP controller in and out of Pause-IR"
21
- jtag.pause_ir { }
23
+ test 'Transition TAP controller in and out of Pause-IR'
24
+ jtag.pause_ir {}
22
25
 
23
- test "Transition into Shift-DR, then back and forth into Pause-DR"
26
+ test 'Transition into Shift-DR, then back and forth into Pause-DR'
24
27
  jtag.shift_dr do
25
- jtag.pause_dr { }
26
- jtag.pause_dr { }
28
+ jtag.pause_dr {}
29
+ jtag.pause_dr {}
27
30
  end
28
31
 
29
- test "Transition into Pause-DR, then back and forth into Shift-DR"
32
+ test 'Transition into Pause-DR, then back and forth into Shift-DR'
30
33
  jtag.pause_dr do
31
- jtag.shift_dr { }
32
- jtag.shift_dr { }
34
+ jtag.shift_dr {}
35
+ jtag.shift_dr {}
33
36
  end
34
-
35
- test "Transition into Shift-IR, then back and forth into Pause-IR"
37
+
38
+ test 'Transition into Shift-IR, then back and forth into Pause-IR'
36
39
  jtag.shift_ir do
37
- jtag.pause_ir { }
38
- jtag.pause_ir { }
40
+ jtag.pause_ir {}
41
+ jtag.pause_ir {}
39
42
  end
40
43
 
41
- test "Transition into Pause-IR, then back and forth into Shift-IR"
44
+ test 'Transition into Pause-IR, then back and forth into Shift-IR'
42
45
  jtag.pause_ir do
43
- jtag.shift_ir { }
44
- jtag.shift_ir { }
46
+ jtag.shift_ir {}
47
+ jtag.shift_ir {}
45
48
  end
46
49
 
47
50
  # Tests of the shift method, make sure it handles registers with
48
51
  # bit-level flags set in additional to dumb values
49
52
 
50
- test "Shifting an explicit value into TDI"
51
- jtag.shift 0x1234, :size => 16, :cycle_last => true
52
-
53
- test "Shifting an explicit value out of TDO"
54
- jtag.shift 0x1234, :size => 16, :cycle_last => true, :read => true
55
-
56
- test "Shift register into TDI"
57
- reg.write(0xFF01)
58
- cc "Full register (16 bits)"
59
- jtag.shift reg, :cycle_last => true
60
- cc "Full register with additional size (32 bits)"
61
- jtag.shift reg, :cycle_last => true, :size => 32
62
- cc "Full register with reduced size (8 bits)"
63
- jtag.shift reg, :cycle_last => true, :size => 8, :includes_last_bit => false
64
-
65
- test "Shift register into TDI with overlay"
66
- reg.overlay("write_overlay")
67
- cc "Full register (16 bits)"
68
- Origen.tester.cycle # Give a padding cycle as a place for the subroutine call to go
69
- jtag.shift reg, :cycle_last => true
70
- cc "Full register with additional size (32 bits)"
71
- Origen.tester.cycle # Give a padding cycle as a place for the subroutine call to go
72
- jtag.shift reg, :cycle_last => true, :size => 32
73
- cc "Full register with reduced size (8 bits)"
74
- Origen.tester.cycle # Give a padding cycle as a place for the subroutine call to go
75
- jtag.shift reg, :cycle_last => true, :size => 8, :includes_last_bit => false
76
- cc "It should in-line overlays when running in simulation mode"
77
- Origen.mode = :simulation
78
- Origen.tester.cycle # Give a padding cycle as a place for the subroutine call to go
79
- jtag.shift reg, :cycle_last => true
80
- Origen.mode = :debug
81
- if $tester.respond_to?('label')
82
- cc "Full register overlay without using subroutine"
83
- jtag.shift reg, :cycle_last => true, :no_subr => true
84
- end
85
-
86
- test "Shift register into TDI with single bit overlay"
87
- reg.overlay(nil)
88
- reg.bit(:bit).overlay("write_overlay2")
89
- Origen.tester.cycle # Give a padding cycle as a place for the subroutine call to go
90
- jtag.shift reg, :cycle_last => true
91
- reg.overlay(nil)
92
-
93
- test "Read register out of TDO"
94
- cc "Full register (16 bits)"
95
- reg.read
96
- jtag.shift reg, :cycle_last => true, :read => true
97
- cc "Full register with additional size (32 bits)"
98
- reg.read
99
- jtag.shift reg, :cycle_last => true, :size => 32, :read => true
100
- cc "Full register with reduced size (8 bits)"
101
- reg.read
102
- jtag.shift reg, :cycle_last => true, :size => 8, :read => true, :includes_last_bit => false
103
-
104
- test "Read single bit out of TDO"
105
- reg.bit(:bit).read
106
- jtag.shift reg, :cycle_last => true, :read => true
107
-
108
- test "Store register out of TDO"
109
- cc "Full register (16 bits)"
110
- reg.store
111
- jtag.shift reg, :cycle_last => true, :read => true
112
- cc "Full register with additional size (32 bits)"
113
- reg.store
114
- jtag.shift reg, :cycle_last => true, :size => 32, :read => true
115
- cc "Full register with reduced size (8 bits)"
116
- reg.store
117
- jtag.shift reg, :cycle_last => true, :size => 8, :read => true, :includes_last_bit => false
118
-
119
- test "Store single bit out of TDO"
120
- reg.bit(:bit).store
121
- jtag.shift reg, :cycle_last => true, :read => true
122
-
123
- test "Test flag clear, bit 0 should be read, but not stored"
124
- reg.bit(:bit).read
125
- jtag.shift reg, :cycle_last => true, :read => true
126
-
127
- test "Shift register out of TDO with overlay"
128
- reg.overlay("read_overlay")
129
- cc "Full register (16 bits)"
130
- Origen.tester.cycle # Give a padding cycle as a place for the subroutine call to go
131
- jtag.shift reg, :cycle_last => true, :read => true
132
- cc "Full register with additional size (32 bits)"
133
- Origen.tester.cycle # Give a padding cycle as a place for the subroutine call to go
134
- jtag.shift reg, :cycle_last => true, :size => 32, :read => true
135
- cc "Full register with reduced size (8 bits)"
136
- Origen.tester.cycle # Give a padding cycle as a place for the subroutine call to go
137
- jtag.shift reg, :cycle_last => true, :size => 8, :read => true, :includes_last_bit => false
138
- cc "It should in-line overlays when running in simulation mode"
139
- Origen.mode = :simulation
140
- Origen.tester.cycle # Give a padding cycle as a place for the subroutine call to go
141
- jtag.shift reg, :cycle_last => true, :read => true
142
- Origen.mode = :debug
143
- if $tester.respond_to?('label')
144
- cc "Full register overlay without using subroutine"
145
- jtag.shift reg, :cycle_last => true, :read => true, :no_subr => true
146
- end
147
-
148
- test "Shift register out of TDO with single bit overlay"
149
- reg.overlay(nil)
150
- reg.bit(:bit).overlay("read_overlay2")
151
- Origen.tester.cycle # Give a padding cycle as a place for the subroutine call to go
152
- jtag.shift reg, :cycle_last => true
153
- reg.overlay(nil)
53
+ test 'Shifting an explicit value into TDI'
54
+ jtag.shift 0x1234, size: 16, cycle_last: true
55
+
56
+ test 'Shifting an explicit value out of TDO'
57
+ jtag.shift 0x1234, size: 16, cycle_last: true, read: true
58
+
59
+ test 'Shift register into TDI'
60
+ reg.write(0xFF01)
61
+ cc 'Full register (16 bits)'
62
+ jtag.shift reg, cycle_last: true
63
+ cc 'Full register with additional size (32 bits)'
64
+ jtag.shift reg, cycle_last: true, size: 32
65
+ cc 'Full register with reduced size (8 bits)'
66
+ jtag.shift reg, cycle_last: true, size: 8, includes_last_bit: false
67
+
68
+ test 'Shift register into TDI with overlay'
69
+ reg.overlay('write_overlay')
70
+ cc 'Full register (16 bits)'
71
+ tester.cycle # Give a padding cycle as a place for the subroutine call to go
72
+ jtag.shift reg, cycle_last: true
73
+ cc 'Full register with additional size (32 bits)'
74
+ tester.cycle # Give a padding cycle as a place for the subroutine call to go
75
+ jtag.shift reg, cycle_last: true, size: 32
76
+ cc 'Full register with reduced size (8 bits)'
77
+ tester.cycle # Give a padding cycle as a place for the subroutine call to go
78
+ jtag.shift reg, cycle_last: true, size: 8, includes_last_bit: false
79
+ cc 'It should in-line overlays when running in simulation mode'
80
+ Origen.mode = :simulation
81
+ tester.cycle # Give a padding cycle as a place for the subroutine call to go
82
+ jtag.shift reg, cycle_last: true
83
+ Origen.mode = :debug
84
+ if tester.respond_to?('label')
85
+ cc 'Full register overlay without using subroutine'
86
+ jtag.shift reg, cycle_last: true, no_subr: true
87
+ end
88
+
89
+ test 'Shift register into TDI with single bit overlay'
90
+ reg.overlay(nil)
91
+ reg.bit(:bit).overlay('write_overlay2')
92
+ tester.cycle # Give a padding cycle as a place for the subroutine call to go
93
+ jtag.shift reg, cycle_last: true
94
+ reg.overlay(nil)
95
+
96
+ test 'Read register out of TDO'
97
+ cc 'Full register (16 bits)'
98
+ reg.read
99
+ jtag.shift reg, cycle_last: true, read: true
100
+ cc 'Full register with additional size (32 bits)'
101
+ reg.read
102
+ jtag.shift reg, cycle_last: true, size: 32, read: true
103
+ cc 'Full register with reduced size (8 bits)'
104
+ reg.read
105
+ jtag.shift reg, cycle_last: true, size: 8, read: true, includes_last_bit: false
106
+
107
+ test 'Read single bit out of TDO'
108
+ reg.bit(:bit).read
109
+ jtag.shift reg, cycle_last: true, read: true
110
+
111
+ test 'Store register out of TDO'
112
+ cc 'Full register (16 bits)'
113
+ reg.store
114
+ jtag.shift reg, cycle_last: true, read: true
115
+ cc 'Full register with additional size (32 bits)'
116
+ reg.store
117
+ jtag.shift reg, cycle_last: true, size: 32, read: true
118
+ cc 'Full register with reduced size (8 bits)'
119
+ reg.store
120
+ jtag.shift reg, cycle_last: true, size: 8, read: true, includes_last_bit: false
121
+
122
+ test 'Store single bit out of TDO'
123
+ reg.bit(:bit).store
124
+ jtag.shift reg, cycle_last: true, read: true
125
+
126
+ test 'Test flag clear, bit 0 should be read, but not stored'
127
+ reg.bit(:bit).read
128
+ jtag.shift reg, cycle_last: true, read: true
129
+
130
+ test 'Shift register out of TDO with overlay'
131
+ reg.overlay('read_overlay')
132
+ cc 'Full register (16 bits)'
133
+ tester.cycle # Give a padding cycle as a place for the subroutine call to go
134
+ jtag.shift reg, cycle_last: true, read: true
135
+ cc 'Full register with additional size (32 bits)'
136
+ tester.cycle # Give a padding cycle as a place for the subroutine call to go
137
+ jtag.shift reg, cycle_last: true, size: 32, read: true
138
+ cc 'Full register with reduced size (8 bits)'
139
+ tester.cycle # Give a padding cycle as a place for the subroutine call to go
140
+ jtag.shift reg, cycle_last: true, size: 8, read: true, includes_last_bit: false
141
+ cc 'It should in-line overlays when running in simulation mode'
142
+ Origen.mode = :simulation
143
+ tester.cycle # Give a padding cycle as a place for the subroutine call to go
144
+ jtag.shift reg, cycle_last: true, read: true
145
+ Origen.mode = :debug
146
+ if tester.respond_to?('label')
147
+ cc 'Full register overlay without using subroutine'
148
+ jtag.shift reg, cycle_last: true, read: true, no_subr: true
149
+ end
150
+
151
+ test 'Shift register out of TDO with single bit overlay'
152
+ reg.overlay(nil)
153
+ reg.bit(:bit).overlay('read_overlay2')
154
+ tester.cycle # Give a padding cycle as a place for the subroutine call to go
155
+ jtag.shift reg, cycle_last: true
156
+ reg.overlay(nil)
154
157
 
155
158
  # Finally integration tests of the TAPController + shift
156
159
 
157
- test "Write value into DR"
158
- jtag.write_dr 0xFFFF, :size => 16, :msg => "Write value into DR"
160
+ test 'Write value into DR'
161
+ jtag.write_dr 0xFFFF, size: 16, msg: 'Write value into DR'
159
162
 
160
- test "Write register into DR with full-width overlay"
161
- r = $dut.reg(:test32).overlay("write_overlay")
162
- jtag.write_dr r
163
+ test 'Write value into DR, with compare on TDO'
164
+ jtag.write_dr 0xFFFF, size: 16, shift_out_data: 0xAAAA, msg: 'Write value into DR'
163
165
 
164
- test "Read value out of DR"
165
- jtag.read_dr 0xFFFF, :size => 16, :msg => "Read value out of DR"
166
+ test 'Write register into DR with full-width overlay'
167
+ r = $dut.reg(:test32).overlay('write_overlay')
168
+ jtag.write_dr r
166
169
 
167
- test "Write value into IR"
168
- jtag.write_ir 0xF, :size => 4, :msg => "Write value into IR"
170
+ test 'Read value out of DR'
171
+ jtag.read_dr 0xFFFF, size: 16, msg: 'Read value out of DR'
169
172
 
170
- test "Read value out of IR"
171
- jtag.read_ir 0xF, :size => 4, :msg => "Read value out of IR"
173
+ test 'Read value out of DR, with specified shift in data into TDI'
174
+ jtag.read_dr 0xFFFF, size: 16, shift_in_data: 0x5555, msg: 'Read value out of DR'
172
175
 
173
- test "The IR value is tracked and duplicate writes are inhibited"
174
- jtag.write_ir 0xF, :size => 4
176
+ test 'Write value into IR'
177
+ jtag.write_ir 0xF, size: 4, msg: 'Write value into IR'
175
178
 
176
- test "Unless forced"
177
- jtag.write_ir 0xF, :size => 4, :force => true
179
+ test 'Read value out of IR'
180
+ jtag.read_ir 0xF, size: 4, msg: 'Read value out of IR'
178
181
 
179
- test "Reset"
180
- jtag.reset
182
+ test 'The IR value is tracked and duplicate writes are inhibited'
183
+ jtag.write_ir 0xF, size: 4
181
184
 
182
- test "Suspend of compare on TDO works"
183
- cc "TDO should be H"
184
- jtag.read_dr 0xFFFF, :size => 16, :msg => "Read value out of DR"
185
- $tester.ignore_fails($dut.pin(:tdo)) do
186
- cc "TDO should be X"
187
- jtag.read_dr 0xFFFF, :size => 16, :msg => "Read value out of DR"
188
- end
189
- cc "TDO should be H"
190
- jtag.read_dr 0xFFFF, :size => 16, :msg => "Read value out of DR"
191
-
185
+ test 'Unless forced'
186
+ jtag.write_ir 0xF, size: 4, force: true
187
+
188
+ test 'Reset'
189
+ jtag.reset
190
+
191
+ test 'Suspend of compare on TDO works'
192
+ cc 'TDO should be H'
193
+ jtag.read_dr 0xFFFF, size: 16, msg: 'Read value out of DR'
194
+ tester.ignore_fails($dut.pin(:tdo)) do
195
+ cc 'TDO should be X'
196
+ jtag.read_dr 0xFFFF, size: 16, msg: 'Read value out of DR'
197
+ end
198
+ cc 'TDO should be H'
199
+ jtag.read_dr 0xFFFF, size: 16, msg: 'Read value out of DR'
192
200
  end
@@ -82,14 +82,24 @@ These accept either an absolute data value or an Origen register/bit collection.
82
82
 
83
83
  ~~~ruby
84
84
  jtag.write_dr 0x1234, :size => 16
85
+
85
86
  # The size option is not required when a register is supplied
86
87
  jtag.write_dr $dut.reg(:clkdiv)
88
+
87
89
  # Although it can still be added if the register is not the full data width
88
90
  jtag.write_dr $dut.reg(:clkdiv), :size => 32
89
- # A rich read method is available which supports bit-level read, store and
90
- # overlay operations
91
+
92
+ # A rich read method is available which supports bit-level read, store and overlay operations
91
93
  $dut.reg(:clkdiv).bits(:div).read(0x55)
92
94
  jtag.read $dut.reg(:clkdiv)
95
+
96
+ # In cases where both shift in (TDI) and shift out data (TDO) are critical, (e.g. compare shift
97
+ # out data on a write, or shfit in specific data on a read) the shift_in_data and
98
+ # shift_out_data options can be specified. By default, TDO will be dont care on writes
99
+ # and TDI will be 0 on reads.
100
+ jtag.write_dr $dut.reg(:clkdiv), :shift_out_data => 0x4321
101
+ jtag.read_dr $udt.reg(:clkdiv), :shift_in_data => 0x5678
102
+
93
103
  # Similar methods exist for the instruction register
94
104
  jtag.write_ir 0x1F, :size => 5
95
105
  jtag.read_ir 0x1F, :size => 5
metadata CHANGED
@@ -1,19 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen_jtag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen McGinty
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-10 00:00:00.000000000 Z
11
+ date: 2017-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
17
20
  - - ">="
18
21
  - !ruby/object:Gem::Version
19
22
  version: 0.7.35
@@ -21,6 +24,9 @@ dependencies:
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.7'
24
30
  - - ">="
25
31
  - !ruby/object:Gem::Version
26
32
  version: 0.7.35
@@ -32,15 +38,14 @@ extensions: []
32
38
  extra_rdoc_files: []
33
39
  files:
34
40
  - config/application.rb
41
+ - config/boot.rb
35
42
  - config/commands.rb
36
43
  - config/development.rb
37
- - config/environment.rb
38
- - config/users.rb
39
44
  - config/version.rb
40
45
  - lib/origen_jtag.rb
41
46
  - lib/origen_jtag/driver.rb
42
- - lib/origen_jtag/dut.rb
43
47
  - lib/origen_jtag/tap_controller.rb
48
+ - lib/origen_jtag_dev/top_level.rb
44
49
  - pattern/jtag_workout.rb
45
50
  - templates/web/index.md.erb
46
51
  - templates/web/layouts/_basic.html.erb
@@ -1 +0,0 @@
1
- require "origen_jtag"
data/config/users.rb DELETED
@@ -1,19 +0,0 @@
1
- # This file defines the users associated with your project, it is basically the
2
- # mailing list for release notes.
3
- #
4
- # You can split your users into "admin" and "user" groups, the main difference
5
- # between the two is that admin users will get all tag emails, users will get
6
- # emails on external/official releases only.
7
- #
8
- # Users are also prohibited from running the "origen tag" task, but this is
9
- # really just to prevent a casual user from executing it inadvertently and is
10
- # not intended to be a serious security gate.
11
- module Origen
12
- module Users
13
- def users
14
- @users ||= [
15
-
16
- ]
17
- end
18
- end
19
- end