origen_arm_debug 1.2.0 → 1.3.0

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
  SHA256:
3
- metadata.gz: 292e4be7741df68524ba13a6af2058a9ca209688ddf12ca19c63a1e2e795135c
4
- data.tar.gz: 58fd3ee8010c9cba1bd4675896fd8a5aa0d9e579113aaeac7ceb30c5039467ac
3
+ metadata.gz: 45cc30ad35c5f7785831b3fa516ce4784e43170ccc21229d5d6744adaa7f08fb
4
+ data.tar.gz: 3962dec63e6fcdc94de242557b36a34472f152ded5d95a1354e16e61fc04af10
5
5
  SHA512:
6
- metadata.gz: 880aef44c21b1a5030223b9d7a0155f0284109c9dcc8c711bdab5e95e0dc8f347a4920d93cfb993dcc51e7104fa91b740699c504a3d797a7c3e12252739357e8
7
- data.tar.gz: 15f565c00daa931914a1b9be94894810a2bdccbd19e1553a013dc1234d1cb01b76484e2bc7e47697cb5ee3307fd03ff7e7484577171120579c35aa37e5e392b5
6
+ metadata.gz: a2060517cd1db17b6ef02d89355c0816f9ebe422b03277dc5a7783bb2cb4bca0ebb6aa795e8e6926800bdbd524ec5d9cc1565ded06ed75626ee4fb130dfe991f
7
+ data.tar.gz: 78a07d7c55c782ee78b025c20b3caf30956f8a550229479c53b53e6b0049f1fe1cb32525e8fbafd44d69ba691ff7d05e7c87d0e5f0747b786af6268394cf3a2e
data/config/commands.rb CHANGED
@@ -30,6 +30,8 @@ when "examples", "test"
30
30
  load "#{Origen.top}/lib/origen/commands/generate.rb"
31
31
  ARGV = %w(workout -t jtag_axi.rb -e j750 -r approved)
32
32
  load "#{Origen.top}/lib/origen/commands/generate.rb"
33
+ ARGV = %w(v6_workout -t jtag_axi.rb -e j750 -r approved)
34
+ load "#{Origen.top}/lib/origen/commands/generate.rb"
33
35
  ARGV = %w(workout -t swd -e j750 -r approved)
34
36
  load "#{Origen.top}/lib/origen/commands/generate.rb"
35
37
  ARGV = %w(workout -t dual_dp -e j750 -r approved)
data/config/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module OrigenARMDebug
2
2
  MAJOR = 1
3
- MINOR = 2
3
+ MINOR = 3
4
4
  BUGFIX = 0
5
5
  DEV = nil
6
6
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -20,7 +20,11 @@ module OrigenARMDebug
20
20
  end
21
21
 
22
22
  if options[:jtag] || parent.respond_to?(:jtag)
23
- options[:class_name] = 'JTAG_DP'
23
+ if options[:dapv6]
24
+ options[:class_name] = 'JTAG_DPV6'
25
+ else
26
+ options[:class_name] = 'JTAG_DP'
27
+ end
24
28
  dps << sub_block(:jtag_dp, options)
25
29
  end
26
30
 
