origen_arm_debug 0.8.2 → 0.8.3

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: 51010089bbe2d87a8b4713feccd7166c8e8bdf4f
4
- data.tar.gz: 475d651b5729ed5e9ddbb464ddd9031d8df745b6
3
+ metadata.gz: 856e1631d06c817c9ca0053ccd7c21e3c8c01162
4
+ data.tar.gz: 933943950a63f6373e326ab7b88240d6be6bd000
5
5
  SHA512:
6
- metadata.gz: db0564fdde20c3efb4108e387f57982040ec2d86c384932a110796040ff019bb796f010401cc957304be6176d8a708e9e9bbe51685c0b1f181fb2e6814bb8036
7
- data.tar.gz: e8774f46c2792a5fd1b4fe56a0494279062d0848b319372f0641530d4d47368771e59d1f309acfbd77151e5e2baec2c09d54df3ff9e2414c15da8521fd8e8fd5
6
+ metadata.gz: 6bcf6b796b955d29b8aaed2960265cf1a07993cef4ff747018735df53c10914bf291cd3c35203cab20db21bc8c2d9ba7e8b177e13a9f9adde55913a29039def9
7
+ data.tar.gz: 7dd18c6981b08f34574a6f92cc8791e57d5d3be63abdb840e6b2c7d88189c8f87ea36fbad2d8effcd6b37f8e4ad0ad8bf4446c2464f8f3369c50b22109899c7d
data/config/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module OrigenARMDebug
2
2
  MAJOR = 0
3
3
  MINOR = 8
4
- BUGFIX = 2
4
+ BUGFIX = 3
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -18,6 +18,12 @@ module OrigenARMDebug
18
18
  # to complete
19
19
  attr_accessor :acc_access_dly
20
20
 
21
+ # Customizable random number generator mode.
22
+ # compress: any uncompared data will be set to 0 when shifted out for better vector compression
23
+ # unrolled: any uncompared data will be set to 5 when shifted out for complete unrolling of JTAG data
24
+ # random: true random number generation, not ideal for pattern comparison
25
+ attr_accessor :random_mode
26
+
21
27
  # Initialize class variables
22
28
  #
23
29
  # @param [Object] owner Parent object
@@ -37,30 +43,35 @@ module OrigenARMDebug
37
43
  fail msg
38
44
  end
39
45
 
46
+ @random_mode = :compress
47
+
40
48
  @write_ap_dly = 8
41
49
  @acc_access_dly = 7
42
50
 
43
51
  @current_apaddr = 0
44
52
  @orundetect = 0
45
53
 
46
- add_reg :dpacc, 0x00, 35, rnw: { pos: 0 },
47
- a: { pos: 1, bits: 2 },
48
- data: { pos: 3, bits: 32 }
54
+ add_reg :ir, 0x00, 4, data: { pos: 0, bits: 4 } # ARM-JTAG Instruction Register
49
55
 
50
- add_reg :apacc, 0x00, 35, rnw: { pos: 0 },
51
- a: { pos: 1, bits: 2 },
52
- data: { pos: 0, bits: 35 }
56
+ add_reg :dpacc, 0x00, 35, rnw: { pos: 0 }, # DP-Access Register (DPACC)
57
+ a: { pos: 1, bits: 2 },
58
+ data: { pos: 3, bits: 32 }
53
59
 
54
- add_reg :reserved, 0x00, 32, data: { pos: 0, bits: 32 }
55
- add_reg :ctrl_stat, 0x04, 32, data: { pos: 0, bits: 32 }
56
- add_reg :select, 0x08, 32, data: { pos: 0, bits: 32 }
57
- add_reg :rebuff, 0x0C, 32, data: { pos: 0, bits: 32 }
60
+ add_reg :apacc, 0x00, 35, rnw: { pos: 0 }, # AP-Access Register (APACC)
61
+ a: { pos: 1, bits: 2 },
62
+ data: { pos: 0, bits: 32 }
58
63
 
59
64
  # jtag-dp only
