///MBusSpecs.tioga
Written by: Sindhu, September 1, 1984 1:51:14 pm PDT
Last Edited by: Sindhu, September 10, 1984 6:47:15 pm PDT
Last Edited by: Barth, December 13, 1984 2:08:47 pm PST
DRAGON M BUS SPECIFICATIONS
DRAGON M BUS SPECIFICATIONS
DRAGON M BUS SPECIFICATIONS
DRAGON PROJECT — FOR INTERNAL XEROX USE ONLY
DRAGON PROJECT — FOR INTERNAL XEROX USE ONLY
DRAGON PROJECT — FOR INTERNAL XEROX USE ONLY
The Dragon M Bus
Description and Specifications
Release as[Indigo]<Dragon>Documentation>MBus>MBusSpecs.tioga, .press

© Copyright 1984 Xerox Corporation. All rights reserved.
Abstract: This memo describes the Dragon M bus. It is intended to be used both as a convenient source for information about the M bus and as a reference manual for bus specifications.
The memo begins with a brief overview of the M bus. It then lists all the bus signals and defines the meaning of each signal group. Next, it uses these signals to describe in detail how the bus operates at both the cycle and transaction levels, and how certain transactions are used to maintain cache consistency. Finally, it gives the detailed timing of the bus transactions currently defined.
XEROX  Xerox Corporation
   Palo Alto Research Center
   3333 Coyote Hill Road
   Palo Alto, California 94304



