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