60
- add_reg :idcode, 0x00, 32, data: { pos: 0, bits: 32 }
61
- add_reg :abort, 0x00, 35, rnw: { pos: 0 },
62
- a: { pos: 1, bits: 2 },
63
- data: { pos: 0, bits: 32 }
65
+ add_reg :idcode, 0x00, 32, data: { pos: 0, bits: 32 } # Device ID Code Register (IDCODE)
66
+ add_reg :abort, 0x00, 35, rnw: { pos: 0 }, # Abort Register (ABORT)
67
+ a: { pos: 1, bits: 2 },
68
+ data: { pos: 0, bits: 32 }
69
+
70
+ # DP Registers
71
+ add_reg :dpidr, 0x00, 32, data: { pos: 0, bits: 32 }
72
+ add_reg :ctrl_stat, 0x04, 32, data: { pos: 0, bits: 32 }
73
+ add_reg :select, 0x08, 32, data: { pos: 0, bits: 32 }
74
+ add_reg :rdbuff, 0x0C, 32, data: { pos: 0, bits: 32 }
64
75
  end
65
76
 
66
77
  #-------------------------------------
@@ -80,6 +91,9 @@ module OrigenARMDebug
80
91
  else
81
92
  read_dp_jtag(name, options)
82
93
  end
94
+ msg = "#{@imp.to_s.upcase}-DP: R-32: name='#{name}'"
95
+ msg += ", expected=#{options[:edata].to_s(16).rjust(8, '0')}" unless options[:edata].nil?
96
+ cc msg
83
97
  end
84
98
 
85
99
  # Method to read from a Debug Port register and compare for an expected value
@@ -106,6 +120,7 @@ module OrigenARMDebug
106
120
  else
107
121
  write_dp_jtag(name, wdata, options)
108
122
  end
123
+ cc "#{@imp.to_s.upcase}-DP: W-32: name='#{name}', data=0x#{wdata.to_s(16).rjust(8, '0')}"
109
124
  end
110
125
 
111
126
  # Method to write to and then read from a Debug Port register
@@ -117,13 +132,8 @@ module OrigenARMDebug
117
132
  def write_read_dp(name, wdata, options = {})
118
133
  write_dp(name, wdata, options)
119
134
  read_dp(name, options)
120
- if @imp == :swd
121
- cc "SW-DP: WR-32: name='#{name}', "\
122
- "data=0x#{wdata.to_s(16).rjust(8, '0')}"
123
- else
124
- cc "JTAG-DP: WR-32: name='#{name}', "\
125
- "data=0x#{wdata.to_s(16).rjust(8, '0')}"
126
- end
135
+
136
+ cc "#{@imp.to_s.upcase}-DP: WR-32: name='#{name}', data=0x#{wdata.to_s(16).rjust(8, '0')}"
127
137
  end
128
138
 
129
139
  #-------------------------------------
@@ -229,7 +239,6 @@ module OrigenARMDebug
229
239
  when 'RESEND' then dpacc_access(name, rwb, random, options)
230
240
  else Origen.log.error "Unknown #{@imp.to_s.upcase}-DP register name #{name}"
231
241
  end
232
- cc "SW-DP: R-32: name='#{name}'"
233
242
  end
234
243
 
235
244
  # Method to read from a Debug Port register with JTAG protocol
@@ -248,8 +257,7 @@ module OrigenARMDebug
248
257
  when 'RDBUFF' then dpacc_access(name, rwb, random, options)
249
258
  else Origen.log.error "Unknown #{@imp.to_s.upcase}-DP register name #{name}"
250
259
  end
251
- read_dp_jtag('RDBUFF', options) if name != 'IDCODE' && name != 'RDBUFF'
252
- cc "JTAG-DP: R-32: name='#{name}'"
260
+ read_dp('RDBUFF', options) if name != 'IDCODE' && name != 'RDBUFF'
253
261
  end
254
262
 
255
263
  # Method to write to a Debug Port register with SWD protocol