@@ -0,0 +1,17 @@
1
+ module OrigenARMDebug
2
+ # Common methods shared between the SW and JTAG DP controllers
3
+ module DPControllerV6
4
+ # Alias for the ctrlstat register
5
+ def ctrl_stat
6
+ ctrlstat
7
+ end
8
+
9
+ # @api private
10
+ def select_ap_reg(reg)
11
+ address = (reg.address & 0xFFFF_FFF0) >> 4
12
+ address1 = (reg.address & 0xFFFF_FFFF_0000_0000) >> 32
13
+ model.select1.write! address1 if model.select1.data != address1
14
+ model.select.bits(:addr).write! address if model.select.bits(:addr).data != address
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,86 @@
1
+ module OrigenARMDebug
2
+ class JTAG_DPV6
3
+ include Origen::Model
4
+
5
+ attr_reader :dpacc_select, :apacc_select
6
+
7
+ def initialize(options = {})
8
+ options = {
9
+ ir_size: 4,
10
+ idcode_select: 0b1110,
11
+ abort_select: 0b1000,
12
+ dpacc_select: 0b1010,
13
+ apacc_select: 0b1011
14
+ }.merge(options)
15
+ @dpacc_select = options[:dpacc_select]
16
+ @apacc_select = options[:apacc_select]
17
+ add_reg :ir, 0, size: options[:ir_size]
18
+
19
+ # Virtual reg used to represent all of the various 35-bit scan chains
20
+ reg :dr, 0, size: 35 do |reg|
21
+ reg.bit 34..3, :data
22
+ reg.bit 2..1, :a
23
+ reg.bit 0, :rnw
24
+ end
25
+
26
+ reg :idcode, options[:idcode_select], access: :ro do |reg|
27
+ reg.bit 31..28, :version
28
+ reg.bit 27..12, :partno
29
+ reg.bit 11..1, :designer
30
+ reg.bit 0, :bit0, reset: 1
31
+ end
32
+
33
+ reg :ctrlstat, 0x4, dpbanksel: 0 do |reg|
34
+ reg.bit 31, :csyspwrupack
35
+ reg.bit 30, :csyspwrupreq
36
+ reg.bit 29, :cdbgpwrupack
37
+ reg.bit 28, :cdbgpwrupreq
38
+ reg.bit 27, :cdbgrstack
39
+ reg.bit 26, :cdbgrstreq
40
+ reg.bit 23..12, :trncnt
41
+ reg.bit 11..8, :masklane
42
+ reg.bit 7, :wdataerr
43
+ reg.bit 6, :readok
44
+ reg.bit 5, :stickyerr
45
+ reg.bit 4, :stickycmp
46
+ reg.bit 3..2, :trnmode
47
+ reg.bit 1, :stickyorun
48
+ reg.bit 0, :orundetect
49
+ end
50
+
51
+ reg :select, 0x8 do |reg|
52
+ reg.bit 31..4, :addr
53
+ reg.bit 3..0, :dpbanksel
54
+ end
55
+
56
+ reg :select1, 0x4, dpbanksel: 5 do |reg|
57
+ reg.bit 31..0, :addr
58
+ end
59
+
60
+ select.write options[:dp_select_reset] if options[:dp_select_reset]
61
+
62
+ add_reg :rdbuff, 0xC, access: :ro, reset: 0
63
+
64
+ reg :abort, options[:abort_select], access: :wo do |reg|
65
+ reg.bit 0, :dapabort
66
+ end
67
+ end
68
+
69
+ def select
70
+ reg(:select)
71
+ end
72
+
73
+ def abort
74
+ reg(:abort)
75
+ end
76
+
77
+ def is_jtag?
78
+ true
79
+ end
80
+
81
+ def is_swd?
82
+ false
83
+ end
84
+ alias_method :is_sw?, :is_swd?
85
+ end
86
+ end
@@ -0,0 +1,168 @@
1
+ module OrigenARMDebug
2
+ class JTAG_DPV6Controller
3
+ include Origen::Controller
4
+ include Helpers
5
+ include DPControllerV6
6
+
7
+ def write_register(reg, options = {})
8
+ unless reg.writable?
9
+ fail "The :#{reg.name} register is not writeable!"
10
+ end
11
+
12
+ # DP register write
13
+ if reg.owner == model
14
+ # Don't log this one, not really a DP reg and will be included
15
+ # in the JTAG driver log anyway
16
+ if reg.name == :ir
17
+ dut.jtag.write_ir(reg)
18
+ else
19
+
20
+ log "Write JTAG-DP register #{reg.name.to_s.upcase}: #{reg.data.to_hex}" do
21
+ if reg.name == :abort
22
+ ir.write!(reg.offset)
23
+ dr.reset
24
+ dr.overlay(nil)
25
+ dr[2..0].write(0)
26
+ dr[34..3].copy_all(reg)
27
+ dut.jtag.write_dr(dr)
28
+
29
+ # DPACC
30
+ elsif reg.name == :select
31
+ dp_write(reg)
32
+
33
+ # Some other debug register
34
+ elsif reg.meta.include?(:dpbanksel)
35
+ if model.reg(:select).bits(:dpbanksel).data != reg.meta[:dpbanksel]
36
+ model.reg(:select).bits(:dpbanksel).write! reg.meta[:dpbanksel]
37
+ end
38
+ dp_write(reg)
39
+
40
+ else
41
+ fail "Can't write #{reg.name}"
42
+ end
43
+ end
44
+ end
45
+
46
+ # AP register write
47
+ else
48
+
49
+ unless reg.owner.is_a?(AP)
50
+ fail 'The JTAG-DP can only write to DP or AP registers!'
51
+ end
52
+
53
+ select_ap_reg(reg)
54
+ dr.reset
55
+ dr.overlay(nil)
56
+ dr[0].write(0)
57
+ dr[2..1].write(reg.offset >> 2)
58
+ dr[34..3].copy_all(reg)
59
+ ir.write!(apacc_select)
60
+ dut.jtag.write_dr(dr, options)
61
+ end
62
+ end
63
+
64
+ def read_register(reg, options = {})
65
+ unless reg.readable?
66
+ fail "The :#{reg.name} register is not readable!"
67
+ end
68
+
69
+ if reg.owner == model
70
+ # Don't log this one, not really a DP reg and will be included
71
+ # in the JTAG driver log anyway
72
+ if reg.name == :ir
73
+ dut.jtag.read_ir(reg)
74
+ else
75
+
76
+ log "Read JTAG-DP register #{reg.name.to_s.upcase}: #{Origen::Utility.read_hex(reg)}" do
77
+ if reg.name == :idcode
78
+ ir.write!(reg.offset)
79
+ dut.jtag.read_dr(reg)
80
+
81
+ # DPACC
82
+ elsif reg.name == :select || reg.name == :rdbuff
83
+ dp_read(reg, options)
84
+
85
+ # Some other register
86
+ elsif reg.meta.include?(:dpbanksel)
87
+ # Part 1 - Set dpbanksel if required
88
+ if model.reg(:select).bits(:dpbanksel).data != reg.meta[:dpbanksel]
89
+ model.reg(:select).bits(:dpbanksel).write! reg.meta[:dpbanksel]
90
+ end
91
+
92
+ dp_read(reg, options)
93
+
94
+ else
95
+ fail "Can't read #{reg.name}"
96
+ end
97
+ end
98
+ end
99
+
100
+ # AP register read
101
+ else
102
+ unless reg.owner.is_a?(AP)
103
+ fail 'The JTAG-DP can only write to DP or AP registers!'
104
+ end
105
+
106
+ # Part 1 - Request read from AP-Register by writing to APACC with RnW=1
107
+ select_ap_reg(reg)
108
+ dr.reset
109
+ dr.overlay(nil)
110
+ dr[0].write(1)
111
+ dr[2..1].write(reg.offset >> 2)
112
+ dr[34..3].write(0)
113
+ ir.write!(apacc_select)
114
+ dut.jtag.write_dr(dr)
115
+
116
+ # Calling AP should provide any delay parameter for wait states between AP read request
117
+ # and when the data is available at the RDBUFF DP-Reg
118
+ if options[:apacc_wait_states]
119
+ options[:apacc_wait_states].cycles
120
+ end
121
+
122
+ # Part 2 - Now read real data from RDBUFF (DP-Reg)
123
+ dr.reset
124
+ dr.overlay(nil)
125
+ dr[0].write(1)
126
+ dr[2..1].write(rdbuff.offset >> 2)
127
+ dr[34..3].copy_all(reg)
128
+ options[:mask] = options[:mask] << 3 unless options[:mask].nil?
129
+ ir.write!(dpacc_select)
130
+ dut.jtag.read_dr(dr, options)
131
+ end
132
+ end
133
+
134
+ def dp_read(reg, options = {})
135
+ # Part 1 - Request read from DP-Register by writing to DPACC with RnW=1
136
+ dr.reset
137
+ dr.overlay(nil)
138
+ dr[0].write(1)
139
+ dr[2..1].write(reg.offset >> 2)
140
+ dr[34..3].write(0)
141
+ ir.write!(dpacc_select)
142
+ dut.jtag.write_dr(dr)
143
+
144
+ # Part 2 - Now read real data from RDBUFF (DP-Reg)
145
+ dr.reset
146
+ dr.overlay(nil)
147
+ dr[0].write(1)
148
+ dr[2..1].write(rdbuff.offset >> 2)
149
+ dr[34..3].copy_all(reg)
150
+ options[:mask] = options[:mask] << 3 unless options[:mask].nil?
151
+ dut.jtag.read_dr(dr, options)
152
+ end
153
+
154
+ def dp_write(reg)
155
+ dr.reset
156
+ dr.overlay(nil)
157
+ dr[0].write(0)
158
+ dr[2..1].write(reg.offset >> 2)
159
+ dr[34..3].copy_all(reg)
160
+ ir.write!(dpacc_select)
161
+ dut.jtag.write_dr(dr)
162
+ end
163
+
164
+ def base_address
165
+ model.base_address
166
+ end
167
+ end
168
+ end
@@ -8,8 +8,11 @@ module OrigenARMDebug
8
8
  require 'origen_arm_debug/dap'