For Internal Xerox Use Only
Contents
1. Introduction
2. Bus Signals
3. Bus Operation
4. Bus Timing
A. IO Address Space Definition
1. Introduction
The M bus is a high bandwidth synchronous bus that connects the components of a Dragon cluster. A Dragon cluster (Figure 1) consists of one or more Dragon processors attatched to the bus through caches, some main memory, a map processor, a display controller, and one or more I/O processors.
There are approximately 75 wires on the M bus. The multiplexed data/address path, which is checked by a single parity bit, is 32 bits wide. Four additional wires define the bus command, which encodes the action during the current bus cycle (a bus cycle is defined in the same way as a processor cycle: namely, one complete period of the system-wide two-phase clock; these two phases are labeled A and B, by convention). A pair of request/grant lines for each bus requestor along with miscellaneous control lines make up the remaining signals on the bus. Addresses on the M bus are real as opposed to virtual, and the unit of addressing is the 32 bit word. However, for efficient bus utilization the transfer to and from memory is in 4-word chunks called quads.
There is a single, central arbiter that permits the M bus to be time multiplexed between two or more contending devices. These devices make requests to the arbiter using the dedicated request lines, and the arbiter grants the bus using the dedicated grant lines. The arbiter uses a round-robin algorithm to guarantee fair (bounded-time) service to each requestor. A device that has been granted the bus is called bus master. The sequence of cycles initiated by a master will typically involve at least one other device on the bus; such a device is called a slave. Currently, the only devices that can become master are the caches. Caches can also act as slaves, as can all of the other devices.
Some M bus commands start a fixed sequence of cycles that are referred to as transactions. Transactions provide the mechanism for using the 32-bit wide data path for transferring multi-word items such as quads, and also permit the transfer of data on the bus to be flow controlled. Seven transactions are currently defined: ReadQuad, WriteQuad, WriteSingle, IORead, IOWrite, IOReadFlow, and IOWriteFlow. ReadQuad permits a cache to read a quad from another cache or from main memory. WriteQuad is the logical inverse of ReadQuad. WriteSingle is the operation used by a cache to write a single word to another cache. IORead and IOWrite are simple IO operations. IOReadFlow and IOWriteFlow are generalized IO operations that are used to do map operations as well as to transfer data to and from IO devices.
The sequence of cycles on the M bus may be interrupted at any time, even while a transaction is in progress, by the Dragon D bus. See the D bus specification for details.
The remainder of the document goes into greater detail about the structure, operation, and timing of the M bus. The next section lists the bus signals in detail and gives the meaning of each signal. Section 3 next uses these signal definitions to explain how the bus operates: it discusses arbitration, lists the set of bus commands currently defined, shows how these commands are used in each of the possible transactions, and how transactions are used to maintain cache consistency. Finally, Section 4 discusses the timing of arbitration and of each transaction in detail.
2. Bus Signals
The M bus has 73 signal lines that are listed below, together with the meaning of each group of lines. The description uses the following naming conventions: S[a..b) denotes a group of b-a lines that encode the bits representing the signal S; most significant bits of the signal are written leftmost. A signal represented by a single wire is written unencumbered with the [) notation. All signals are assumed to follow positive logic unless they have an "n" at the beginning of the signal name. Finally, the letters "AB" are appended to signal S if it is computed during phase A and becomes valid during the following phase B. Slaves should not assume that the bus becomes valid during A. The actual setup time at which the bus becomes valid at the slaves prior to the falling edge of B has not yet been determined. It is approximately 20ns.
MCmdAB[0..4)
These four lines encode the M bus command. The M bus command specifies the action in progress during the current bus cycle; it may be asserted either by the master or by a slave. The commands currently defined are discussed later in Section 3.2.
MDataAB[0..32)
The interpretation of these 32 lines depends on MCmdAB[0..4). For most commands the MDataAB lines simply represent the 32-bit address or data corresponding to a read or write; for other commands the interpretation is more complicated. The detailed interpretation appears in Section 3.2. As with MCmdAB, these lines also may be asserted either by master or slave.
MParityAB
This line carries the parity bit for MDataAB[0..32). The parity computed is odd and is valid only during data transport cycles.
nMShared
This line is used by the caches to maintain consistency for multiple copies of read/write data. When a cache puts out a read or write request on the bus, other caches match the address on the bus with addresses for which they have values stored. Whenever a cache finds a match it pulls nMShared low, signaling that the datum is shared. Note that this signal is asserted when low.
nMAbort
This line is used to prevent memory from responding to a ReadQuad and have a cache respond instead. Logically speaking nMAbort is not necessary, since nMShared can also be used to get the memory to abort. However, this would require the implementation to keep an additional state bit for each cache entry, which is expensive. It would also require more bandwidth from the RAM in the cache. Note that this signal also is asserted when low.
nMError 
This line is used to signal a bus error. The only bus error currently defined is bus parity error. Note that this signal is asserted when low. Normally, a pullup resistor ensures it is not asserted.
MRq[0..16)
These lines are used by the caches to request bus mastership. There is a dedicated line for each cache, so the lines are not bussed. Instead, they run radially, converging at the bus arbiter.
MGnt[0..16)
These lines are used by the arbiter to signal which of the caches gets the bus next. Like the request lines, these lines are also dedicated and therefore not bussed. There is a possibility that they will be replaced by 4 encoded grant lines that supply the number of the cache to which the bus has been granted. Alternatively, these encoded lines may be run in addition to the decoded lines. The encoded lines are needed by the Map processor to figure out which processor is currently bus master.
MNewRq
This line is logically unnecessary, but is needed to improve bus throughput. Loosely stated, it means that the current master is willing to relinquish the bus if there are other contenders at this time. Otherwise the current master will keep the bus. This allows a master to do multiple transactions without hogging the bus, and without wasting cycles to release and reacquire the bus in case there are no contenders.
3. Bus Operation
M bus operation can be explained most easily in terms of the operation at two levels: cycles and transactions. As explained earlier, a cycle is one complete period of the system-wide two-phase clock and a transaction is a sequence of contiguous cycles initiated by some bus device. Each cycle causes the execution of the bus command dictated by the MCmdAB field during the current cycle. During the first cycle of a typical transaction, MCmdAB specifies the transaction type and MDataAB specifies an address. Subsequent cycles transfer data, perform other manipulations, or signal end of transaction. Recall that the device that initiates a transaction is called the bus master, and other devices with which it interacts are called slaves. Bus mastership is obtained by making a request to the arbiter. Thus overall bus operation is a simple cyclic process of arbitration followed by transaction execution.
The description below first takes up arbitration. It then describes the various M bus commands as well as the set of transactions defined using these commands. For completeness, it also discusses how caches maintain the consistency of multiple copies of shared read/write data. The detailed timing of arbitration and of each of the transactions is not taken up here but is left to Section 4.
3.1 Arbitration
The signals involved in arbitration are the MRq-MGnt pairs running to and from each potential master and the arbiter, and a single line MNewRq used to enhance bus throughput. A device requests the bus by asserting its request line. If one or more MRq lines are asserted, and the bus is free, the arbiter performs a grant cycle in which it issues the bus by asserting the MGnt line for the highest priority device that has MRq asserted. Priority is round-robin, with the device last granted the bus receiving lowest priority.
The bus recipient keeps MRq asserted for as long as it wants the bus, and the arbiter in turn keeps MGnt asserted. If the master is executing a long sequence of cycles that is not required to be atomic with respect to other devices, it asserts MNewRq to indicate its willingness to give up the bus if there are other requests pending (for correct operation, MNewRq must be asserted only by the current master). MNewRq causes the arbiter to do a grant cycle even though the master still has MRq asserted. Since the master became the lowest priority device upon receiving the bus, it will lose the bus if any requests are pending. This strategy prevents a master from hogging the bus. At the same time, it avoids wasting cycles in the case that no devices are waiting to get the bus. A solution in which the master releases and reacquires the bus, for example, does waste cycles in this case.
3.2 M Bus Commands
There are a maximum of sixteen M bus commands. Twelve of these are currently defined, and the rest are reserved for future use. In the description below, the decimal number in brackets after the command name indicates the encoding for the command.
DataTransport {0}
This command is used during cycles in which data is being transported between two caches or between a cache and main memory. MDataAB[0..32) carries the data. The MParity bus signal is valid only during DataTransport cycles.
ReadQuad {1}
This command is issued by the master during the first cycle of a ReadQuad transaction, which reads a quad from memory or from another cache. A quad is four contiguous 32-bit words aligned in real address space such that the address of the first word is 0 MOD 4. During this command MDataAB[0..32) is the address of one of the words in the quad, and it is this word that will be returned first during subsequent DataTransport cycles.
WriteQuad {2}
This command is issued by the master during the first cycle of a WriteQuad transaction, which writes a quad to memory or to another cache. MDataAB[0..32) holds the address of the quad which, unlike the address for a ReadQuad transaction, must be 0 MOD 4.
WriteSingle {3}
This command is used by the master during the first cycle of a WriteSingle transaction, which writes a single word into the real address space. WriteSingle never writes the word to memory, but only to caches that have the quad containing the word being written. MDataAB[0..32) carries the address of the word.
Map {4}
Map is used by a master during the first cycle of an Map transaction. MDataAB[0..23] contains a virtual page, MDataAB[31] indicates that the master wishes to write into the indicated entry. The data returned when Done is issued contains a real page in MDataAB[0..23], kernel in MDataAB[27] and fault bits in MDataAB[28..31]. One or two low order bits in either the real or virtual page addresses are insignificant if the page size is large.
ChangeFlags {5}
ChangeFlags is used by the Map processor to get a specified set of caches to manipulate their map entries. This command is typically issued inside an IORead or IOWrite transaction. The set of caches addressed is encoded in MDataAB[24..29]. The value all ones indicates all caches on the M bus, and any other value indicates just the caches connected to the processor with this value as its number. MDataAB[30..31] is a function code that specifies the manipulation, and MDataAB[0..23] contains a real page number, which is valid only for some of the function codes. The interpretation of the function codes is as follows (in the table below rp stands for real page number; vp stands for virtual page number; wtEnabled is a bit per cache entry that means writes are permitted to the entry):
MDataAB[30..31] MDataAB[0..23] Meaning
0  rp clear vpValid and wtEnabled
   for all vp's that point to this rp