@@ -270,8 +278,6 @@ module OrigenARMDebug
270
278
  when 'RESEND' then Origen.log.error "#{name} #{@imp.to_s.upcase}-DP register is read-only!"
271
279
  else Origen.log.error "Unknown #{@imp.to_s.upcase}-DP register name #{name}"
272
280
  end
273
- cc "SW-DP: W-32: name='#{name}', "\
274
- "data=0x#{wdata.to_s(16).rjust(8, '0')}"
275
281
  end
276
282
 
277
283
  # Method to write to a Debug Port register with JTAG protocol
@@ -290,8 +296,6 @@ module OrigenARMDebug
290
296
  when 'RDBUFF' then Origen.log.error "#{name} #{@imp.to_s.upcase}-DP register is read-only!"
291
297
  else Origen.log.error "Unknown #{@imp.to_s.upcase}-DP register name #{name}"
292
298
  end
293
- cc "JTAG-DP: W-32: name='#{name}', "\
294
- "data=0x#{wdata.to_s(16).rjust(8, '0')}"
295
299
  end
296
300
 
297
301
  # Method
@@ -388,35 +392,32 @@ module OrigenARMDebug
388
392
  attempts.times do
389
393
  if _name == 'RDBUFF'
390
394
  if options[:reg].nil?
391
- r = $dut.reg(:dap)
392
395
  if options[:r_mask] == 'store'
393
- r.bits(3..34).store
396
+ reg(:dpacc).bits(:data).store
394
397
  elsif options.key?(:compare_data)
395
- r.bits(3..34).data = options[:compare_data]
398
+ reg(:dpacc).bits(:data).data = options[:compare_data]
396
399
  elsif options.key?(:edata)
397
400
  options[:compare_data] = options[:edata]
398
- r.bits(3..34).data = options[:edata]
399
- r.inspect
401
+ reg(:dpacc).bits(:data).data = options[:edata]
400
402
  end
401
403
  else
402
- r = $dut.reg(:dap)
403
- r.reset
404
- r.bits(3..34).data = options[:reg].data
404
+ reg(:dpacc).bits(:data).data = options[:reg].data
405
405
  (3..34).each do |i|
406
- r.bits(i).read if options[:reg].bits(i - 3).is_to_be_read?
406
+ reg(:dpacc).bits(i).read if options[:reg].bits(i - 3).is_to_be_read?
407
407
  end
408
408
  (3..34).each do |i|
409
- r.bits(i).store if options[:reg].bits(i - 3).is_to_be_stored?
409
+ reg(:dpacc).bits(i).store if options[:reg].bits(i - 3).is_to_be_stored?
410
410
  end
411
411
  end
412
412
 
413
- options = options.merge(size: r.size)
414
- jtag.read_dr(r, options)
413
+ options = options.merge(size: reg(:dpacc).size)
414
+ jtag.read_dr(reg(:dpacc), options)
415
415
  else
416
- options = options.merge(size: 35)
417
- addr_3_2 = (addr & 0x0000000C) >> 2
418
- wr_data = (wdata << 3) | (addr_3_2 << 1) | rwb
419
- jtag.write_dr(wr_data, options)
416
+ reg(:dpacc).bits(:data).write(wdata)
417
+ reg(:dpacc).bits(:a).write((addr & 0x0000000C) >> 2)
418
+ reg(:dpacc).bits(:rnw).write(rwb)
419
+ options = options.merge(size: reg(:dpacc).size)
420
+ jtag.write_dr(reg(:dpacc), options)
420
421
  end
421
422
  end
422
423
  $tester.cycle(repeat: @acc_access_dly)
@@ -438,31 +439,25 @@ module OrigenARMDebug
438
439
  end
439
440
  end
440
441
 
441
- # Writes to the JTAG instruction regsiter in order to perform a transaction on the given Register
442
+ # Shifts IR code into the JTAG/ARM Instruction Regsiter based on requested Register Name
442
443
  #
443
444
  # @param [String] name Name of the register to be interacted with
444
445
  def set_ir(name)
