OpenCores
URL https://opencores.org/ocsvn/mips_enhanced/mips_enhanced/trunk

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [lib/] [gaisler/] [jtag/] [jtagtst.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
------------------------------------------------------------------------------
2
--  This file is a part of the GRLIB VHDL IP LIBRARY
3
--  Copyright (C) 2003, Gaisler Research
4
--
5
--  This program is free software; you can redistribute it and/or modify
6
--  it under the terms of the GNU General Public License as published by
7
--  the Free Software Foundation; either version 2 of the License, or
8
--  (at your option) any later version.
9
--
10
--  This program is distributed in the hope that it will be useful,
11
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
--  GNU General Public License for more details.
14
--
15
--  You should have received a copy of the GNU General Public License
16
--  along with this program; if not, write to the Free Software
17
--  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
18
-----------------------------------------------------------------------------
19
-- Package:     sim
20
-- File:        sim.vhd
21
-- Author:      Edvin Catovic - Gaisler Research
22
-- Description: JTAG debug link communication test 
23
------------------------------------------------------------------------------
24
 
25
-- pragma translate_off
26
 
27
library ieee;
28
use ieee.std_logic_1164.all;
29
use std.textio.all;
30
library grlib;
31
use grlib.stdlib.all;
32
use grlib.stdio.all;
33
use grlib.amba.all;
34
 
35
package jtagtst is
36
 
37
  procedure clkj(tmsi, tdii : in std_ulogic; tdoo : out std_ulogic;
38
                 signal tck, tms, tdi : out std_ulogic;
39
                 signal tdo           : in std_ulogic;
40
                 cp                   : in integer);
41
 
42
  procedure shift(dr : in boolean; len : in integer;
43
                  din : in std_logic_vector; dout : out std_logic_vector;
44
                  signal tck, tms, tdi : out std_ulogic;
45
                  signal tdo           : in std_ulogic;
46
                  cp                   : in integer);
47
 
48
  procedure jtagcom(signal tdo           : in std_ulogic;
49
                    signal tck, tms, tdi : out std_ulogic;
50
                    cp, start, addr      : in integer;
51
                                                          -- cp - TCK clock period in ns
52
                                                          -- start - time in us when JTAG test
53
                                                          -- is started
54
                                                          -- addr - read/write operation destination address 
55
                    haltcpu          : in boolean);
56
 
57
 
58
end;
59
 
60
 
61
package body jtagtst is
62
 
63
  procedure clkj(tmsi, tdii : in std_ulogic; tdoo : out std_ulogic;
64
                 signal tck, tms, tdi : out std_ulogic;
65
                 signal tdo           : in std_ulogic;
66
                 cp                   : in integer) is
67
  begin
68
    tdi <= tdii;
69
    tck <= '0'; tms <= tmsi;
70
    wait for 2 * cp * 1 ns;
71
    tck <= '1'; tdoo := tdo;
72
    wait for 2 * cp * 1 ns;
73
  end;
74
 
75
  procedure shift(dr : in boolean; len : in integer;
76
                  din : in std_logic_vector; dout : out std_logic_vector;
77
                  signal tck, tms, tdi : out std_ulogic;
78
                  signal tdo           : in std_ulogic;
79
                  cp                   : in integer) is
80
    variable dc : std_ulogic;
81
  begin
82
    clkj('0', '-', dc, tck, tms, tdi, tdo, cp);
83
    clkj('1', '-', dc, tck, tms, tdi, tdo, cp);
84
    if (not dr) then clkj('1', '-', dc, tck, tms, tdi, tdo, cp); end if;
85
    clkj('0', '-', dc, tck, tms, tdi, tdo, cp);  -- capture
86
    clkj('0', '-', dc, tck, tms, tdi, tdo, cp);  -- shift (state)
87
    for i in 0 to len-2 loop
88
      clkj('0', din(i), dout(i), tck, tms, tdi, tdo, cp);
89
    end loop;
90
    clkj('1', din(len-1), dout(len-1), tck, tms, tdi, tdo, cp);  -- end shift, goto exit1
91
    clkj('1', '-', dc, tck, tms, tdi, tdo, cp);  -- update ir/dr
92
    clkj('0', '-', dc, tck, tms, tdi, tdo, cp);  -- run_test/idle                                                      
93
  end;
94
 
95
  procedure jwrite(addr, data           : in std_logic_vector;
96
                   signal tck, tms, tdi : out std_ulogic;
97
                   signal tdo           : in std_ulogic;
98
                  cp                    : in integer) is
99
    variable tmp : std_logic_vector(32 downto 0);
100
    variable tmp2 : std_logic_vector(34 downto 0);
101
    variable dr : std_logic_vector(32 downto 0);
102
    variable dr2 : std_logic_vector(34 downto 0);
103
    variable hsize : std_logic_vector(1 downto 0);
104
  begin
105
    hsize := "10";
106
    wait for 10 * cp * 1 ns;
107
    shift(false, 6, B"010000", dr, tck, tms, tdi, tdo, cp);  -- inst = addrreg
108
    wait for 5 * cp * 1 ns;
109
    tmp2 := '1' & hsize & addr;
110
    shift(true, 35, tmp2, dr2, tck, tms, tdi, tdo, cp); -- write add reg
111
    wait for 5 * cp * 1 ns;
112
    shift(false, 6, B"110000", dr, tck, tms, tdi, tdo, cp);  -- inst = datareg
113
    wait for 5 * cp * 1 ns;
114
    tmp := '0' & data;
115
    shift(true, 33, tmp, dr, tck, tms, tdi, tdo, cp); -- write data reg
116
  end;
117
 
118
  procedure jread(addr                 : in  std_logic_vector;
119
                  data                 : out std_logic_vector;
120
                  signal tck, tms, tdi : out std_ulogic;
121
                  signal tdo           : in std_ulogic;
122
                  cp                   : in integer) is
123
    variable tmp : std_logic_vector(32 downto 0);
124
    variable tmp2 : std_logic_vector(34 downto 0);
125
    variable dr : std_logic_vector(32 downto 0);
126
    variable dr2 : std_logic_vector(34 downto 0);
127
    variable hsize : std_logic_vector(1 downto 0);
128
  begin
129
    hsize := "10";
130
    wait for 10 * cp * 1 ns;
131
    shift(false, 6, B"010000", dr, tck, tms, tdi, tdo, cp);  -- inst = addrreg
132
    wait for 5 * cp * 1 ns;
133
    tmp2 := '0' & hsize & addr;
134
    shift(true, 35, tmp2, dr2, tck, tms, tdi, tdo, cp); -- write add reg
135
    wait for 5 * cp * 1 ns;
136
    shift(false, 6, B"110000", dr, tck, tms, tdi, tdo, cp);  -- inst = datareg
137
    wait for 5 * cp * 1 ns;
138
    tmp := (others => '0'); --tmp(32) := '1'; 
139
    shift(true, 33, tmp, dr, tck, tms, tdi, tdo, cp); -- read data reg
140
    data := dr(31 downto 0);
141
  end;
142
 
143
  subtype jword_type is std_logic_vector(31 downto 0);
144
  type jdata_vector_type is array (integer range <>) of jword_type;
145
 
146
  procedure jwritem(addr                 : in std_logic_vector;
147
                    data                 : in jdata_vector_type;
148
                    signal tck, tms, tdi : out std_ulogic;
149
                    signal tdo           : in std_ulogic;
150
                    cp                   : in integer) is
151
    variable tmp : std_logic_vector(32 downto 0);
152
    variable tmp2 : std_logic_vector(34 downto 0);
153
    variable dr : std_logic_vector(32 downto 0);
154
    variable dr2 : std_logic_vector(34 downto 0);
155
    variable hsize : std_logic_vector(1 downto 0);
156
  begin
157
    hsize := "10";
158
    wait for 10 * cp * 1 ns;
159
    shift(false, 6, B"010000", dr, tck, tms, tdi, tdo, cp);  -- inst = addrreg
160
    wait for 5 * cp * 1 ns;
161
    tmp2 := '1' & hsize & addr;
162
    shift(true, 35, tmp2, dr2, tck, tms, tdi, tdo, cp); -- write add reg
163
    wait for 5 * cp * 1 ns;
164
    shift(false, 6, B"110000", dr, tck, tms, tdi, tdo, cp);  -- inst = datareg
165
    wait for 5 * cp * 1 ns;
166
    for i in data'left to data'right-1 loop
167
      tmp := '1' & data(i);
168
      shift(true, 33, tmp, dr, tck, tms, tdi, tdo, cp); -- write data reg
169
    end loop;
170
    tmp := '0' & data(data'right);
171
    shift(true, 33, tmp, dr, tck, tms, tdi, tdo, cp); -- write data reg    
172
  end;
173
 
174
  procedure jreadm(addr                 : in  std_logic_vector;
175
                   data                 : out jdata_vector_type;
176
                   signal tck, tms, tdi : out std_ulogic;
177
                   signal tdo           : in std_ulogic;
178
                   cp                   : in integer) is
179
    variable tmp : std_logic_vector(32 downto 0);
180
    variable tmp2 : std_logic_vector(34 downto 0);
181
    variable dr : std_logic_vector(32 downto 0);
182
    variable dr2 : std_logic_vector(34 downto 0);
183
    variable hsize : std_logic_vector(1 downto 0);
184
  begin
185
    hsize := "10";
186
    wait for 10 * cp * 1 ns;
187
    shift(false, 6, B"010000", dr, tck, tms, tdi, tdo, cp);  -- inst = addrreg
188
    wait for 5 * cp * 1 ns;
189
    tmp2 := '0' & hsize & addr;
190
    shift(true, 35, tmp2, dr2, tck, tms, tdi, tdo, cp); -- write add reg
191
    wait for 5 * cp * 1 ns;
192
    shift(false, 6, B"110000", dr, tck, tms, tdi, tdo, cp);  -- inst = datareg
193
    wait for 5 * cp * 1 ns;
194
    for i in data'left to data'right-1 loop
195
      tmp := (others => '0'); tmp(32) := '1';
196
      shift(true, 33, tmp, dr, tck, tms, tdi, tdo, cp); -- read data reg
197
      data(i) := dr(31 downto 0);
198
    end loop;
199
    tmp := (others => '0');
200
    shift(true, 33, tmp, dr, tck, tms, tdi, tdo, cp); -- read data reg
201
    data(data'right) := dr(31 downto 0);
202
  end;
203
 
204
procedure jtagcom(signal tdo : in std_ulogic;
205
                  signal tck, tms, tdi : out std_ulogic;
206
                  cp, start, addr  : in integer;
207
                  haltcpu          : in boolean) is
208
  variable dc : std_ulogic;
209
  variable dr : std_logic_vector(32 downto 0);
210
  variable tmp : std_logic_vector(32 downto 0);
211
  variable data : std_logic_vector(31 downto 0);
212
  variable datav : jdata_vector_type(0 to 3);
213
begin
214
 
215
  tck <= '0'; tms <= '0'; tdi <= '0';
216
 
217
  wait for start * 1 us;
218
  print("AHB JTAG TEST");
219
  for i in 1 to 5 loop     -- reset
220
    clkj('1', '0', dc, tck, tms, tdi, tdo, cp);
221
  end loop;
222
  clkj('0', '-', dc, tck, tms, tdi, tdo, cp);
223
 
224
  --read IDCODE
225
  wait for 10 * cp * 1 ns;
226
  shift(true, 32, conv_std_logic_vector(0, 32), dr, tck, tms, tdi, tdo, cp);
227
  print("JTAG TAP ID:" & tost(dr(31 downto 0)));
228
 
229
  wait for 10 * cp * 1 ns;
230
  shift(false, 6, conv_std_logic_vector(63, 6), dr, tck, tms, tdi, tdo, cp);    -- BYPASS
231
 
232
  --shift data through BYPASS reg
233
  shift(true, 32, conv_std_logic_vector(16#AAAA#, 16) & conv_std_logic_vector(16#AAAA#, 16), dr,
234
        tck, tms, tdi, tdo, cp);
235
 
236
  -- put CPUs in debug mode
237
  if haltcpu then
238
      jwrite(X"90000000", X"00000004", tck, tms, tdi, tdo, cp);
239
      jwrite(X"90000020", X"0000FFFF", tck, tms, tdi, tdo, cp);
240
    print("JTAG: Putting CPU in debug mode");
241
  end if;
242
 
243
  if false then
244
  jwrite(X"90000000", X"FFFFFFFF", tck, tms, tdi, tdo, cp);
245
  jread (X"90000000", data, tck, tms, tdi, tdo, cp);
246
  print("JTAG WRITE " &  tost(X"90000000") & ":" & tost(X"FFFFFFFF"));
247
  print("JTAG READ  " &  tost(X"90000000") & ":" & tost(data));
248
 
249
  jwrite(X"90100034", X"ABCD1234", tck, tms, tdi, tdo, cp);
250
  jread (X"90100034", data, tck, tms, tdi, tdo, cp);
251
  print("JTAG WRITE " &  tost(X"90100034") & ":" & tost(X"ABCD1234"));
252
  print("JTAG READ  " &  tost(X"90100034") & ":" & tost(data));
253
 
254
  jwrite(X"90200058", X"ABCDEF01", tck, tms, tdi, tdo, cp);
255
  jread (X"90200058", data, tck, tms, tdi, tdo, cp);
256
  print("JTAG WRITE " &  tost(X"90200058") & ":" & tost(X"ABCDEF01"));
257
  print("JTAG READ  " &  tost(X"90200058") & ":" & tost(data));
258
 
259
  jwrite(X"90300000", X"ABCD1234", tck, tms, tdi, tdo, cp);
260
  jread (X"90300000", data, tck, tms, tdi, tdo, cp);
261
  print("JTAG WRITE " &  tost(X"90300000") & ":" & tost(X"ABCD1234"));
262
  print("JTAG READ  " &  tost(X"90300000") & ":" & tost(data));
263
 
264
  jwrite(X"90400000", X"ABCD1234", tck, tms, tdi, tdo, cp);
265
  jread (X"90400000", data, tck, tms, tdi, tdo, cp);
266
  print("JTAG WRITE " &  tost(X"90400000") & ":" & tost(X"ABCD1234"));
267
  print("JTAG READ  " &  tost(X"90400000") & ":" & tost(data));
268
 
269
  jwrite(X"90400024", X"0000000C", tck, tms, tdi, tdo, cp);
270
  jwrite(X"90700100", X"ABCD1234", tck, tms, tdi, tdo, cp);
271
  jread (X"90700100", data, tck, tms, tdi, tdo, cp);
272
  print("JTAG WRITE ITAG :" &  tost(X"00000100") & ":" & tost(X"ABCD1234"));
273
  print("JTAG READ  ITAG :" &  tost(X"00000100") & ":" & tost(data));
274
 
275
  jwrite(X"90400024", X"0000000D", tck, tms, tdi, tdo, cp);
276
  jwrite(X"90700100", X"ABCD1234", tck, tms, tdi, tdo, cp);
277
  jread (X"90700100", data, tck, tms, tdi, tdo, cp);
278
  print("JTAG WRITE IDATA:" &  tost(X"00000100") & ":" & tost(X"ABCD1234"));
279
  print("JTAG READ  IDATA:" &  tost(X"00000100") & ":" & tost(data));
280
 
281
  jwrite(X"90400024", X"0000000E", tck, tms, tdi, tdo, cp);
282
  jwrite(X"90700100", X"ABCD1234", tck, tms, tdi, tdo, cp);
283
  jread (X"90700100", data, tck, tms, tdi, tdo, cp);
284
  print("JTAG WRITE DTAG :" &  tost(X"00000100") & ":" & tost(X"ABCD1234"));
285
  print("JTAG READ  DTAG :" &  tost(X"00000100") & ":" & tost(data));
286
 
287
  jwrite(X"90400024", X"0000000F", tck, tms, tdi, tdo, cp);
288
  jwrite(X"90700100", X"ABCD1234", tck, tms, tdi, tdo, cp);
289
  jread (X"90700100", data, tck, tms, tdi, tdo, cp);
290
  print("JTAG WRITE DDATA:" &  tost(X"00000100") & ":" & tost(X"ABCD1234"));
291
  print("JTAG READ  DDATA:" &  tost(X"00000100") & ":" & tost(data));
292
  end if;
293
 
294
  --jwritem(addr, (X"00000010", X"00000010", X"00000010", X"00000010"), tck, tms, tdi, tdo, cp);
295
  datav(0) := X"00000010"; datav(1) := X"00000011"; datav(2) := X"00000012";  datav(3) := X"00000013";
296
  jwritem(conv_std_logic_vector(addr, 32), datav, tck, tms, tdi, tdo, cp);
297
  print("JTAG WRITE " &  tost(conv_std_logic_vector(addr,32)) & ":" & tost(X"00000010") & " " & tost(X"00000011") & " " & tost(X"00000012") & " " & tost(X"00000013"));
298
 
299
  datav := (others => (others => '0'));
300
  jreadm(conv_std_logic_vector(addr, 32), datav, tck, tms, tdi, tdo, cp);
301
  print("JTAG READ  " &  tost(conv_std_logic_vector(addr,32)) & ":" & tost(datav(0)) & " " & tost(datav(1)) & " "  & tost(datav(2)) & " " & tost(datav(3)));
302
 
303
  assert (datav(0) = X"00000010") and (datav(1) = X"00000011") and (datav(2) = X"00000012") and (datav(3) = X"00000013")
304
    report "JTAG test failed" severity failure;
305
 
306
  assert false report "JTAG test passed, halting with failure." severity failure;
307
 
308
  end procedure;
309
 
310
end;
311
 
312
-- pragma translate_on
313
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.