1 |
3 |
Quanticles |
|
2 |
|
|
FILES
|
3 |
|
|
scan.perl.v
|
4 |
|
|
scan_signal_list.pl
|
5 |
|
|
scan_testbench.perl.v
|
6 |
|
|
|
7 |
|
|
AUTHOR
|
8 |
|
|
David Fick - dfick@umich.edu
|
9 |
|
|
|
10 |
|
|
VERSION
|
11 |
|
|
1.0 - June 27, 2010
|
12 |
4 |
Quanticles |
1.1 - January 7, 2011
|
13 |
11 |
Quanticles |
1.2 - Feb 7, 2013
|
14 |
3 |
Quanticles |
|
15 |
|
|
SCAN DESCRIPTION
|
16 |
|
|
This is a simple scan chain implemented with deperlify. It has been
|
17 |
|
|
used, successfully, on multiple tapeouts.
|
18 |
|
|
|
19 |
|
|
This scan chain is designed to safely and easily move data onto and
|
20 |
|
|
off of a chip with a minimal number of pins. Performance is not a
|
21 |
|
|
priority, however, we have found it to be sufficiently fast for
|
22 |
|
|
any student project.
|
23 |
|
|
|
24 |
|
|
For safety, this scan uses two non-overlapping "clocks" that operate
|
25 |
|
|
out of phase. Each bit in the scan chain has a master latch and
|
26 |
|
|
a slave latch. The master latch is connected to the signal "phi",
|
27 |
|
|
and the slave latch is connected to the signal "phi_bar". To clock
|
28 |
|
|
in one bit (and out another), "data_in" is first set to the correct
|
29 |
|
|
value, then "phi" is *pulsed*, afterward "phi_bar" is *pulsed*. The
|
30 |
|
|
process then repeats for the next bit. Since each clock is pulsed
|
31 |
|
|
individually, they will never overlap. Note that this design
|
32 |
|
|
is immune to signal bouncing.
|
33 |
|
|
|
34 |
|
|
Every data_bit coming out of the scan chain unit is first buffered
|
35 |
|
|
with a latch. This latch is transparent when "scan_load_chip" is
|
36 |
|
|
high. Thus, data is loaded onto the chip by first clocking in all
|
37 |
|
|
of the data as described above, then pulsing "scan_load_chip".
|
38 |
|
|
This means that the signals coming out of the scan unit to the
|
39 |
|
|
rest of the chip do not toggle randomly when the scan chain is
|
40 |
|
|
being loaded, and therefore the scan chain can be operated while
|
41 |
|
|
the chip is running.
|
42 |
|
|
|
43 |
|
|
The signal "scan_load_chain" controls a mux on the input of each
|
44 |
|
|
latch pair. If "scan_load_chain" is high, then data from the chip
|
45 |
|
|
is loaded into the scan chain when the two clocks are pulsed,
|
46 |
|
|
instead of data from the preceding bit. Thus, to read data
|
47 |
|
|
from the chip, first raise "scan_load_chain" high, pulse the two
|
48 |
|
|
clocks once as normal, then lower "scan_load_chain". Now that
|
49 |
|
|
the chip data has been loaded into the scan chain, clock out the
|
50 |
|
|
data as normal.
|
51 |
|
|
|
52 |
4 |
Quanticles |
To create a large number of bits, address and data fields may
|
53 |
|
|
be created for a signal. 2^addr_bits*data_bits must be greater
|
54 |
|
|
than the size. In this way, only addr_bits+data_bits number of
|
55 |
|
|
bits may be generated in the scan chain, which reduces the
|
56 |
|
|
length of the scan chain, as well as the area, since latches
|
57 |
|
|
are much smaller than the muxing elements needed for the
|
58 |
|
|
chain. Since this is a new feature, the size specified by the
|
59 |
|
|
address and data bits should most likely match the total size
|
60 |
|
|
in order to avoid bugs.
|
61 |
|
|
|
62 |
11 |
Quanticles |
An optional research field is included in the scan signal list.
|
63 |
|
|
When the scan reset bet is set to 1, all bits in the scan chain
|
64 |
|
|
are set to their optional reset value when specified, or zero
|
65 |
|
|
when it is not specified.
|
66 |
|
|
|
67 |
4 |
Quanticles |
Due to the buffering latches, complex internal interfaces can be
|
68 |
3 |
Quanticles |
emulated using the scan chain. For instance, an SRAM could be
|
69 |
|
|
connected to a clock, chip select, write enable, 64-bit data-in,
|
70 |
|
|
and 64-bit data-out, all of which are connected to the scan
|
71 |
|
|
chain. The scan chain would need to be used a few times for each
|
72 |
|
|
"cycle" of the SRAM. For instance, each time the clock signal
|
73 |
|
|
toggles the scan chain would need to be completely reloaded.
|
74 |
|
|
Although this process is slow, it works reliably.
|
75 |
|
|
|
76 |
|
|
The example description below has additional information about
|
77 |
|
|
how to use the scan chain.
|
78 |
|
|
|
79 |
|
|
|
80 |
|
|
EXAMPLE DESCRIPTION
|
81 |
4 |
Quanticles |
To run the example, call "make". The example uses Synopsys VCS.
|
82 |
3 |
Quanticles |
|
83 |
|
|
This example takes advantage of the DEPERLIFY_INCLUDE command. The
|
84 |
|
|
scan.perl.v file reads in the data structure scan_signal_list.pl
|
85 |
|
|
in order to generate the scan chain. The file scan_testbench.perl.v
|
86 |
|
|
uses the same data structure to generate variables and functions
|
87 |
|
|
to access the scan chain.
|
88 |
|
|
|
89 |
|
|
The testbench generates a write variable and read variable for
|
90 |
|
|
each element in the scan chain. The write variable is called
|
91 |
|
|
and the read variable is called _read. The values
|
92 |
|
|
with the name are what is scanned into the scan chain
|
93 |
|
|
by the task "rotate_chain". The task "rotate_chain" writes the
|
94 |
|
|
variables with the name _read with the data that is scanned
|
95 |
|
|
out by the scan chain. Note that data is simultaneously scanned
|
96 |
|
|
in and out.
|
97 |
|
|
|
98 |
|
|
To write a value:
|
99 |
|
|
1. Set the value of to what you desire
|
100 |
|
|
2. Call "rotate_chain"
|
101 |
|
|
3. Call "load_chip"
|
102 |
|
|
|
103 |
|
|
To read a value:
|
104 |
|
|
1. Call "load_chain"
|
105 |
|
|
2. Call "rotate_chain"
|
106 |
|
|
3. Read the value of _read
|
107 |
|
|
|
108 |
|
|
|
109 |
|
|
|
110 |
|
|
|
111 |
11 |
Quanticles |
|