9
9
  require 'origen_arm_debug/dap_controller'
10
10
  require 'origen_arm_debug/dp_controller'
11
+ require 'origen_arm_debug/dp_controller_v6'
11
12
  require 'origen_arm_debug/jtag_dp'
12
13
  require 'origen_arm_debug/jtag_dp_controller'
14
+ require 'origen_arm_debug/jtag_dp_v6'
15
+ require 'origen_arm_debug/jtag_dp_v6_controller'
13
16
  require 'origen_arm_debug/sw_dp'
14
17
  require 'origen_arm_debug/sw_dp_controller'
15
18
  require 'origen_arm_debug/ap'
@@ -30,6 +30,21 @@ module OrigenARMDebugDev
30
30
  options[:dp_select_reset] = 0xC2_0D00
31
31
  # Specify (customize) ARM Debug implementation details
32
32
  sub_block :arm_debug, options
33
+
34
+ options[:dapv6] = true
35
+ options[:class_name] = 'OrigenARMDebug::DAP'
36
+ options[:mem_aps] = {
37
+ mem_ap: {
38
+ base_address: 0x00C2_0000,
39
+ latency: 16,
40
+ apreg_access_wait: 8,
41
+ apmem_access_wait: 8,
42
+ is_axi: true,
43
+ csw_reset: 0x1080_6002
44
+ },
45
+ mdm_ap: 0x00C3_0000
46
+ }
47
+ sub_block :arm_debugv6, options
33
48
  end