445
- new_ir = get_ir_code(name)
446
- jtag.write_ir(new_ir, size: 4)
447
- end
448
-
449
- # Returns the value to be written to the JTAG instruction regsiter in order to perform
450
- # a transaction on the given Register
451
- #
452
- # @param [String] name Name of the register to be interacted with
453
- def get_ir_code(name)
454
446
  case name
455
- when 'IDCODE' then return 0b1110 # JTAGC_ARM_IDCODE
456
- when 'ABORT' then return 0b1000 # JTAGC_ARM_ABORT
457
- when 'CTRL/STAT' then return 0b1010 # JTAGC_ARM_DPACC
458
- when 'SELECT' then return 0b1010 # JTAGC_ARM_DPACC
459
- when 'RDBUFF' then return 0b1010 # JTAGC_ARM_DPACC
460
- when 'RESEND' then Origen.log.error "#{name} is a SW-DP only register"
461
- when 'WCR' then Origen.log.error "#{name} is a SW-DP only register"
462
- when 'APACC' then return 0b1011 # JTAGC_ARM_APACC
463
- else Origen.log.error "Unknown JTAG-DP register name: #{name}"
447
+ when 'IDCODE'
448
+ reg(:ir).write(0b1110) # JTAGC_ARM_IDCODE
449
+ when 'ABORT'
450
+ reg(:ir).write(0b1000) # JTAGC_ARM_ABORT
451
+ when 'CTRL/STAT', 'SELECT', 'RDBUFF'
452
+ reg(:ir).write(0b1010) # JTAGC_ARM_DPACC
453
+ when 'APACC'
454
+ reg(:ir).write(0b1011) # JTAGC_ARM_APACC
455
+ when 'RESEND', 'WCR'
456
+ Origen.log.error "#{name} is a SW-DP only register"
457
+ else
458
+ Origen.log.error "Unknown JTAG-DP register name: #{name}"
464
459
  end
465
- 0
460
+ jtag.write_ir(reg(:ir), size: reg(:ir).size)
466
461
  end
467
462
 
468
463
  # Method to select an Access Port (AP) by writing to the SELECT register in the Debug Port
@@ -483,13 +478,15 @@ module OrigenARMDebug
483
478
  @current_apaddr = addr
484
479
  end
485
480
 
486
- # Generates 32-bit random number. Although, for pattern comparison
487
- # it is better to used the same value so that is what is used here.
488
- # To turn on random-ness, un-comment rand() line.
481
+ # Generates 32-bit number for 'dont care' jtag shift outs. Value generated
482
+ # depends on class variable 'random_mode'.
489
483
  def random
490
- # rand(4294967295) # random 32-bit integer
491
- # 0x55555555 # completely unroll jtag data shift
492
- 0x00000000 # compress read out jtag shifts
484
+ case @random_mode
485
+ when :compress then return 0x00000000
486
+ when :unrolled then return 0x55555555
487
+ when :random then return rand(4_294_967_295)
488
+ else return 0x00000000
489
+ end
493
490
  end
494
491
 
495
492
  # Provides shortname access to top-level jtag driver
@@ -23,9 +23,9 @@ Pattern.create do
23
23
  ss "Test write register"
24
24
  $dut.write_register($dut.reg(:test))
25
25
 
26
- $dut.arm_debug.mem_ap.R(0x10000004, 0x00000000, compare_data: 0x00000000)
27
- $dut.arm_debug.mem_ap.W(0x10000004, 0x55555555)
28
- $dut.arm_debug.mem_ap.WR(0x10000004, 0x55555555)
26
+ $dut.arm_debug.mem_ap.read(0x10000004, edata: 0x00000000)
27
+ $dut.arm_debug.mem_ap.write(0x10000004, 0x55555555)
28
+ $dut.arm_debug.mem_ap.write_read(0x10000004, 0x55555555)
29
29
 
30
30
  $dut.arm_debug.mem_ap.inspect
31
31
  $dut.arm_debug.mdm_ap.inspect
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen_arm_debug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ronnie Lajaunie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-08 00:00:00.000000000 Z
11
+ date: 2015-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen