origen_arm_debug 1.1.3 → 1.3.0

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
  SHA256:
3
- metadata.gz: e80b1afc8a982d2a7ec2041ad61d4f4eedb011abc09a4931d669747c7dc3230c
4
- data.tar.gz: 9e4712df2359e3c55674282f9c0ac0169d47e9e7138a59e4a66773d1b087b223
3
+ metadata.gz: 45cc30ad35c5f7785831b3fa516ce4784e43170ccc21229d5d6744adaa7f08fb
4
+ data.tar.gz: 3962dec63e6fcdc94de242557b36a34472f152ded5d95a1354e16e61fc04af10
5
5
  SHA512:
6
- metadata.gz: e3b956766978d89be7ebdeba678195ae916542f1c3b861bc35ec224966f02aea2b3fc4ec3bff87d0809f288a355b745a1334a957c710040a595265e11d4574e6
7
- data.tar.gz: 1607a271f01f25ab358205b51bfd9d0837c413041f2c2b57a5f43f8282ccba417d90eb24d32b02b4863343dc41707b155549ea6c54c9d7d370fdde04f67aaaef
6
+ metadata.gz: a2060517cd1db17b6ef02d89355c0816f9ebe422b03277dc5a7783bb2cb4bca0ebb6aa795e8e6926800bdbd524ec5d9cc1565ded06ed75626ee4fb130dfe991f
7
+ data.tar.gz: 78a07d7c55c782ee78b025c20b3caf30956f8a550229479c53b53e6b0049f1fe1cb32525e8fbafd44d69ba691ff7d05e7c87d0e5f0747b786af6268394cf3a2e
data/config/boot.rb CHANGED
@@ -3,3 +3,5 @@ require "origen_arm_debug"
3
3
  require "origen_arm_debug_dev/dut"
4
4
  require "origen_arm_debug_dev/dut_jtag"
5
5
  require "origen_arm_debug_dev/dut_swd"
6
+ require "origen_arm_debug_dev/dut_dual_dp"
7
+ require "origen_arm_debug_dev/dut_jtag_axi"
data/config/commands.rb CHANGED
@@ -17,19 +17,25 @@ aliases ={
17
17
  # Now branch to the specific task code
18
18
  case @command
19
19
 
20
- # when "specs"
21
- # require "rspec"
22
- # exit RSpec::Core::Runner.run(['spec'])
20
+ when "specs"
21
+ require "rspec"
22
+ exit RSpec::Core::Runner.run(['spec'])
23
23
 
24
- when "examples" # , "test"
24
+ when "examples", "test"
25
25
  Origen.load_application
26
26
  status = 0
27
27
 
28
28
  # Pattern generator tests
29
- ARGV = %w(workout -t jtag -e j750 -r approved)
29
+ ARGV = %w(workout -t jtag.rb -e j750 -r approved)
30
+ load "#{Origen.top}/lib/origen/commands/generate.rb"
31
+ ARGV = %w(workout -t jtag_axi.rb -e j750 -r approved)
32
+ load "#{Origen.top}/lib/origen/commands/generate.rb"
33
+ ARGV = %w(v6_workout -t jtag_axi.rb -e j750 -r approved)
30
34
  load "#{Origen.top}/lib/origen/commands/generate.rb"
31
35
  ARGV = %w(workout -t swd -e j750 -r approved)
32
36
  load "#{Origen.top}/lib/origen/commands/generate.rb"
37
+ ARGV = %w(workout -t dual_dp -e j750 -r approved)
38
+ load "#{Origen.top}/lib/origen/commands/generate.rb"
33
39
  ARGV = %w(workout -t config_test -e j750 -r approved/config_test)
34
40
  load "#{Origen.top}/lib/origen/commands/generate.rb"
35
41
 
@@ -44,12 +50,12 @@ when "examples" # , "test"
44
50
  status = 1
45
51
  end
46
52
  puts
47
- # if @command == "test"
48
- # Origen.app.unload_target!
49
- # require "rspec"
50
- # result = RSpec::Core::Runner.run(['spec'])
51
- # status = status == 1 ? 1 : result
52
- # end
53
+ if @command == "test"
54
+ Origen.app.unload_target!
55
+ require "rspec"
56
+ result = RSpec::Core::Runner.run(['spec'])
57
+ status = status == 1 ? 1 : result
58
+ end
53
59
  exit status
54
60
 
55
61
  # Always leave an else clause to allow control to fall back through to the
data/config/version.rb CHANGED
@@ -1,8 +1,7 @@
1
1
  module OrigenARMDebug
2
2
  MAJOR = 1
3
- MINOR = 1
4
- BUGFIX = 3
3
+ MINOR = 3
4
+ BUGFIX = 0
5
5
  DEV = nil
6
-
7
6
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
8
7
  end
@@ -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
 
@@ -70,11 +74,13 @@ module OrigenARMDebug
70
74
  #
71
75
  def add_ap(name, options)
72
76
  domain name.to_sym
77
+ # class name is deleted from options in sub_block call
78
+ class_name = options[:class_name]
73
79
  ap = sub_block(name.to_sym, options)
74
80
 
75
- if options[:class_name] == 'MemAP'
81
+ if class_name == 'MemAP'
76
82
  mem_aps << ap
77
- elsif options[:class_name] == 'JTAGAP'
83
+ elsif class_name == 'JTAGAP'
78
84
  jtag_aps << ap
79
85
  else
80
86
  ext_aps << ap
@@ -3,12 +3,41 @@ module OrigenARMDebug
3
3
  include Origen::Controller
4
4
  include Helpers
5
5
 
6
+ attr_accessor :dp
7
+
6
8
  # Returns the currently enabled DP (or the only DP if only one
7
9
  # of them).
8
10
  # If no dp is enabled before calling this, it will choose the
9
11
  # SW_DP by default.
10
12
  def dp
11
- dps.first
13
+ @dp ||= dps.first
14
+ end
15
+
16
+ def set_dp(dp)
17
+ if dps.size > 1
18
+ if dp == :swd || dp == :sw
19
+ @dp = dps.first
20
+ elsif dp == :jtag
21
+ @dp = dps.last
22
+ else
23
+ Origen.log.error 'origen_arm_debug: Only SWD and JTAG DP available'
24
+ end
25
+ else
26
+ Origen.log.warn 'origen_arm_debug: Ignoring set_dp call since only one DP is available'
27
+ end
28
+ end
29
+
30
+ def reset_dp
31
+ @dp = nil
32
+ end
33
+
34
+ def is_jtag?
35
+ dp.is_jtag?
36
+ end
37
+
38
+ def is_swd?
39
+ dp.is_swd?
12
40
  end
41
+ alias_method :is_sw?, :is_swd?
13
42
  end
14
43
  end
@@ -9,8 +9,14 @@ module OrigenARMDebug
9
9
  # @api private
10
10
  def select_ap_reg(reg)
11
11
  address = reg.address & 0xFFFF_FFF0
12
- if model.select.data != address
13
- model.select.write!(address)
12
+ apsel = (reg.address & 0xFF00_0000) >> 24
13
+ apbanksel = (reg.address & 0xF0) >> 4
14
+ # if model.select.data != address
15
+ if model.select.apsel.data != apsel || model.select.apbanksel.data != apbanksel
16
+ model.select.write! do |r|
17
+ r.apsel.write apsel
18
+ r.apbanksel.write apbanksel
19
+ end
14
20
  end
15
21
  end
16
22
  end
@@ -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
@@ -48,9 +48,12 @@ module OrigenARMDebug
48
48
 
49
49
  reg :select, 0x8 do |reg|
50
50
  reg.bit 31..24, :apsel
51
+ reg.bit 23..8, :reserved
51
52
  reg.bit 7..4, :apbanksel
52
53
  end
53
54
 
55
+ select.write options[:dp_select_reset] if options[:dp_select_reset]
56
+
54
57
  add_reg :rdbuff, 0xC, access: :ro, reset: 0
55
58
 
56
59
  reg :abort, options[:abort_select], access: :wo do |reg|
@@ -65,5 +68,14 @@ module OrigenARMDebug
65
68
  def abort
66
69
  reg(:abort)
67
70
  end
71
+
72
+ def is_jtag?
73
+ true
74
+ end
75
+
76
+ def is_swd?
77
+ false
78
+ end
79
+ alias_method :is_sw?, :is_swd?
68
80
  end
69
81
  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
@@ -14,21 +14,52 @@ module OrigenARMDebug
14
14
  # For SWD, this is the wait states in between setting the AP, initiating and completing a dummy read, and beginning the actual read transaction.
15
15
  attr_accessor :apacc_wait_states
16
16
 
17
+ # Boolean value indicating whether this is an AXI-AP
18
+ attr_accessor :is_axi
19
+
20
+ # Value to be read from DP CSW for interleaved status checks (debug feature)
21
+ attr_accessor :csw_status_check
22
+
23
+ # Boolean value indicating whether to interleave status checks during transactions (debug feature)
24
+ attr_accessor :interleave_status_check
25
+
17
26
  def initialize(options = {})
18
27
  super
19
28
 
29
+ @is_axi = options[:is_axi]
30
+ @csw_status_check = options[:csw_status_check]
31
+ @interleave_status_check = options[:interleave_status_check]
32
+
20
33
  @latency = options[:latency] || 0
21
34
  @apmem_access_wait = options[:apmem_access_wait] || 0
22
35
 
23
- reg :csw, 0x0 do |reg|
24
- reg.bit 31, :dbg_sw_enable
25
- reg.bit 30..24, :prot
26
- reg.bit 23, :spiden
27
- reg.bit 11..8, :mode
28
- reg.bit 7, :tr_in_prog
29
- reg.bit 6, :device_en
30
- reg.bit 5..4, :addr_inc
31
- reg.bit 2..0, :size
36
+ if @is_axi
37
+ reg :csw, 0x0 do |reg|
38
+ reg.bit 31, :reserved
39
+ reg.bit 30..28, :prot, res: 3
40
+ reg.bit 27..24, :cache
41
+ reg.bit 23, :spiden
42
+ reg.bit 22..15, :reserved2
43
+ reg.bit 14..13, :domain, res: 3
44
+ reg.bit 12, :ace_enable
45
+ reg.bit 11..8, :mode
46
+ reg.bit 7, :tr_in_prog
47
+ reg.bit 6, :dbg_status, res: 1
48
+ reg.bit 5..4, :addr_inc
49
+ reg.bit 3, :reserved3
50
+ reg.bit 2..0, :size, res: 2
51
+ end
52
+ else
53
+ reg :csw, 0x0 do |reg|
54
+ reg.bit 31, :dbg_sw_enable
55
+ reg.bit 30..24, :prot
56
+ reg.bit 23, :spiden
57
+ reg.bit 11..8, :mode
58
+ reg.bit 7, :tr_in_prog
59
+ reg.bit 6, :device_en
60
+ reg.bit 5..4, :addr_inc
61
+ reg.bit 2..0, :size
62
+ end
32
63
  end
33
64
  reg(:csw).write(options[:csw_reset]) if options[:csw_reset]
34
65
 
@@ -18,11 +18,13 @@ module OrigenARMDebug
18
18
  log "Write MEM-AP (#{model.name}) address #{addr.to_hex}: #{data.to_hex}" do
19
19
  csw.bits(:size).write!(0b010) if csw.bits(:size).data != 0b010
20
20
  tar.write!(addr) unless tar.data == addr
21
+ parent.dp.ctrlstat.read! model.csw_status_check if model.interleave_status_check
21
22
  drw.reset
22
23
  drw.overlay(nil)
23
24
  drw.copy_all(reg_or_val)
24
25
  drw.write!(options)
25
26
  latency.cycles
27
+ parent.dp.ctrlstat.read! model.csw_status_check if model.interleave_status_check
26
28
  end
27
29
  increment_addr
28
30
  end
@@ -43,11 +45,13 @@ module OrigenARMDebug
43
45
  csw.bits(:size).write!(0b010) if csw.bits(:size).data != 0b010
44
46
  unless tar.data == addr
45
47
  tar.write!(addr)
48
+ parent.dp.ctrlstat.read! model.csw_status_check if model.interleave_status_check
46
49
  end
47
50
  drw.reset
48
51
  drw.overlay(nil)
49
52
  drw.copy_all(reg_or_val)
50
53
  parent.dp.read_register(drw, options.merge(apacc_wait_states: (apmem_access_wait + apreg_access_wait)))
54
+ parent.dp.ctrlstat.read! model.csw_status_check if model.interleave_status_check
51
55
  end
52
56
  increment_addr
53
57
  end
@@ -60,5 +60,14 @@ module OrigenARMDebug
60
60
  def abort
61
61
  reg(:abort)
62
62
  end
63
+
64
+ def is_jtag?
65
+ false
66
+ end
67
+
68
+ def is_swd?
69
+ true
70
+ end
71
+ alias_method :is_sw?, :is_swd?
63
72
  end
64
73
  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'
@@ -0,0 +1,34 @@
1
+ module OrigenARMDebugDev
2
+ # Simple JTAG-specific dut model that inherits from protocol-agnostic DUT model
3
+ class DUAL_DP_DUT < DUT
4
+ include OrigenSWD
5
+ include OrigenJTAG
6
+
7
+ # Adds jtag-required pins to the simple dut model
8
+ # Returns nothing.
9
+ def initialize(options = {})
10
+ super
11
+ add_pin :tclk
12
+ add_pin :tdi
13
+ add_pin :tdo
14
+ add_pin :tms
15
+ add_pin :trst
16
+ add_pin :swd_clk
17
+ add_pin :swd_dio
18
+
19
+ options[:class_name] = 'OrigenARMDebug::DAP'
20
+ options[:mem_aps] = {
21
+ mem_ap: {
22
+ base_address: 0x00000000,
23
+ latency: 16,
24
+ apreg_access_wait: 8,
25
+ apmem_access_wait: 8,
26
+ csw_reset: 0x23000040
27
+ },
28
+ mdm_ap: 0x01000000
29
+ }
30
+ # Specify (customize) ARM Debug implementation details
31
+ sub_block :arm_debug, options
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,50 @@
1
+ module OrigenARMDebugDev
2
+ # Simple JTAG-specific dut model that inherits from protocol-agnostic DUT model
3
+ class JTAG_AXI_DUT < DUT
4
+ include OrigenJTAG
5
+
6
+ # Adds jtag-required pins to the simple dut model
7
+ # Returns nothing.
8
+ def initialize(options = {})
9
+ super
10
+ add_pin :tclk
11
+ add_pin :tdi
12
+ add_pin :tdo
13
+ add_pin :tms
14
+ add_pin :trst
15
+ add_pin :swd_clk
16
+ add_pin :swd_dio
17
+
18
+ options[:class_name] = 'OrigenARMDebug::DAP'
19
+ options[:mem_aps] = {
20
+ mem_ap: {
21
+ base_address: 0x00000000,
22
+ latency: 16,
23
+ apreg_access_wait: 8,
24
+ apmem_access_wait: 8,
25
+ is_axi: true,
26
+ csw_reset: 0x1080_6002
27
+ },
28
+ mdm_ap: 0x01000000
29
+ }
30
+ options[:dp_select_reset] = 0xC2_0D00
31
+ # Specify (customize) ARM Debug implementation details
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
48
+ end
49
+ end
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
@@ -1,4 +1,12 @@
1
- Pattern.create name: "workout_#{dut.arm_debug.dp.name}" do
1
+ if Origen.app.target.name == 'dual_dp'
2
+ pattern_name = 'workout_dual_dp'
3
+ elsif Origen.app.target.name == 'jtag_axi'
4
+ pattern_name = 'workout_jtag_axi'
5
+ else
6
+ pattern_name = "workout_#{dut.arm_debug.dp.name}"
7
+ end
8
+
9
+ Pattern.create name: pattern_name do
2
10
 
3
11
  ss "Tests of direct DP API"
4
12
  dp = dut.arm_debug.dp
@@ -8,7 +16,11 @@ Pattern.create name: "workout_#{dut.arm_debug.dp.name}" do
8
16
  dp.ctrlstat.write!(0x50000000)
9
17
  dp.ctrlstat.read!(0xF0000000)
10
18
 
11
- 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
12
24
 
13
25
  dp.abort.dapabort.write!(1)
14
26
 
@@ -58,4 +70,52 @@ Pattern.create name: "workout_#{dut.arm_debug.dp.name}" do
58
70
  dut.reg(:test).data = 0x0000FF01
59
71
  dut.reg(:test)[0].read!
60
72
 
73
+ if Origen.app.target.name == 'dual_dp'
74
+ ss "SWITCHING DP"
75
+ dut.arm_debug.set_dp(:jtag)
76
+
77
+ ss "Test write register, should write value 0xFF01"
78
+ dut.reg(:test).write!(0x0000FF01)
79
+
80
+ ss "Test write register with overlay, no subroutine"
81
+ dut.reg(:test).overlay('write_overlay')
82
+ dut.reg(:test).write!(0x0000FF01, no_subr: true)
83
+ dut.reg(:test).overlay(nil)
84
+
85
+ ss "Test write register with overlay, use subroutine if available"
86
+ dut.reg(:test).overlay('write_overlay_subr')
87
+ dut.reg(:test).write!(0x0000FF01)
88
+ dut.reg(:test).overlay(nil)
89
+
90
+ ss "Test read register, should read value 0x0000FF01"
91
+ dut.reg(:test).read!
92
+
93
+ ss "Test read register, with overlay, no subroutine, should read value 0x0000FF01"
94
+ dut.reg(:test).overlay('read_overlay')
95
+ dut.reg(:test).read!(no_subr: true)
96
+ dut.reg(:test).overlay(nil)
97
+
98
+ ss "Test read register, with overlay, use subroutine if available"
99
+ dut.reg(:test).overlay('read_overlay_subr')
100
+ dut.reg(:test).read!
101
+ dut.reg(:test).overlay(nil)
102
+
103
+ ss "Test read register with mask, should read value 0xXXXxxx1"
104
+ dut.reg(:test).read!(mask: 0x0000_000F)
105
+
106
+ ss "Test read register with store"
107
+ dut.reg(:test).store!
108
+
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
+
114
+ ss "RESETTING DP (to default)"
115
+ dut.arm_debug.reset_dp
116
+ ss "Test bit level read, should read value 0xXXXxxx1"
117
+ dut.reg(:test).reset
118
+ dut.reg(:test).data = 0x0000FF01
119
+ dut.reg(:test)[0].read!
120
+ end
61
121
  end
@@ -52,7 +52,7 @@ class DUT
52
52
 
53
53
  # Simple example using default wait-states and latency:
54
54
  # mem_ap: APSEL = 0x00 (base_address[31:24])
55
- # mem2_ap: APSEL = 0x01 (base_address[31:24])
55
+ # mem2_ap: APSEL = 0x01 (base_address[31:24], is_axi: true) # is_axi: true for AXI-AP
56
56
  mem_aps = {
57
57
  mem_ap: { base_address: 0x00000000 },
58
58
  mem2_ap: { base_address: 0x10000000 }
@@ -133,6 +133,22 @@ instantiation_options[:idcode_select] = 0xFE
133
133
  instantiation_options[:abort_select] = 0xF8
134
134
  instantiation_options[:dpacc_select] = 0xFA
135
135
  instantiation_options[:apacc_select] = 0xFB
136
+ instantiation_options[:dp_select_reset] = 0xC2_0D00
137
+
138
+ sub_block :arm_debug, instantiation_options
139
+ ~~~
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
136
152
 
137
153
  sub_block :arm_debug, instantiation_options
138
154
  ~~~
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.1.3
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: 2019-01-21 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,18 +87,24 @@ 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
98
101
  - lib/origen_arm_debug/sw_dp_controller.rb
99
102
  - lib/origen_arm_debug_dev/dut.rb
103
+ - lib/origen_arm_debug_dev/dut_dual_dp.rb
100
104
  - lib/origen_arm_debug_dev/dut_jtag.rb
105
+ - lib/origen_arm_debug_dev/dut_jtag_axi.rb
101
106
  - lib/origen_arm_debug_dev/dut_swd.rb
107
+ - pattern/v6_workout.rb
102
108
  - pattern/workout.rb
103
109
  - templates/web/index.md.erb
104
110
  - templates/web/layouts/_basic.html.erb
@@ -123,8 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
129
  - !ruby/object:Gem::Version
124
130
  version: 1.8.11
125
131
  requirements: []
126
- rubyforge_project:
127
- rubygems_version: 2.7.7
132
+ rubygems_version: 3.1.4
128
133
  signing_key:
129
134
  specification_version: 4
130
135
  summary: Provides an Origen API to perform register read and write operations via