34
49
  end
35
50
  end
@@ -0,0 +1,114 @@
1
+ pattern_name = "v6_workout_#{dut.arm_debugv6.dp.name}"
2
+
3
+ Pattern.create name: pattern_name do
4
+
5
+ ss "Tests of direct DP API"
6
+ dp = dut.arm_debugv6.dp
7
+
8
+ dp.idcode.partno.read!(0x12)
9
+
10
+ dp.ctrlstat.write!(0x50000000)
11
+ dp.ctrlstat.read!(0xF0000000)
12
+
13
+ dp.select.bits(:addr).write!(0xF)
14
+ dp.select.read!
15
+ dp.select1.write! 4
16
+ dp.select1.read! 4
17
+
18
+ dp.abort.dapabort.write!(1)
19
+
20
+ ss "Tests of direct AP API"
21
+ ap = dut.arm_debugv6.mem_ap
22
+
23
+ ap.tar.write!(0x1234_0000)
24
+
25
+ ap.tar.read!
26
+
27
+ ss "Tests of high-level register API"
28
+
29
+ ss "Test write register, should write value 0xFF01"
30
+ dut.reg(:test).write!(0x0000FF01)
31
+
32
+ ss "Test write register with overlay, no subroutine"
33
+ dut.reg(:test).overlay('write_overlay')
34
+ dut.reg(:test).write!(0x0000FF01, no_subr: true)
35
+ dut.reg(:test).overlay(nil)
36
+
37
+ ss "Test write register with overlay, use subroutine if available"
38
+ dut.reg(:test).overlay('write_overlay_subr')
39
+ dut.reg(:test).write!(0x0000FF01)
40
+ dut.reg(:test).overlay(nil)
41
+
42
+ ss "Test read register, should read value 0x0000FF01"
43
+ dut.reg(:test).read!
44
+
45
+ ss "Test read register, with overlay, no subroutine, should read value 0x0000FF01"
46
+ dut.reg(:test).overlay('read_overlay')
47
+ dut.reg(:test).read!(no_subr: true)
48
+ dut.reg(:test).overlay(nil)
49
+
50
+ ss "Test read register, with overlay, use subroutine if available"
51
+ dut.reg(:test).overlay('read_overlay_subr')
52
+ dut.reg(:test).read!
53
+ dut.reg(:test).overlay(nil)
54
+
55
+ ss "Test read register with mask, should read value 0xXXXxxx1"
56
+ dut.reg(:test).read!(mask: 0x0000_000F)
57
+
58
+ ss "Test read register with store"
59
+ dut.reg(:test).store!
60
+
61
+ ss "Test bit level read, should read value 0xXXXxxx1"
62
+ dut.reg(:test).reset
63
+ dut.reg(:test).data = 0x0000FF01
64
+ dut.reg(:test)[0].read!
65
+
66
+ if Origen.app.target.name == 'dual_dp'
67
+ ss "SWITCHING DP"
68
+ dut.arm_debugv6.set_dp(:jtag)
69
+
70
+ ss "Test write register, should write value 0xFF01"
71
+ dut.reg(:test).write!(0x0000FF01)
72
+
73
+ ss "Test write register with overlay, no subroutine"
74
+ dut.reg(:test).overlay('write_overlay')
75
+ dut.reg(:test).write!(0x0000FF01, no_subr: true)
76
+ dut.reg(:test).overlay(nil)
77
+
78
+ ss "Test write register with overlay, use subroutine if available"
79
+ dut.reg(:test).overlay('write_overlay_subr')
80
+ dut.reg(:test).write!(0x0000FF01)
81
+ dut.reg(:test).overlay(nil)
82
+
83
+ ss "Test read register, should read value 0x0000FF01"
84
+ dut.reg(:test).read!
85
+
86
+ ss "Test read register, with overlay, no subroutine, should read value 0x0000FF01"
87
+ dut.reg(:test).overlay('read_overlay')
88
+ dut.reg(:test).read!(no_subr: true)
89
+ dut.reg(:test).overlay(nil)
90
+
91
+ ss "Test read register, with overlay, use subroutine if available"
92
+ dut.reg(:test).overlay('read_overlay_subr')
93
+ dut.reg(:test).read!
94
+ dut.reg(:test).overlay(nil)
95
+
96
+ ss "Test read register with mask, should read value 0xXXXxxx1"
97
+ dut.reg(:test).read!(mask: 0x0000_000F)
98
+
99
+ ss "Test read register with store"
100
+ dut.reg(:test).store!
101
+
102
+ ss "Test bit level read, should read value 0xXXXxxx1"
103
+ dut.reg(:test).reset
104
+ dut.reg(:test).data = 0x0000FF01
105
+ dut.reg(:test)[0].read!
106
+
107
+ ss "RESETTING DP (to default)"
108
+ dut.arm_debugv6.reset_dp
109
+ ss "Test bit level read, should read value 0xXXXxxx1"
110
+ dut.reg(:test).reset
111
+ dut.reg(:test).data = 0x0000FF01
112
+ dut.reg(:test)[0].read!
113
+ end
114
+ end
data/pattern/workout.rb CHANGED
@@ -16,7 +16,11 @@ Pattern.create name: pattern_name do
16
16
  dp.ctrlstat.write!(0x50000000)
