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 +4 -4
- data/config/version.rb +1 -1
- data/lib/origen_arm_debug/swj_dp.rb +67 -70
- data/pattern/read_write_reg.rb +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 856e1631d06c817c9ca0053ccd7c21e3c8c01162
|
4
|
+
data.tar.gz: 933943950a63f6373e326ab7b88240d6be6bd000
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6bcf6b796b955d29b8aaed2960265cf1a07993cef4ff747018735df53c10914bf291cd3c35203cab20db21bc8c2d9ba7e8b177e13a9f9adde55913a29039def9
|
7
|
+
data.tar.gz: 7dd18c6981b08f34574a6f92cc8791e57d5d3be63abdb840e6b2c7d88189c8f87ea36fbad2d8effcd6b37f8e4ad0ad8bf4446c2464f8f3369c50b22109899c7d
|
data/config/version.rb
CHANGED
@@ -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 :
|
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 :
|
51
|
-
|
52
|
-
|
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 :
|
55
|
-
|
56
|
-
|
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,
|
62
|
-
|
63
|
-
|
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
|
-
|
121
|
-
|
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
|
-
|
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
|
-
|
396
|
+
reg(:dpacc).bits(:data).store
|
394
397
|
elsif options.key?(:compare_data)
|
395
|
-
|
398
|
+
reg(:dpacc).bits(:data).data = options[:compare_data]
|
396
399
|
elsif options.key?(:edata)
|
397
400
|
options[:compare_data] = options[:edata]
|
398
|
-
|
399
|
-
r.inspect
|
401
|
+
reg(:dpacc).bits(:data).data = options[:edata]
|
400
402
|
end
|
401
403
|
else
|
402
|
-
|
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
|
-
|
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
|
-
|
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:
|
414
|
-
jtag.read_dr(
|
413
|
+
options = options.merge(size: reg(:dpacc).size)
|
414
|
+
jtag.read_dr(reg(:dpacc), options)
|
415
415
|
else
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
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
|
-
#
|
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'
|
456
|
-
|
457
|
-
when '
|
458
|
-
|
459
|
-
when '
|
460
|
-
|
461
|
-
when '
|
462
|
-
|
463
|
-
|
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
|
-
|
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
|
487
|
-
#
|
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
|
-
|
491
|
-
|
492
|
-
|
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
|
data/pattern/read_write_reg.rb
CHANGED
@@ -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.
|
27
|
-
$dut.arm_debug.mem_ap.
|
28
|
-
$dut.arm_debug.mem_ap.
|
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.
|
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-
|
11
|
+
date: 2015-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: origen
|