origen_arm_debug 0.8.2 → 0.8.3

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: 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