As mentioned in a few places in this discussion of SCSI, parallel buses can have signal
integrity problems, especially if used on long cables or at high signaling speeds. To help
ensure that the data sent from one device arrives intact at its destination, various SCSI
buses use two different data protection methods.
The first technique is SCSI bus parity. The parity method uses an extra bit
for each eight bits of data, which is computed by the sending device so that the sum of
all the "ones" in the nine bits taken together is either odd or even--one
is chosen as the standard for the interface, and for SCSI odd parity is used. At the
receiving device, the data is checked to see if the total is still odd; if an even number
of "ones" is seen, this means there was a data corruption problem (because one
bit is the wrong value somewhere) and the sender is signaled to retransmit. This simple
data protection method is not unique to SCSI; it has also been used for years for serial
communications and in memory circuits. For more details on parity, including examples
showing how it works, see this comprehensive
discussion in the memory section.
Note: SCSI parity is
almost universally supported, but some very early host adapters may not work with parity
checking enabled; to allow for this, many drives include a jumper to disable parity operation.
SCSI parity is useful, but is limited in its effectiveness, especially for very high
transfer rates. It cannot detect if two bits in a given byte of data flip, for example. To
further safeguard data, the SPI-3 standard introduced cyclic
redundancy checking or CRC to the SCSI world when double transition clocking was
introduced, allowing 160 MB/s data throughput on the bus. CRC is another technique that is
not new, just "new to SCSI". It has been used in a variety of places in the
computing world for decades, for example, in modems.
CRC is a bit difficult to describe in brief terms, and a full explanation is beyond the
scope of this site. In a nutshell, it is a more robust way of checking for data corruption
that can occur anywhere in a transmitted data message. A special algorithm is used that
calculates a binary code as a result of arithmetic operations on the data; this is called
a cyclic redundancy code (also abbreviated CRC). This code is sent along
with the data over the bus. The recipient runs the same computation on the data and checks
to see if it gets the same value that the sender computed; if there is any difference then
an error occurred. In fact, modern CRC implementations don't actually run the computations
using formulas, but rather use pre-created tables to speed up the process. This is sort of
like using "multiplication tables" as you might have memorized as a child,
instead of doing the computation from scratch each time.
At any rate, the bottom line is that CRC does a much better job of protecting data
transmitted on the bus, especially at high signaling speeds. It can in theory be used in
conjunction with parity, as they are independent. However, once CRC is being used, parity
is somewhat unnecessary, except perhaps for compatibility with older hardware. CRC is one
of the "optional" features of Ultra3 SCSI, and is
a required feature for hardware meeting the Ultra160 or Ultra160+ specifications.
Tip: If you really want
the "full scoop" on CRC, try this site. Be
warned that it is definitely not for the technically faint of heart.
Next: Command Queuing and Reordering