17
17
  dp.ctrlstat.read!(0xF0000000)
18
18
 
19
- dp.select.apbanksel.write!(0xF)
19
+ if dp.select.has_bits?(:apbanksel)
20
+ dp.select.apbanksel.write!(0xF)
21
+ else
22
+ dp.select.bits(31..24).write!(0xF)
23
+ end
20
24
 
21
25
  dp.abort.dapabort.write!(1)
22
26
 
@@ -138,6 +138,21 @@ instantiation_options[:dp_select_reset] = 0xC2_0D00
138
138
  sub_block :arm_debug, instantiation_options
139
139
  ~~~
140
140
 
141
+ DAP Version 6 instantiation example:
142
+
143
+ ~~~ruby
144
+ mem_aps = {
145
+ mem_ap: { base_address: 0x001C_1000 }
146
+ mem2_ap: { base_address: 0x001C_2000 }
147
+ }
148
+ instantiation_options[:class_name] = 'OrigenARMDebug::DAP'
149
+ instantiation_options[:mem_aps] = mem_aps
150
+
151
+ instantiation_options[:dapv6] = true
152
+
153
+ sub_block :arm_debug, instantiation_options
154
+ ~~~
155
+
141
156
  ### Company Customization
142
157
 
143
158
  It may be the case that your application needs additional, customized Access Ports (AP) which are allowed but
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: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ronnie Lajaunie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-28 00:00:00.000000000 Z
11
+ date: 2022-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
@@ -87,11 +87,14 @@ files:
87
87
  - lib/origen_arm_debug/dap.rb