1  rp set wtEnabled for this rp (The
   undirected version of this
   command is unsafe because
   it could cause wtEnabled to
   get set even when writes are not
   permitted: eg. two spaces, one with
   writes permitted, the other not)
2  undefined clear vpValid and wtEnabled
   for all vp's
3  undefined clear wtEnabled for all vp's
IORead {6}
IORead is used by a master during the first cycle of an IORead transaction. MDataAB[0..31] contains the IO address. The IO address space is carved up into disjoint, contiguous pieces, with at most one device responding to each piece.
IOWrite {7}
IOWrite is used by a master during the first cycle of an IOWrite transaction. MDataAB[0..31] contains the IO address.
IOReadFlow {8}
IOReadFlow is used by a master during the first cycle of an IOReadFlow transaction. MDataAB[0..31] contains the IO address.
IOWriteFlow {9}
IOWriteFlow is used by a master during the first cycle of an IOWriteFlow transaction. MDataAB[0..31] contains the IO address.
Done {10}
Done is used by a slave device to terminate a Map, IOReadFlow, or IOWriteFlow transaction in which it is participating. MDataAB[0..31] contains the response if the initiating command was Map or IORead.
Reserved {11..14}
Command codes 11 through 14 are reserved for future use.
NoOp {15}
This command is used to indicate idle bus cycles.
3.3 M Bus Transactions
There are currently eight M bus transactions: ReadQuad, WriteQuad, WriteSingle, Map, IORead, IOWrite, IOReadFlow, and IOWriteFlow. Five of these transactions are flow controlled: ReadQuad, WriteQuad, Map, IOReadFlow, and IOWriteFlow. Every master device which initiates such a transaction must check that the slave device has driven the command lines to another value during the second cycle of the transaction. If the command lines still contain the initiating command then the master must assume that no slave will ever respond to the command and abandon the transaction.
The IORead, IOWrite, IOReadFlow and IOWriteFlow transactions are used by caches as a general way of communicating with IO devices. The 32 bit address of such transactions defines a large, unmapped IO address space that is common to all processors. This space is carved up into disjoint, contiguous pieces, with at most one device responding to each piece. Each device is free to interpret I/O commands in any manner it chooses.
A Dragon processor not in kernel mode limits the addresses which may be issued for either memory or I/O addresses. Since the cache translates virtual addresses to real addresses this imposes no restrictions upon devices connected to the M bus in the real address space. The cache does not translate I/O addresses and so designers of devices which are connected to the M bus in I/O address space should decide if the device should be protected when the processor is in user mode. The high order eight bits of address are not allowed to be zero when the processor is in user mode.
ReadQuad
ReadQuad reads a quad from main memory or from a cache, depending on where the current value lies. Recall that a quad is four contiguous 32-bit words aligned in real address space such that the address of the first word is 0 MOD 4.
The number of cycles in a ReadQuad is variable since the transaction is flow controlled to allow the memory more time to respond when necessary. In the first cycle the master cache issues a ReadQuad command, with MDataAB equal to the address. Then follow one or more wait cycles, and finally four DataTransport cycles, each containing one of the four words of the quad. During these cycles, MCmdAB and MDataAB are asserted by the slave. Note that the first word delivered is not necessarily the first word in the quad, but the word actually requested by the address in the first cycle; the other three words are delivered in order of increasing address (MOD 4).
WriteQuad
WriteQuad writes a quad to main memory or to a willing cache. The transaction starts out with a WriteQuad command from the master, with MDataAB equal to the address of the quad (note that this address must be 0 MOD 4, unlike the address for a ReadQuad). Then follow zero or more NoOp cycles, with MCmdAB being asserted by the memory and MDataAB driven to the first data word by the master. When the memory is ready to accept data, it sets MCmdAB to DataTransport. This starts a sequence of four DataTransport cycles in which the words are transported.
WriteSingle
WriteSingle writes a single word out to the real address space. Unlike WriteQuad, a WriteSingle never sends the word out to memory but is directed exclusively to caches. WriteSingles are not flow controlled, and always take two cycles. In the first cycle the master puts out MCmdAB← WriteSingle; MDataAB← address. In the second cycle it puts out MCmdAB← DataTransport; MDataAB← data to be written.
Map
Map reads a single word from the map cache and is flow controlled. In the first cycle the master sets MCmdAB to Map and MDataAB to MapData. Then follow zero or more cycles in which the slave sets MCmdAB to anything but Done. These may either be wait cycles inserted by the slave to give itself time to respond, or other cycles that the slave needs to execute to process the Map. Finally, the slave sets MCmdAB to Done and MDataAB to MapData.
IORead
IORead reads a single word from the IO address space and is not flow controlled. In the first cycle the master sets MCmdAB to IORead and MDataAB to IOAddress. During the second cycle the master sets MCmdAB to Done and the slave sets MDataAB to IOData.
The interpretation of an IORead is entirely up to the responding device. Thus it may actually read from a real device or may cause some side effect, or both.
IOWrite
IOWrite writes a single word to the IO address space and is not flow controlled. In the first cycle the master sets MCmdAB to IOWrite and MDataAB to IOAddress. In the second cycle the master sets MCmdAB to Done and MDataAB to IOData.
IOReadFlow
IOReadFlow reads a single word from the IO address space and is flow controlled. In the first cycle the master sets MCmdAB to IOReadFlow and MDataAB to IOAddress. Then follow zero or more cycles in which the slave sets MCmdAB to anything but Done. These may either be wait cycles inserted by the slave to give itself time to respond, or other cycles that the slave needs to execute to process the IOReadFlow. Finally, the slave sets MCmdAB to Done and MDataAB to IOData.
IOWriteFlow
IOWrite writes a single word to the IO address space. It is also flow controlled. In the first cycle the master sets MCmdAB to IOWrite and MDataAB to the IOAddress. In the second cycle the slave drives MCmdAB to NoOp or Done and the master drives MDataAB. If the slave put out Done the transaction is complete. Otherwise the slave is free to drive MCmdAB and MDataAB for the third and subsequent cycles as long as it doesn't set MCmdAB to Done. The slave terminates the transaction by setting MCmdAB to Done; MDataAB is undefined during this cycle.
3.4 The Cache Consistency Algorithm
The cache consistency problem is to prevent multiple copies of a datum in distinct caches from having different values. This problem arises because Dragon caches contain shared data that may be written into.
The solution involves the use of the nMShared and nMAbort bus lines and two additional bits shared and owner stored with each quad in a cache. For a given quad, if shared is false then no other cache contains the quad. However, if shared is true other caches may or may not contain the quad (there is uncertainty because when sharing stops this fact is not discovered immediately). Owner is true if and only if the last write into the quad was done by the processor attached to the cache.
A cache initiates a ReadQuad when it gets a miss for a quad; it issues a WriteQuad when a quad needs to get kicked out of the cache to make room for another quad (only quads with owner set need to be written out); and it issues a WriteSingle when its processor does a write to a quad that has shared set. When a cache issues a ReadQuad, WriteQuad, or WriteSingle all other caches on the bus match the quad address to determine if they have the quad. Any cache that matches asserts nMShared to signal that the quad is shared. During ReadQuads the master and all matching slaves copy the value of nMShared into the shared bit for that quad. Also, when a cache issues a WriteSingle the master copies the value of nMShared into the shared bit. This ensures that sharing is detected as soon as it starts and is eventually detected when it stops.
The owner bit is set each time a processor writes one of the words of the quad. If the quad is shared, the resulting WriteSingle will update all other copies of the quad and cause their owner bits to be cleared. Thus at any time at most one of the caches will have owner set. Owner may not be set at all, of course, if the quad has not been written into since it was read from memory.
During a ReadQuad two distinct cases are possible. Either a dirty quad (ie. one that hasn't been written out to memory yet) exists in other caches or it doesn't. In the first case the owner (and possibly other caches) assert nMShared. The owner also asserts nMAbort, preventing the memory from responding, and then proceeds to supply the quad to the master. The second case breaks down into two subcases. In the first subcase no other cache has the quad, nMShared does not get asserted, and the quad comes from memory. In the second subcase at least one other cache has the data, the nMShared line does get asserted, but the quad still comes from memory because no cache asserted nMAbort.
3.5 Laundering and Flushing Caches
Some devices implement a portion of the real address space on a M bus. They may require that their local copy of data be made consistent with the data in caches, i.e. they want to clean dirty data out of caches or launder it, so that they may access that data without utilizing M bus bandwidth. They may also wish to force caches to fetch data from their local copy because they want to privately update it, again without utilizing M bus bandwidth. This can be implemented by requiring caches to forget what they know about the contents of memory locations, i.e. flushing those contents from the caches.
Locations 0 and 1 of the I/O address space are reserved to broadcast launder and flush parameters to the caches. Since this is a broadcast operation only IORead and IOWrite transactions may access these locations. Caches will not respond to IOReadFlow and IOWriteFlow transactions to these locations. Bits [0..23] of location 0 serve as a mask which is bitwise "anded" with the high order bits of each location in the cache and the result is compared to bits [0..23] of location 1. If there is a match then the entry is selected for the operation. The operation is specified by bit 31 of location 1, a zero indicating launder and a one indicating flush. Dirty data is written back to memory prior to flushing an entry. When location 1 is written the operation is started.
The map cache contains an IOWrite command reflector that takes address and data in argument registers and issues an IOWrite command. This mechanism exists so that no cache has to both issue and interpret an I/O command at the same time. The cycles look like:
MCmdAB   MDataAB
master: IOWriteFlow master: address register
mapCache: Done  master: address
master: IOWriteFlow master: data register
mapCache: NoOp  master: data
mapCache: IOWrite  mapCache: address
mapCache: DataTransport mapCache: data
mapCache: Done  undefined
Another way to do this would be to require the issuing cache to interpret the IOWrite or IOStore to location 1 itself and not involve the map processor at all.
Conceptually each cache maintains an operation in progress bit that indicates that an operation has been started but not yet finished. An IOWrite to location 1 sets this bit. The elimination, by writing back any dirty data and then resetting rpValid and vpValid, of all entries which match on address reset this bit if the operation is flush. Writing back the dirty data of all entries which match on address reset this bit if the operation is launder.
While the operation is being processed each cache arbitrates for the bus when it discovers an entry with dirty data and then rearbitrates for each successive entry found to be dirty. Requests from the P bus side demanding M bus service have higher priority than the operation requests. Both of these requirements prevent a hiccup from occuring in the system when there is a great deal of dirty data to be cleansed.
It is assumed that the amount of time required to service a launder or flush request is small compared to context switch time. Thus the processor which initiated the operation should be held by issuing PReject until the operation is complete. However the controller of the cache which issued the request must be free to process it which implies another bit of state, operation pending. While this is set the cache issues PReject; when it is reset the cache no longer issues PReject. This bit is set when the processor issues an IOStore to location 1. The processor should be very careful not to issue IOStoreHold to this location since if there is dirty data in any other cache the system will deadlock; perhaps the cache should check for this condition and treat such an IOStoreHold as if it were an IOStore.
How does the operation pending bit get reset? The wired-or approach with a pullup resistor requires too much power. One could fling an IORead off to a location with one address bit known to be zero, if any cache is not yet finished it could drive that bit to a one. This violates the single driver invariant which has been preserved on the bus so far. It also requires the state machine to poll instead of passively waiting for an input to change. Another hack would be to use a variation on Hoel's trick. Reset a flop when the IOWrite to location 1 occurs. Every cache in which operation in progress is set flips the flop on every cycle and drives the flop out onto a wire. If the cache with operation pending set ever sees two cycles in a row with the same value on this wire then it says to itself ah hah and resets operation pending. Should a weak resistive divider network should be put on this line to keep it from flopping around when no drive is applied?
4. Bus Timing
This section gives the detailed timing of bus arbitration and of each of the transactions just described. In the timing diagrams used below, each row corresponds to one bus cycle. Actions during the cycle are indicated using Mesa like statements. Idle bus cycles are indicated by shading a single row of the timing diagram, with each shaded row representing zero or more cycles. The variable w will be used to represent the number of wait cycles.
For each of the descriptions below, cycle 0 will be the cycle in which the requestor asserts MRq. For simplicity, the timings for each of the transactions will assume the minimum arbitration delay of zero cycles.
4.1 Arbitration
The timing for arbitration appears in Figure 2. A requestor asserts MRq during phase B of cycle 0. The arbiter latches the request during the A of cycle 1, and if the bus is free MGnt gets asserted in the A of cycle 2. The new master can drive the bus during the A of cycle 3. Thus the minimum arbitration delay is three cycles. If the bus is not free, zero or more wait cycles get inserted immediately after cycle 1.
MNewRq behaves somewhat differently than all the other bus lines as far as mastership is concerned. A requester becomes bus master with respect to MNewRq during the B of cycle 2+w while it acquires the rest of the bus during the A of cycle 3+w. Conversely, it relinquishes MNewRq during the B immediately after the A during which MGnt falls.
The earliest MRq can be deasserted is during cycle 2+w. The earliest MGnt is deasserted in response is during cycle 4+w, and the earliest a new device can become master is during cycle 5+w.
4.2 ReadQuad
Figure 3 shows the timing for ReadQuad. Cycles 0 through 2 are taken up by arbitration (recall that we are assuming the minimum arbitration delay).
The first cycle of the transaction is cycle 3, during whose A the master sets MCmdAB← ReadQuad; MDataAB← RQAddress; nMShared← true; nMAbort← true. Cycle 4 is always a dead cycle: the memory sets MCmdAB← NoOp; slave caches set nMShared to false if there is a match; and a slave cache that is owner, if there is an owner, sets nMAbort← false. Next there are w (zero or more) wait cycles, with the slave setting MCmd← NoOp. Cycles 5+w through 8+w are data transfer cycles in which the slave sets MCmdAB← DataTransport; MDataAB← data; MParity← parity. During the B of cycle 6+w the master may drop MRq, and if it does, the arbiter drops MGnt during the A of 8+w.
Note that the minimum number of cycles for ReadQuad is 6, assuming zero memory wait.
4.3 WriteQuad
Figure 4 shows the timing for WriteQuad. Cycles 0 through 2 are devoted to arbitration as usual.
During the A of cycle 3 the master sets MCmdAB← WriteQuad; MDataAB← WQAddress; nMShared← true. Next there are w (zero or more) wait cycles where the master asserts MDataAB and MParity and the memory asserts MCmdAB. Cycle 4+w is a data transport cycle, with the memory asserting MCmdAB and the master asserting MDataAB. During cycle 4, nMShared is set to false if there is a match, regardless of the value currently asserted for MCmdAB. Cycles 5+w, 6+w and 7+w are again data transport cycles with the memory asserting MCmd and the master supplying the data. During the B of cycle 5+w the master may drop MRq, and if it does, the arbiter drops MGnt during the A of 7+w.
Note that the minumum number of cycles for WriteQuad is 5.
4.4 WriteSingle
Figure 5 shows the timing for WriteSingle. Cycles 0 through 2 are devoted to arbitration. During the B of cycle 2 the master may set MRq← false, and if it does, the arbiter drops MGnt during the A of cycle 4.
Cycle 3 is the first transaction cycle. During phase A the master sets MCmdAB← WriteSingle; MDataAB← WSAddress; and nMShared← true. During the A of cycle 4 the master sets MCmdAB← DataTransport; MDataAB← WSData; MParity ← parity. Also at this time if there is a match one or more slaves set nMShared← false.
4.5 IORead
Figure 6 shows the timing for IORead. Arbitration takes place during cycles 0 through 2.
During the A of cycle 3 the master sets MCmdAB← IORead; MDataAB← IOAddress. Then follow w cycles during which the slave uses the bus for commands other than Done (these cycles may be idle). As usual, w is zero or more. During the A of cycle 4+w the slave sets MCmdAB← Done; and MDataAB← IOData. Cycles 5+w through 7+w may be idle cycles, with the master setting MCmdAB← NoOp. During the B of cycle 5+w the master may set MRq← false and if it does, the arbiter sets MGnt← false during the A of 7+w.
4.6 IOWrite
Figure 7 shows the timing for IOWrite. Like IORead, IOWrite also is flow controlled and its timing is similar. Cycles 0 through 2 are for arbitration as usual.
During the A of cycle 3 the master sets MCmdAB← IOWrite; MDataAB← IOAddress. During the A of cycle 4 the master sets MDataAB← IOData. During this phase the slave sets MCmdAB← Done or to NoOp. If it sets Done the transaction is over.
If Done is not asserted during cycle 4 then the following w cycles are used by the slave for commands other than Done. During the A of cycle 5+w the slave sets MCmdAB← Done. Cycles 6+w through 8+w may be idle, with the master setting MCmdAB← NoOp. During the B of 6+w the master sets MRq← false, and if it does the arbiter sets MGnt← false during the A of 8+w.
DragonCluster.press leftmargin: 2 in, topmargin: 1 in, width: 7.5 in, height: 8 in
BusArb.press leftmargin: 2 in, topmargin: 1 in, width: 7 in, height: 5 in
ReadQuad.press leftmargin: 2 in, topmargin: 1 in, width: 7 in, height: 6.5 in
WriteQuad.press leftmargin: 2 in, topmargin: 1 in, width: 7 in, height: 5.5 in
WriteSingle.press leftmargin: 2 in, topmargin: 1 in, width: 7 in, height: 4 in
IORead.press leftmargin: 2 in, topmargin: 1 in, width: 7 in, height: 5 in
IOWrite.press leftmargin: 2 in, topmargin: 1 in, width: 7 in, height: 5.5 in