88
88
  - lib/origen_arm_debug/dap_controller.rb
89
89
  - lib/origen_arm_debug/dp_controller.rb
90
+ - lib/origen_arm_debug/dp_controller_v6.rb
90
91
  - lib/origen_arm_debug/helpers.rb
91
92
  - lib/origen_arm_debug/jtag_ap.rb
92
93
  - lib/origen_arm_debug/jtag_ap_controller.rb
93
94
  - lib/origen_arm_debug/jtag_dp.rb
94
95
  - lib/origen_arm_debug/jtag_dp_controller.rb
96
+ - lib/origen_arm_debug/jtag_dp_v6.rb
97
+ - lib/origen_arm_debug/jtag_dp_v6_controller.rb
95
98
  - lib/origen_arm_debug/mem_ap.rb
96
99
  - lib/origen_arm_debug/mem_ap_controller.rb
97
100
  - lib/origen_arm_debug/sw_dp.rb
@@ -101,6 +104,7 @@ files:
101
104
  - lib/origen_arm_debug_dev/dut_jtag.rb
102
105
  - lib/origen_arm_debug_dev/dut_jtag_axi.rb
103
106
  - lib/origen_arm_debug_dev/dut_swd.rb
107
+ - pattern/v6_workout.rb
104
108
  - pattern/workout.rb
105
109
  - templates/web/index.md.erb
106
110
  - templates/web/layouts/_basic.html.erb