Abstract:
Test vectors for a circuit containing both logic gates and memory blocks are evaluated by applying candidate test vectors to good and faulty versions of the circuit in a computer simulation. The functions of the gates and interconnections in the circuit are stored in memory and the operation of the good and faulty circuits is simulated concurrently. During the simulation, a memory record is created for storing the state of a circuit element in a faulty circuit if the fault is visible at the element. Such records are removed when no longer needed, which speeds up the simulation. A multiprocessor in a pipeline configuration is disclosed for performing the simulation. A first branch in the pipeline simulates the logic gates in the circuit; a second branch simulates the memory blocks.

Description:
This application is a continuation of application Ser. No. 07/954,547, filed on Sep. 30, 1992, now abandoned. 
    
    
     TECHNICAL FIELD 
     This invention relates to fault simulation of digital logic circuits containing both logic elements, such as AND and OR gates, and functional elements, such as memory blocks, and more specifically to concurrent simulation of faults in such circuits using a pipelined multiprocessor and dynamic memory allocation to speed up the simulation. 
     BACKGROUND OF THE INVENTION 
     With the growing complexity of designs for VLSI integrated circuit chips, there is an ever increasing need for improvements in methods of testing such chips. Because it is not practical to exhaustively test ail the logic and memory circuits on such a chip, a suite of test vectors is typically selected that will exercise the chip sufficiently to expose a relatively high percentage of possible faults. Use of such a suite in testing manufactured chips then gives a high probability that ail existing faults will be detected. 
     In developing a suitable test-vector suite, it is well known to evaluate a given test vector with respect to a given fault in a simulated circuit by applying the test vector to the inputs of the circuit both with and without the fault and comparing the outputs from the circuit. The test vector has detected the fault if the outputs are different, but not if the outputs are the same. 
     Fault simulation, then, uses the techniques of logic simulation with the addition of fault injection and output comparison. Such simulation can require large amounts of data handling for complex circuits. For this reason, it has been useful to augment the computing power of existing computers to handle the additional computing load within a reasonable time. Devices to accomplish this task are known as hardware accelerators. One such hardware accelerator for use in circuit simulation is disclosed in U.S. Pat. No. 5,093,920. Such accelerator includes a number of separate processors connected in pipeline fashion with the simulation being carried out with each processor performing part of the overall simulation algorithm. The processors communicate by passing messages to each other relating to &#34;events&#34; occurring in the circuit being simulated. An event is a change in state of one of the elements in the circuit, for example, the change in state of the output of an AND gate from &#34;0&#34; to &#34;1&#34;. Simulation is initiated by injecting messages into the pipeline to simulate events occurring on the inputs of the circuit when a test vector is applied to such inputs. Each event can give rise to subsequent events in the circuit in a recursive fashion. When the effects of all such events have been propagated through the simulated circuit, the outputs of the circuit for such test vector are logged. 
     One method of simulating multiple faults in a circuit includes simulating the circuit without faults (the &#34;good&#34; circuit) with a suite of test vectors to determine the output of such circuit for each test vector, then injecting a fault (thereby creating a &#34;faulty&#34; circuit), repeating the simulation and comparing the outputs to determine which of the vectors detected the fault. If it is desired to simulate a large number of faults and a large suite of test vectors, such procedure can be extremely time consuming and, therefore, impractical for complex circuits. A commonly practiced alternative is to perform a concurrent simulation of the good circuit and a number (e.g., 1000) of faulty circuits. If organized properly, such concurrent simulation saves repeated simulation of those pans of the good circuit that are not affected by a given fault. Concurrent fault simulation in a pipeline hardware accelerator is described in &#34;Fault Simulation in a Pipelined Multiprocessor System,&#34; by Prathima Agrawal et al. in the Proceedings of the IEEE 1989 International Test Conference, p.727. Concurrent simulation is described also in U.S. Pat. No. 4,769,817. 
     An additional problem in simulating the effect of circuit faults is the simulation of the effect of such faults on functional circuits, such as memory blocks, programmable gate arrays and other multiple input, multiple output combinational or sequential circuits. Memory blocks, such as registers, random-access memories and read-only memories, are typical in VLSI circuits and fault simulation of such circuits cannot be considered complete without taking such memory blocks into account. It is not always necessary to consider faults in the memory blocks or other functional circuits themselves; it is often sufficient to just simulate the effects on memory blocks of faults external to the memory blocks. The simulation of memory blocks in circuits is described in &#34;Modeling and Simulation of Functional Memory Blocks in the MARS Accelerator&#34; by Prathima Agrawal et al. in the Proceedings of the International Workshop on Hardware Accelerators, Oxford, England 1989. Fault simulation of memory blocks is also alluded to briefly in such paper and in the paper referred to in the previous paragraph. 
     When concurrent fault simulation is being performed for a complex circuit, with or without functional circuits, in a pipelined hardware accelerator, it is desirable to find efficient ways of handling the data storage and processing problems. Such problems are exacerbated when functional circuits, such as memory blocks, are included because the effects of external faults on data stored in the memory block must be tracked. Much of the processing in fault simulation involves searching for data records relating to the effects of given faults on the various circuit elements. It is therefore desirable to minimize the time for such searches, and the amount of storage needed for such records, by eliminating records created early in a simulation that are no longer needed. Accordingly, it is an object of the invention to achieve an efficient method and apparatus for controlling the data records for concurrent fault simulation in a pipeline hardware accelerator. It is a further object of the invention to extend such method and apparatus for such fault simulation wherein functional circuits such as memory blocks are included in the circuit being simulated. Other objects of the invention will be apparent from the following specification and attached drawings. 
     SUMMARY OF THE INVENTION 
     Test vectors for a circuit containing both logic gates and memory blocks are evaluated by applying candidate test vectors to good and faulty versions of the circuit in a computer simulation. The functions of the gates and interconnections in the circuit are stored in memory and the operation of the good and faulty circuits is simulated concurrently. During the simulation, a memory record is created for storing the state of a circuit element in a faulty circuit if the fault is visible at the element. Such records are removed when no longer needed, which speeds up the simulation. A multiprocessor in a pipeline configuration is disclosed for performing the simulation. A first branch in the pipeline simulates the logic gates in the circuit; a second branch simulates the memory blocks. 
    
    
     These and other aspects of the invention will become apparent from the attached drawings and detailed description. 
     BRIEF DESCRIPTION OF THE DRAWING 
     FIG. 1 is a block diagram of a pipelined multiprocessor configured for fault simulation in accordance with the invention. 
     FIG. 2 is a flow chart showing the operation of a fault data processor in the pipelined multiprocessor during simulation of a good circuit. 
     FIG. 3 is a flow chart showing the operation of an event detector processor in the pipelined multiprocessor. 
     FIG. 4 is a flow chart showing the operation of the fault data processor during simulation of faulty circuits. 
     FIG. 5 is a flow chart showing the operation of a memory block control processor in the pipelined multiprocessor during simulation of a good circuit. 
     FIG. 6 is a flow chart showing the operation of the memory block during simulation of certain faulty circuit. 
     FIG. 7 is a flow chart showing the operation of the memory block during simulation of certain other faulty circuits. 
     FIG. 8 is a flow chart showing the operation of a memory block descriptors processor in the pipelined multiprocessor during simulation of a good circuit. 
     FIG. 9 is a flow chart showing the operation of a memory block descriptors processor during the simulation of faulty circuits. 
     FIG. 10 is a flow chart showing the operation of a physical memory processor in the pipelined multiprocessor during simulation of a good circuit. 
     FIG. 11 is a flow chart showing the operation of the physical memory processor during simulation of faulty circuits. 
    
    
     DETAILED DESCRIPTION 
     The invention will described in terms of a special or general purpose multicomputer comprising a number of separate processors arranged in a pipeline configuration. Such a multicomputer is typically configured as a hardware accelerator for use in a host computer. However, it will be clear to the skilled practitioner that the invention can be implemented using other types of computers, if desired. 
     FIG. 1 is a block diagram of the processors of multicomputer 100 arranged in a pipeline configuration for use in concurrent fault simulation in accordance with the invention wherein separate parallel paths or branches are provided for simulation of logic-gates and functional circuits, respectively. The invention will be described with the assumption that the functional circuits are all memory blocks, but it will be clear to those skilled in the an that the invention is applicable to other kinds of functional circuits. The principal paths for messages between processors 101-114 are shown; however, paths not shown between certain pairs of processors can be used in certain circumstances, as will be described. Other paths (not shown) are also provided between host processor 120 and processors 101-114. Typically, processors 101-114 will be in the form of a hardware accelerator for use in host processor 120. Processors 101-114 each contain program memory (typically 8 kilobytes) and data memory (typically 4 to 8 megabytes) that can be downloaded as needed from host processor 120. An example of a processor that can be used for host processor 120 is a Sun 4 SPARC Station. A typical simulation problem for such a processor configuration can involve up to sixty-four thousand four-input logic gates, up to one thousand faults and millions of test vectors. 
     The division of functions among processors 101-114 depends on the complexity of the functions to be performed, the amount of data storage needed for each function and the sequence in which the functions are performed. As will be seen, some processors perform more than one function and other processors can be replicated to eliminate bottlenecks. 
     In a particular embodiment of the invention, the logic circuits to be simulated are represented by means of primitive elements, each having four input terminals and one output terminal. Each such terminal can be in one of four states &#34;0&#34;, &#34;1&#34;, unknown, or unused. Logic gates having more than four inputs and functional circuits, such as memory blocks, having more than four inputs and/or more than one output are represented as groups of such primitives. Thus, an eight-input AND gate would be represented by three primitives: two four-input AND gates with outputs connected to the inputs of a two-input AND gate. Memory blocks are also represented by similar elements. For example, a memory block having three lines for control, eight input lines for the address, eight input lines for data and eight output lines for data can be represented by five primitive elements: a first primitive element for the three control lines, second and third primitive elements for the eight address lines and fourth and fifth primitive elements for the data input and output lines. One input terminal and the output terminal on the first primitive element are unused and the output terminals on the second and third primitive elements are unused. 
     As a result of this representation structure, the various data records and tables representing states of logic gates and memory blocks and the various messages circulating in the pipeline can have similar formats regardless of the size and type of the circuit elements being represented. 
     The function of each processor will now be described briefly, then the overall operation of the invention will be explained in more detail. The topology of the circuit being simulated is loaded by host processor 120 into fanout list processor 104 in the form of lists of points to which each circuit element is connected. Pointers to the beginning of such fanout lists are stored in fanout pointers processor 103. For purposes that will become apparent below, connections from logic gates to the input terminals of memory blocks are also stored in interface processor 114. The type of each primitive in the circuit (i.e. AND, OR, NOT) is stored in input faults/function processor 107, which has a dual function of (i) altering event messages to insert input faults for faulty circuits and (ii) simulating the functions of the various kinds of gates. The characteristics of each memory block in the circuit are stored in memory block control processor 108 and memory block descriptors processor 109. 
     As will become apparent, two general kinds of event messages circulate in the pipeline: (i) messages that change the state of inputs and outputs of circuit elements and (ii) messages that add and delete records relating to faults in the circuit being simulated. 
     The suite of test vectors to be used in a simulation is stored in test vectors/delay processor 112, which also stores delay information for each circuit element. Signal scheduler 101 coordinates and transmits event messages into the pipeline in response to messages received from the pipeline. At the beginning of the simulation of the response to a test vector, such messages originate in processor 112; as simulation proceeds, such messages result from the simulated operation of the circuit and originate in event detector 111 and other processors. Signal scheduler 101 maintains at least two queues for event messages to insure that such messages are sent along the pipeline in proper sequence. 
     Output logger 102 records the states of the signals on the ultimate output terminals of the circuit being simulated. When a simulation of the response to a test vector is started, event messages propagate around the pipeline until the circuit being simulated reaches a stable state. At that point in the simulation, all the queues in signal scheduler 101 will be empty and the effect on the circuit being simulated of such test vector as recorded by output logger 102 can be returned to host processor 120. 
     Event messages destined for logic gates are steered by fault removal/memory detection processor 105 to fault data processor 106. A link list of records is stored in the memory of processor 106 for each logic gate in the circuit being simulated. Each record contains the following fields: 
     
         fid, inputs, injection flag, pointer 
    
     where &#34;fid&#34; is a fault identification number identifying the particular fault to which such record pertains, &#34;inputs&#34; stores the states of the signals of the input terminal pins on the logic gate, &#34;injection flag&#34; is a flag that is set when the fault is injected at that particular circuit element and &#34;pointer&#34; is a pointer to the next record, if any, in the link list. Separate records are maintained in the link list for the good circuit and for each faulty circuit at which a fault becomes &#34;visible&#34; at that gate. The fault identification number for the record associated with the good circuit is set at a predetermined value, such as zero. 
     A similar record is also maintained in processor 106 for the primitive elements making up each memory block, but with the &#34;pointer&#34; field containing a value out of the range of the pointers used for link lists so that such record can be identified as that of a memory block. 
     The fault in a faulty circuit is considered to be &#34;visible&#34; at a gate if the fault is injected in the inputs or output of that gate or if the input signals to the gate otherwise become different from the corresponding signals in the good circuit because of a fault located elsewhere in the circuit. As will be seen, the link list for each gate can expand and contract dynamically, in accordance with the invention, as the simulation proceeds for a given input vector and as the effects of the faults being simulated propagate through the circuit. Such expansion and contraction results from control messages termed &#34;diverge&#34; and &#34;converge&#34; messages, respectively. A &#34;diverge&#34; message is sent for a faulty circuit when an input or output state of a gate in the faulty circuit are different, or &#34;divergent&#34; from the corresponding state in the good circuit. A &#34;converge&#34; message is sent when such states are the same, or convergent. 
     Event messages relating to signals at inputs of memory blocks are steered by processor 105 to memory block control processor 108. Similar link lists are stored for memory blocks in processors 108, 109 and 110, as will be described below. 
     Faults are defined in terms of an input terminal or output terminal of a gate being stuck at &#34;0&#34; or stuck at &#34;1&#34;; for example, &#34;input number 2 to gate 36 is stuck at `1`,&#34; or &#34;the output of gate 17 is stuck at `0`.&#34; Each faulty circuit being simulated has a single fault, and, as will be described, a number of entries are made in the memories of certain of the processors in multicomputer 100 for each faulty circuit. All such entries for a given fault have the same fault identification number. 
     As described above, faults within memory blocks usually are not simulated; only the effect of external faults on the information stored in the memory block is taken into account. However, it may be necessary to simulate faults on the input or output terminals of such memory blocks. For this purpose, dummy gates can be inserted into the input and output leads where such faults are to be simulated and the faults are then associated with the dummy gates. This procedure enables records associated with such faults to be stored along with records associated with faults in logic gates and simplifies access to such records during simulation. 
     A list of the faults to be simulated is loaded in processor 105. Each entry in the list includes the fault identification number, the number of the gate having the fault, and whether the fault is an input fault or an output fault. Also, a record is created for such fault in the link list in processor 106 for the gate having the fault, and the injection bit in such record is set to indicate that the fault is present in that gate. A pointer table is created in processor 110 with an entry for each fault. Such table is used in storing differences in memory contents between good and faulty circuits. Finally, for input faults, the location and type of fault (stuck at &#34;1&#34; or stuck at &#34;0&#34;) is stored in processor 107 and for output faults the location and type of fault is stored in output faults processor 113. 
     As described above, the signals at the input and output terminals of the logic gates and memory blocks being simulated each have one of four values: &#34;0&#34;, &#34;1&#34;, &#34;unknown&#34; or &#34;unused&#34;. When information about a circuit is first loaded, the states of all such signals are typically initialized to the &#34;unknown&#34; state. 
     After the fault information and input vectors have been loaded as described above and simulation begins, signal scheduler 101 requests the first input vector by sending a message over a path (not shown) to processor 112. Processor 112 then transmits an initial series of event messages into the pipeline based on the first input vector stored in such processor. Each event message at this point consists of the following fields: 
     
         source gate, fid, cd flag, state, delay 
    
     where &#34;source gate&#34; is an identification of the gate that is the source of the event (in this case an input terminal of the circuit being simulated), &#34;fid&#34; is a fault identification number, &#34;cd flag&#34; is a four-state control flag, &#34;state&#34; is the state of the output signal at such source, and &#34;delay&#34; is relevant delay information for such signal. In these messages., the fault identification number will be set to identify the good circuit (&#34;zero&#34; is typically used for this purpose) and the delay information will indicate no delay. The cd flag, which will be explained in more detail below, relates to faulty circuits and is not used for the good circuit. 
     Since these initial event messages are all identified as being for the good circuit, such messages will be repeated by output faults processor 113 to signal scheduler 101 without change. Signal scheduler 113 stacks the messages in an event queue that corresponds to no delay, then sequentially transmits the messages from such queue to output logger 102. The event messages at this point are similar to those received by signal scheduler 101, but with the &#34;delay&#34; field deleted. Output logger 102 passes the messages on to fanout pointers processor 103 without change. To each event message passing through, processor 103 appends a pointer giving the address in processor 104 of the fanout list associated with the source of the event. In the case of the initial messages, such sources will be the input terminals of the circuit being simulated and the fanout lists will define the connections between such input terminals and particular circuit elements in the circuit. Accordingly, the messages between processors 103 and 104 have the form: 
     
         source gate, fid, cd flag, state, pointer 
    
     Upon receipt of an event message from processor 103, processor 104 makes a copy of the message, without the pointer field, for each input terminal specified in the fanout list identified by the pointer and adds to each message the number of the input pin and its associated fanout gate. Each such message has the form: 
     
         source gate, fanout gate, pin#, fid, cd flag, state 
    
     where &#34;fanout gate&#34; identifies the fanout gate and &#34;pin#&#34; identifies the appropriate input pin on the fanout gate. 
     At this point in the simulation, the only relevant function of fault removal/memory detection processor 105 is to steer event messages relating to logic gate inputs to fault data processor 106 and messages relating to memory block inputs to memory block control processor 108. For this purpose, processor 105 contains a table indicating whether &#34;fanout gate&#34; is a logic gate or a primitive element associated with a memory block. 
     FIG. 2 is a flow chart showing the operation of fault data processor 106, in accordance with the invention, on receipt of an event message for the good circuit from processor 105. Referring to FIG. 2, the fault identification number in the message is checked to determine whether it refers to the good circuit (block 201). Next, the &#34;inputs&#34; field of the &#34;good circuit&#34; record in the link-list for the logic gate identified in the &#34;fanout element&#34; field is updated to reflect the information in the &#34;state&#34; and &#34;pin#&#34; fields in the event message (block 202). Then, an event message containing the following fields is sent to processor 107 (block 203): 
     
         fanout gate, previous inputs, current inputs, fid, cd flag 
    
     where, &#34;previous inputs&#34; contains the states of the inputs of &#34;fanout gate&#34; before the update, &#34;current inputs&#34; contains such states after the update, &#34;fid&#34; is zero because the message pertains to the good circuit and &#34;cd flag&#34; is irrelevant, again because the message pertains to the good circuit. 
     The effect of the event message with respect to all the faults then visible at the gate identified in &#34;fanout gate&#34; is next taken into account. As mentioned above, a fault is &#34;visible&#34; at a circuit element if the fault exists at such element or if the fault changes the state of any input or output of the element with respect to the corresponding point in the good circuit as a result of its existence at another element. A visible fault at a circuit element results in a record for that fault in the link list for such circuit element. For a fault on one of the terminals of such element, such fault record is created at the time the faults being simulated are entered into the system, as described above. For a fault elsewhere in the circuit, such fault record is created when the fault becomes visible during simulation. Accordingly, if such fault records exist, then each must be processed to determine the effect of the current message with respect to such fault (block 204). 
     For each such fault record, a determination is made whether the same fault is visible at the source gate (block 211). This is done by noting the fault identification number from such record and searching the link list for the source gate to determine if the same fault identification number is present. If not, then the &#34;inputs&#34; field of such fault record is updated in accordance with the current message (block 212). If the same fault exists at the source gate, then no update is performed because such fault record will be updated by messages specifically relating to such fault. 
     The &#34;injection flag&#34; field in the fault record is then tested to determine whether the fault in question exists on one of the terminals of the current logic gate (block 213). If so, then a &#34;diverge&#34; message is sent (block 215) which, as will be seen, causes additional fault records to be added to the link lists for circuit elements where a fault becomes visible during simulation. If not, the &#34;inputs&#34; fields in the fault record and the record for the good circuit are compared (block 214) to determine whether the input states are different for the two cases. If the states are different, then the fault is visible and a &#34;diverge&#34; message is sent (block 215). If the states are the same, then the fault is no longer visible at the current gate, the fault record is removed from the link list (block 216) and a &#34;converge&#34; message is sent (block 217). As will also be seen, a &#34;converge&#34; message causes fault records to be removed from link lists for other circuit elements where the fault was visible at an earlier stage in the simulation. 
     &#34;Diverge&#34; and &#34;converge&#34; messages are identified as such by the cd flag, which is relevant only in messages relating to faults. Such flag has four possible states: &#34;diverge&#34;, &#34;converge&#34;, &#34;update&#34; and &#34;detected&#34;. Messages using the &#34;update&#34; and &#34;detected&#34; states will be described below. &#34;Diverge&#34; and &#34;converge&#34; messages from processor 106 each have the following format: 
     
         fanout gate, previous inputs, current inputs, fid, cd flag 
    
     which is the same format as the event message sent for the good circuit (block 203), but with the &#34;fid&#34; field identifying a faulty circuit and &#34;cd flag&#34; identifying the kind of message being sent. &#34;Diverge&#34; and &#34;converge&#34; messages do not update states, but serve only to add or delete records relating to faults from the link lists. 
     In addition to the messages sent to processor 107, processor 106 also sends &#34;diverge&#34; and &#34;converge&#34; messages to interface processor 114. These messages are used to update fanin flags associated with input lines to memory blocks being simulated in processors 108 and 109. The operation of processor 114 and such flags will be described below. 
     Input faults/function evaluation processor 107 converts messages received from processor 106 to the following form: 
     
         source gate, previous state, current state, fid, cd flag 
    
     where &#34;source gate&#34; is the same gate identified in the &#34;fanout gate&#34; field in the received message. Such conversion is accomplished by modifying the values in the &#34;previous inputs&#34; and &#34;current inputs&#34; fields in accordance with any input fault stored in processor 106 for the logic gate specified in the &#34;source gate&#34; field and then evaluating the output :from such gate in accordance with the gate type, which is also stored in processor 107. 
     The operation of event detector 111 upon receipt of a message is outlined in the flow chart shown in FIG. 3. If the message is for the good circuit (block 301), and the value of &#34;current state&#34; is not equal to the value of &#34;previous state&#34; (block 302), then an event has occurred and an event message for the good circuit is sent (block 303). Such message will have the form: 
     
         source gate, fid, cd flag, current state 
    
     If the value of &#34;current state&#34; is equal to the value of &#34;previous state&#34;, then no event has occurred and no event message is sent. 
     If the received message is for a faulty circuit, then &#34;cd flag&#34; is tested to determine the kind of message (block 305) and if the message is an &#34;update&#34; message and an event has occurred (block 306) an &#34;update&#34; message is sent (block 307). This has the same format as the message for the good circuit, except that &#34;fid&#34; contains the faulty circuit identification number and &#34;cd flag&#34; is set to &#34;update&#34;. No message is sent if an event has not occurred. If the message is not an &#34;update&#34; message, then the received message is simply forwarded (block 308). An &#34;update&#34; message simply update the states of the circuit elements in a faulty circuit. 
     Processor 112 adds a &#34;delay&#34; field to each event message. Such field contains relevant delay information that will be used by signal scheduler 101 to assign the message to the appropriate event queue. Output faults processor 113 modifies the &#34;current state&#34; field to correspond to the &#34;stuck at&#34; state for any circuit element having an output fault. As described above, information about such output faults is stored initially in processor 113. 
     Signal scheduler 101 is now receiving event messages that have been initiated and/or modified at various points in the pipeline. Messages for the good circuit and &#34;update&#34; messages for faulty circuits will have &#34;expired&#34; in event detector 111 if they did not cause an output terminal of a circuit element to change state. As before, signal scheduler 101 assigns each message to an event queue in accordance with the information in the &#34;delay&#34; field and continues to send messages along the pipeline in the appropriate sequence. 
     FIG. 4 is a flow chart showing the operation of fault data processor 106 for messages received relating to faulty circuits. Recall that the operation of processor 106 described in conjunction with FIG. 2 was for messages received relating to the good circuit, even though such messages sometimes caused processor 106 to send messages relating to faulty circuits. Recall also that the input messages to processor 106 have the format: 
     
         source gate, fanout gate, pin#, fid, cd flag, state 
    
     A determination is made whether there is a record in the link list for the gate identified in &#34;fanout gate&#34; for the fault identified in &#34;fid&#34; (block 401). If so, the &#34;cd flag&#34; is tested to determine whether it is set at &#34;detected&#34; (block 402). As will be seen, such flag is set to such state after the effects of a test vector have been completely simulated if such vector has detected the fault identified in &#34;fid&#34;. If that is the case, the record is removed from the link list (block 403) and a &#34;detected&#34; message is sent (block 404) having the format: 
     
         fanout gate, previous inputs, current inputs, fid, cd flag 
    
     and wherein &#34;cd flag&#34; is set at &#34;detected&#34;. 
     If the fault identified in &#34;fid&#34; is not in the link list, then such fault is a new fault for the gate identified in &#34;fanout gate.&#34; If the &#34;detected&#34; flag is set, the message is ignored (block 409). Otherwise, a determination must be made whether such fault is visible at such gate. This is accomplished by comparing the value of the &#34;state&#34; field in the received message with the current value for the appropriate pin of the &#34;input&#34; field of the link list record for the good circuit (block 410). If the values are the same, then the fault has not caused a change in the inputs of such gate and the fault is not visible at the gate. In such case, no record is added to the link list for such fault. However, if the values are different, then the fault is visible and a new record for the fault is added to the link list (block 411). In such new record, the &#34;injection flag&#34; is cleared because the fault is not local but exists elsewhere in the circuit. The value of the &#34;inputs&#34; field of such new record is set to be the same as the corresponding record for the good circuit with the value for one pin modified in accordance with the contents of the &#34;pin#&#34; and &#34;state&#34; fields in the received message. Finally, processor 106 sends a &#34;diverge&#34; message to processor 107 (block 412). 
     The remaining branch in FIG. 4 deals with situations where the received message relates to a fault already listed in the link list and with &#34;cd flag&#34; set at other than &#34;detected&#34; (block 402). First, the record is updated with the data in the &#34;pin#&#34; and &#34;state&#34; fields of the received message (block 419). Next, the &#34;injection flag&#34; field in the link list record is checked to determine whether the fault is injected at the current gate (block 420). If not, the contents of &#34;inputs&#34; in the link list records for the good circuit and the faulty circuits are compared (block 421). If such contents are the same, then the fault is no longer visible at the current gate, the fault record is removed from the link list (block 422) and a &#34;converge&#34; message is sent through the pipeline to cause removal of records for such fault from other link lists (block 423). If &#34;injection flag&#34; is set, or if the &#34;inputs&#34; fields are different, then an &#34;update&#34; message is sent to update other records for such fault (block 424). 
     During the simulation, output logger 102 keeps a separate record of the states of the output terminals of the circuit being simulated for the good circuit and for each faulty circuit. Simulation for a given test vector is complete when all messages have &#34;expired&#34; and there are no further messages to be processed in the event queues of signal scheduler 101. At this point, signal scheduler 101 sends a message to output logger 102 to compare the output states logged for each fault with the outputs logged for the .good circuit. If the outputs differ, the vector has detected the fault, and output logger 102 sends a &#34;detected&#34; message having the form: 
     
         fid, cd flag 
    
     (with &#34;cd flag&#34; set at &#34;detected&#34;) to processor 105, which then obtains the location (gate and pin numbers) of the fault from its fault records and appends such location to the message and forwards the message to processor 106 in the form: 
     
         fid, cd flag, location 
    
     and removes the fault from its own list of fault records. Receipt of such message by processor 106 causes the link list record for such fault associated with the gate where the fault is injected to be removed and additional &#34;detection&#34; messages to be propagated around the pipeline. (See blocks 403,404 and 405 in FIG. 4.) Such additional messages cause the removal of fault records for input faults from processor 107, records for output faults from processor 113, and fault records for other gates and memory blocks from link lists in processors 106, 108, 109 and 110. Accordingly, when subsequent vectors are simulated, only undetected faults are considered, thereby reducing simulation time considerably. 
     In FIG. 2, which diagrams the operation of processor 106 when an event message relating to the good circuit is received, the branch indicated by path 220 is taken for each fault that is visible at the current gate. For faults that also exist at the source, path 221 is taken and the procedure indicated by blocks 213-217 is carded out, resulting in the sending of a &#34;diverge&#34; message or a &#34;converge&#34; message. However, because the fault exists at the source, a message relating to such fault will also be sent by the source, which will also result in the sending of an &#34;update&#34;, &#34;diverge&#34; or &#34;converge&#34; message in accordance with the procedure diagrammed in FIG. 4. Thus, it appears that the control messages sent as a result of following path 221 in FIG. 2 are redundant and need not be sent. However, we have found that a simulation run takes more time overall when such messages are not sent, so path 221 is included in our preferred embodiment of the invention. 
     Referring again to FIG. 1, the operation of processors 108, 109 and 110 in the simulation of memory blocks will now be described in detail. Such processors collectively simulate the operation of memory blocks for both good and faulty circuits. The characteristics of the various memory blocks in the circuit being simulated, such as the number of words, number of bits in each word and control-line characteristics, are loaded initially in processors 108 and 109. 
     As is well-known, memory blocks have input terminals for control lines (such as &#34;read,&#34; &#34;write&#34; and &#34;chip select&#34;), address lines and data lines and output terminals for data lines. Accordingly, event messages sent from processor 105 to memory block control processor 108 can relate to any of the control, address and data input terminals of a given memory block and event messages sent from processor 110 to 111 can relate to any of the data output terminals of such memory block. The simulation of a memory &#34;read&#34; or &#34;write&#34; operation typically involves receipt of a number of event messages by processor 108 to set up the address, data and control input lines to cause the operation to occur. 
     The current states of the address and control input lines for each memory block for both good and faulty circuits are stored in processor 108. Similarly, the current states of the address and data input lines are stored in processor 109. In the case of the good circuit, when processor 108 receives event messages that cause a &#34;write&#34; operation to be simulated for a memory block, the current states of the input data lines are written into storage in physical memory processor 110 at an address specified by the current states of the address lines. Similarly, when a &#34;read&#34; operation is simulated, the contents of an address in such storage specified by the current states of the address lines are read into a buffer in processor 110, which processor then sends event messages reflecting the current and previous states of each data output line to event detector 111, as will be described below. 
     During simulation of a circuit, the states of the input and output fines of the memory blocks in the good and faulty circuits are recorded in link lists stored in processors 108, 109 and 110. Such link lists are organized similarly to the link lists for logic gates in fault data processor 106, but with the records having fields and control flags appropriate for memory block simulation. A record for a given fault is stored in the link lists for a memory block if such fault is visible at such memory block, as discussed above for logic gates. The link lists in processors 108, 109 and 110 are coordinated so that if a record is added to or deleted from a particular link list in processor 108, a corresponding record is also added to or deleted from the corresponding link list in both processors 109 and 110. The fault records for a particular fault are not removed if the fault remains visible in any of processors 108, 109 or 110. Various flags used in conjunction with fault removal in such processors will be described below. 
     Each good-circuit record in the link list in memory block control processor 108 includes the following fields: 
     
         block#, read, write, chip select, et/ls, #addr, fid, pointer, address 
    
     where &#34;block#&#34; identifies the memory block, &#34;read,&#34; &#34;write,&#34; and &#34;chip-select&#34; contain the current states of the control lines for the memory block, &#34;et/ls&#34; indicates whether memory access is level sensitive, leading edge triggered or trailing edge triggered, &#34;#addr&#34; is the number of address bits, &#34;fid&#34; is the fault identification number, &#34;pointer&#34; contains the address of the next record in the link list and &#34;address&#34; contains the states of the address lines 
     Each faulty-circuit record in the link list in processor 108 contains the following fields in addition to those described in the previous paragraph: 
     
         removal flag, control fanin flags, address fanin flags 
    
     The &#34;removal flag&#34; field contains a flag used in determining whether the faulty record should be removed from the link list. The &#34;control fanin flags&#34; and &#34;address fanin flags&#34; fields contain flags associated with the control lines and address lines respectively. Each such flag indicates whether the fault to which the record relates is visible at the source gate driving the line. 
     Each good-circuit record in the memory block descriptor processor 109 contains the following fields: 
     
         block#, address, offset, #data, data, fid, pointer 
    
     where &#34;block#&#34; identifies the memory block, &#34;address&#34; contains the current states of the address fines, &#34;offset&#34; contains an offset value used in calculating the actual address of a word in physical memory processor 110, &#34;#data&#34; contains the number of data lines in the memory block, &#34;data&#34; contains the current states of the data lines, &#34;fid&#34; contains the fault identification number and &#34;pointer&#34; contains the address of the next record in the link list. 
     Each faulty-circuit record in processor 109 contains the following field in addition to those described in the previous paragraph: 
     
         data fanin flags 
    
     This field contains flags associated with each data line that indicate whether the fault to which the record relates is visible at the source of the line. 
     Each good-circuit record in physical memory processor 110 contains memory fields representing the actual storage elements of the memory block being simulated and an output buffer field in which the states of the data output fines from the last &#34;read&#34; operation are stored. The actual address locations for read and write operations in processor 110 for the good circuit are calculated in processor 109 from the &#34;address&#34; and &#34;offset&#34; fields in the relevant link list record in processor 109. However, in contrast to faulty circuit records in other processors, the faulty circuit records in processor 110 contain only memory words that are different from the corresponding words stored for the good circuit. Such different words are stored in a difference list, which is a link list of address-word pairs for each memory block. If a faulty circuit &#34;write&#34; is to be performed and the faulty-circuit word to be written is different from the word at the same address in the good circuit, then the word for the faulty circuit is stored in such link list. The link list is accessed through a pointer table which, for each faulty circuit, includes a pointer indicating the first entry in the link list. If there are no differences to be stored for a particular faulty circuit, then the pointer for such circuit: will have a &#34;null&#34; value. Thus, if the pointer for a particular faulty circuit is &#34;null,&#34; the contents of the entire memory block for that faulty circuit can be considered to be the same as the contents for the good circuit. 
     Processor 110 also includes a link list for each memory block with a record for the good circuit and a record for each fault visible at the memory block. Such record contains the fault identification number for the associated fault and a &#34;last rread&#34; field in which the states of the data output lines from the last &#34;read&#34; operation for the relevant circuit are stored. 
     As described above, memory blocks are represented by primitive elements having four input terminals and one output terminal. Event messages directed to memory block control processor 108 have the same form as those directed to fault data processor 106, that is: 
     
         source gate, fanout gate, pin#, fid, cd flag, state 
    
     where the contents of &#34;source-gate&#34; identify the gate whose output state change gave rise to the event message and &#34;fanout-gate&#34; and &#34;pin#&#34; identify the particular input terminal (control fine, address fine, or data input line) of the memory block to which the message relates. Similarly, event messages sent by physical memory processor 110 have the same form as those sent by processor 107, that is: 
     
         source gate, previous state, current state, fid, cd flag 
    
     where the contents of &#34;source gate&#34; here identify the particular output terminal (data output fine) of the memory block to which the message relates. Again, event messages relating to the good circuit and the various faulty circuits will be identified by the contents of the &#34;fid&#34; field and the types of event messages relating to faulty circuits will be identified by the contents of &#34;cd flag.&#34; 
     When processor 108 receives an event message relating to the control or address lines of a memory block for either the good circuit or a faulty circuit, processor 108 updates the state of the particular line in the appropriate record of its link lists. Since the states of data lines are stored only in the link list records in processor 109, if processor 108 receives an event message relating to a data line, such processor sends a message to processor 109 to update the state of the particular data line. 
     After updating the link list records, processor 108 determines whether a read or write operation should be initiated. This decision is based on whether the memory block being simulated is level-sensitive, leading-edge triggered or trailing-edge triggered, as indicated in the &#34;et/ls&#34; field stored for such memory block in processor 108 and the particular change of state, if any, of a control, address or data line as a result of the event message. In level-sensitive mode, a memory read or write is performed whenever there is a change on the address, data, read or write lines as long as the chip-select line is true. In edge-triggered mode, a memory read or write is performed only on the specified leading or trailing edge of the chip select line. If a read or write operation is to occur, processor 108 sends an appropriate control message to processor 109, which calculates the read/write address from the contents of the &#34;address&#34; and &#34;offset&#34; fields in the appropriate link list record for the good or faulty circuit involved. 
     FIG. 5 is a flow chart showing the operation of memory block control processor 108 in response to receipt of an event message for the good circuit. If a received message is for the good circuit (block 501) and pertains to a control or address input line (block 502), the link list record for the good circuit is updated (block 503) and an event message for the good circuit is prepared and sent to processor 109 (block 504). Messages sent from processor 108 to processor 109 have the format: 
     
         fid, event type, cd flag, msg type, msg value 
    
     The &#34;event type&#34; and &#34;msg type&#34; flags and the &#34;msg value&#34; field are used in messages from processor 108 to processor 109 and from processor 109 to processor 110. The &#34;event type&#34; flag is used in conjunction with &#34;converge&#34; messages and indicates &#34;good&#34; if the message being sent results from a message received at processor 108 for the good circuit and &#34;faulty&#34; if the message being sent results from a message received for a faulty circuit. The &#34;msg type&#34; flag indicates which of several types of message is being sent. For messages from processor 108 to processor 109, such types are &#34;address&#34;, &#34;dam &#34;, &#34;read&#34;, &#34;write&#34;, &#34;assert&#34;, &#34;create&#34;, &#34;detected&#34; and &#34;removal.&#34; The information in the &#34;msg value&#34; field depends on the type of message being sent. 
     Except for &#34;create&#34;, &#34;detected&#34; and &#34;removal&#34; messages, processor 108 determines the type of message to be sent from the kind of input line (control, address or data) to which the received message pertains and the type of memory being simulated as indicated by the contents of the &#34;et/ls&#34; field in the link list record. Processor 108 can determine the kind of line for a particular memory block from the contents of the &#34;fanout-gate&#34; and &#34;pin#&#34; fields and information relating to such memory block stored in processor 108 when the simulation is initialized. &#34;Assert&#34;, &#34;create&#34;, &#34;detected&#34; and &#34;removal&#34; messages pertain only to faulty circuits, and will be described in more detail below. Messages for the good circuit prepared and sent as indicated by block 504 are limited to &#34;address&#34;, &#34;data&#34;, &#34;read&#34; and &#34;write&#34; messages. 
     As described above, a &#34;read&#34; or &#34;write&#34; operation can be initiated in a number of ways, depending on the type of memory being simulated. For example, in a level-sensitive memory, if the chip select and read lines are true, then a &#34;read&#34; operation will be initiated by a state change of any of the address or data lines. Thus, in such a case, receipt of an event message for a data or address line will cause two messages to be sent by processor 108: a first message including the new value of the address or data line and a second message to initiate the &#34;read&#34; operation. 
     After the event message or messages for the good circuit are sent, and if the message pertains to an event on a control or address line (block 505), processor 108 determines whether there are additional faulty-circuit records in its link list (block 506). If so, the next fault record is fetched (block 507) and the &#34;fanin flag&#34; for the input line to which the message pertains is tested (block 508). If the &#34;fanin flag&#34; is not set, indicating that the fault associated with the faulty circuit is not visible at the gate that initiated the event message, the fault record is updated in accordance with the event message (block 509). If the &#34;fanin-flag&#34; is set, no further action is taken for the current fault record and the next fault record is fetched. 
     Following the update of the fault record, the states of all the control and address lines in the fault record are compared with the corresponding states in the record for the good circuit (block 510). If all such states are identical, then the fault is not visible on the control and address lines and a &#34;good converge&#34; message is prepared and sent to processor 109 (block 511). In such message, &#34;cd flag&#34; is set at &#34;converge&#34; and, because the message being sent results from a message for the good circuit, &#34;event type&#34; is set at &#34;good&#34;. However, if the state of any of the input lines is different, the fault is visible and a &#34;diverge&#34; message is prepared and sent to processor 109 wherein &#34;cd flag&#34; is set at &#34;diverge&#34; and &#34;event type&#34; is not used (block 512). Finally, if a &#34;diverge&#34; message is sent, &#34;removal Jag&#34; is reset (block 513) because the fault is visible and the fault record must remain. As will be seen this flag, when set, permits removal of the fault record. However, if a &#34;converge&#34; message is sent for a control or address line (block 514), the removal flag is set. The removal flag cannot be set for a data line because the convergence/divergence determination for data lines is made by processor 109. The above described process is repeated for each additional fault record. 
     The type of message or messages sent by processor 108 for a faulty circuit pursuant to blocks 511 and 512 depends on the event message received by processor 108 for the good circuit. Again, two messages can be sent if a change in state of an address or data line causes a &#34;mad&#34; or &#34;write&#34; operation. 
     In the usual situation, the particular fault in a faulty circuit is allowed to affect the operation of the memory block in the faulty circuit. For example, if the fault is in circuitry leading to a data line, incorrect data might by written; or if the fault is in circuitry leading to an address line, data might be written into or read from a wrong address. However, if an event message results in a &#34;read&#34; operation in the good circuit but the particular fault in the faulty circuit prevents a corresponding &#34;read&#34; operation in the faulty circuit, then such a &#34;mad&#34; operation must be forced or &#34;asserted&#34; so that event messages will be generated by processor 110 for the faulty circuit. In this situation, an &#34;assert&#34; message is sent pursuant to block 512. As will be seen, upon receipt of an &#34;assert&#34; message, processor 110 does not perform a read operation but uses the last-read value to prepare its event messages. 
     FIG. 6 is a flow chart of the operation of processor 108 upon receipt of an event message for a faulty circuit already visible at the relevant memory block. If a record for the fault exists in the link list (block 601), the type of message received determines the action to be taken (block 602). If it is a &#34;detected&#34; message (indicated by &#34;cd flag&#34; being set at &#34;detected&#34;), then the fault message is removed (block 603) and a &#34;detected&#34; message is sent to processor 109 (block 604). If it is a &#34;data&#34; message, no update is necessary in the link lists for processor 108 because such data is stored in processor 109. Accordingly, an &#34;update&#34; message is sent to processor 109 (block 608) and &#34;removal flag&#34; is reset (block 609). If the message is a &#34;control&#34; or &#34;address&#34; message, the appropriate fault record (identified by &#34;fid&#34;) is updated (block 610) and &#34;cd flag&#34; is tested to determine whether to set or reset the &#34;fanin flag&#34; associated with the input line to which the message pertains (block 611). If &#34;cd flag&#34; is set at &#34;diverge&#34; or &#34;update &#34;, indicating that the current fault is visible at the source of the message, then &#34;fanin flag&#34; is set for such line (block 612), otherwise it is reset (block 613). 
     The inputs are then compared with those of the good circuit in a similar manner to that described in conjunction with block 510 in FIG. 5. If any input is different, an &#34;update&#34; message is sent to processor 109 (block 615) and &#34;removal flag&#34; is reset (block 616); if all the inputs are the same, indicating that the fault is no longer visible on those lines, then a &#34;faulty/converge&#34; message is sent (block 617) and &#34;removal flag&#34; is set (block 618), indicating that the fault record can be removed if the fault is not found visible by processors 109 and 110. Again, an &#34;address&#34; or &#34;data&#34; message sent pursuant to blocks 607, 615 or 617 can be followed by a &#34;read&#34; or &#34;write&#34; message if processor 108 determines that a &#34;read&#34; or &#34;write&#34; operation is to take place. 
     &#34;Removal&#34; messages are received by processor 108 from processor 110 when, as will be seen, processor 110 determines that fault records for a particular fault can be removed. If &#34;removal flag&#34; is set in the record for such fault (block 605), indicating that no intervening &#34;data&#34; message or message with &#34;cd flag&#34; set for &#34;diverge&#34; or &#34;update&#34; has been sent for the fault since the message giving rise to the &#34;removal&#34; message was sent by processor 108, then such fault record is removed (block 606) and a &#34;removal&#34; message sent to processor 109 (block 607). If &#34;removal flag&#34; is reset, the record is not removed and no message is sent. 
     FIG. 7 is a flow chart showing the operation of processor 108 upon receipt of a faulty-circuit message for a new fault that is not presently visible at the relevant memory block. First, the type of message is determined (block 701). If the message is a &#34;detected&#34; message, no further action is taken. This situation is analogous to that described for block 409 in FIG. 4. If the message is a &#34;data&#34; message, a new fault record is created (block 702); however, this record will simply be a copy of the good-circuit record because processor 108 stores only information relating to the &#34;control&#34; and &#34;address&#34; lines, not the &#34;data&#34; lines. Then a creation message is sent to processor 109 (block 703) which causes fault records to be created for the fault in processors 109 and 110, followed by a &#34;faulty/converge&#34; message (block 704). Because processor 108 is unable to determine from a &#34;data&#34; message whether the fault is still visible, it resets &#34;removal flag&#34; for the fault (block 705). 
     If the message is a &#34;control&#34; or &#34;address&#34; message, then all the control and address inputs are compared with their counterparts for the good circuit (block 707) in a manner similar to that described for block 614 in FIG. 6. If the inputs for the faulty and good circuits are the same, then no further action is taken. Otherwise, a new fault record is created by copying the record for the good circuit and modifying it in accordance with the just-received message for the faulty circuit (block 708). Then a creation message is sent to processor 109 (block 709) to cause corresponding fault records to be created in processors 109 and 110 and the fanin flag is set for the particular control or address line to which the message relates (block 710). This records that the fault is visible at the source of the message. Finally, a &#34;faulty/diverge&#34; message is sent to processor 109 (block 711) indicating that the fault is visible in processor 108, and &#34;removal flag&#34; is reset (block 705). Again, a &#34;read&#34; or &#34;write&#34; message can be sent following an &#34;address&#34; or &#34;data&#34; message if the memory block being simulated is level-sensitive. 
     FIG. 8 is a flow chart of the operation of memory block descriptors processor 109 in response to receipt of an event message for the good circuit. If a received message is for the good circuit (block 801) and pertains to a data input line (block 802), the link list record for the good circuit is updated (block 803). Then processor 109 determines whether there are additional faulty-circuit records in its link list (block 804). If so, the next fault record is fetched (block 805) and the &#34;fanin-flag&#34; for the data line to which the message pertains is tested (block 806). If such flag is reset indicating that the fault associated with the faulty circuit is not visible at the gate that initiated the event message, the fault record is updated in accordance with the event message (block 807). If such flag is set, no further action is taken for the current fault record and the next fault record is fetched. 
     If the received message pertains to an address input line, the link list record for the good circuit is updated (block 812). If the received message is a &#34;read&#34; or &#34;write&#34; message, then processor 109 calculates the read or write address from the information in the &#34;address&#34; and &#34;offset&#34; fields in such link list record (block 813) and sends a &#34;read&#34; or &#34;write&#34; message to processor 110 (block 814). In the case of a &#34;write&#34; message, the actual data to be written is obtained from the &#34;data&#34; field in the link fist: record and included in such message. 
     FIG. 9 is a flow chart of the operation of processor 109 after receiving an event message for a faulty circuit. The type of message is first determined (block 901). If the message is a &#34;creation&#34; message, then a fault record is created for the particular fault identified in the &#34;fid&#34; field in the message (block 902) and a &#34;creation&#34; message is sent on to processor 110 (block 903). If the message is a &#34;detected&#34; or &#34;removal&#34; message the appropriate action is carded out (blocks 904 and 906) and a corresponding message is forwarded to processor 110 (blocks 905 and 907). In the case of an &#34;address&#34; message, the fault record is updated (block 910). For a &#34;data&#34; message in which &#34;cd flag&#34; is set at &#34;update&#34; or &#34;diverge&#34; (block 911), the &#34;data fanin flag&#34; for the data line to which the message pertains is set (block 912) and the &#34;data&#34; field in the fault record is updated (block 913); for such messages in which &#34;cd flag&#34; is set at &#34;converge&#34;, the &#34;data fanin flag&#34; for the relevant data line is reset before the &#34;data&#34; field is updated (block 914). 
     In the case of a &#34;read&#34;, &#34;write&#34;, or &#34;assert&#34; message, the address is calculated (block 916) as described for block 813 in FIG. 8 and a corresponding control message is sent to processor 110 (block 918), including information from the &#34;data&#34; field of the fault record in the case of a &#34;write&#34; message. However, if &#34;cd flag&#34; in the message received by processor 109 is set at &#34;converge,&#34; the states of the &#34;data&#34; fines in the fault record are compared with the corresponding states in the record for the good circuit and &#34;cd flag&#34; in the message to processor 110 is updated if needed (block 917). If all such data-line states are identical, then the fault is not visible on the data lines and &#34;cd flag&#34; is not updated. However, if any such state is different, then the fault is visible, and &#34;,cd flag&#34; is set at &#34;diverge&#34; when &#34;event type&#34; in the message from processor 108 is set at &#34;good&#34; (indicating that such message stems from an event message for the good circuit) or at &#34;update&#34; if &#34;event type&#34; in the message from processor 108 is set at &#34;faulty&#34; (indicating that such message stems from an event message for the faulty circuit). 
     As described above, the fanin flags for the various address, data and control lines for a memory block are set and reset in accordance with the state of &#34;cd flag&#34; in event messages for faulty circuits. However, it is important that fault records be in place and that the fanin flags in such records be in the correct states whenever an event message for the good circuit is received at processor 108 (in the case of the fanin flags for address and control lines) or processor 109 (in the case of the fanin flags for the data lines). Good-circuit event messages may arrive at processors 108 and 109 before faulty-circuit messages that would cause such fault records to be created and/or the fanin flags to be set or reset. To overcome this problem, interface processor 114 shown in FIG. 1 generates special fanin-flag messages in response to event messages from fault data processor 106. 
     As shown in blocks 215 and 217 of FIG. 2, processor 106, in response to an event message for the good circuit, sends either a &#34;diverge&#34; or &#34;converge&#34; message to processor 114 for each fault in its fault list. Such messages have the following format: 
     
         fanout-gate, fid, cd-flag 
    
     Processor 114 stores pointers and fanout lists for each logic gate similar to those stored in processors 103 and 104, but listing only fanouts that are address, data, or control lines on memory blocks. On receipt of an event message from processor 106, processor 114 sends a fanin flag message to processor 108 of the form: 
     
         fid, cd-flag 
    
     for each entry in the relevant fanout list. For each such fanin flag message containing an &#34;fid&#34; for which a fault record has not yet been created, processor 108 creates such record and sends a &#34;creation&#34; message to processor 109, as in blocks 708 and 709 in FIG. 7. If the fanin flag message pertains to an address or control line, processor 108 then sets or resets the relevant &#34;address fanin flag&#34; or &#34;data fanin flag&#34; in accordance with the state of &#34;cd flag&#34; in the message, as in blocks 611,612 and 613 in FIG. 6. If the fanin flag message pertains to a data line, processor 108 forwards the message to processor 109, which sets or resets the relevant &#34;data fanin flag&#34; in accordance with &#34;cd flag,&#34; as in blocks 911, 912 and 914 in FIG. 9. 
     FIG. 10 is a flow chart showing the operation of physical memory processor 110. Upon receiving a &#34;write&#34; message for the good circuit (blocks 1001 and 1002), in which the &#34;msg value&#34; field contains the relevant address and data, processor 110 first reads the value previously stored at such address in the simulated memory for the good circuit (block 1003) and compares such previous value with the new value in the &#34;write&#34; message (block 1004). If the values are not the same, then the new value is written at such address (block 1005). Then the difference list is updated as follows. For each fault record in the link list (block 1010), the fault identification number is used (block 1011) to access the difference list for such fault to determine whether there is a record in such difference list for such address (block 1012). If so, a comparison is made between the value in such record and the new value (block 1013), and if the values are the same, such record is removed from the difference list (block 1014). If there is no record for such address, then a record is created in the difference list using the previous value read for the good circuit in block 1003. 
     Upon receiving a &#34;read&#34; message for the good circuit, in which the &#34;msg value&#34; field contains the relevant address, processor 110 reads the value stored at such address (block 1020), updates the &#34;last read value&#34; record for the good circuit (block 1021), and sends a good event message for each data output line in the memory block being simulated. The &#34;current state&#34; field in each message will contain the value just read for the data output line identified in the &#34;source gate&#34; field of such message. 
     FIG. 11 is a flow chart showing the operation of processor 110 upon receipt of an event message for a faulty circuit. As can be seen from such figure, six types of messages: &#34;creation&#34;, &#34;detected&#34;, &#34;removal&#34;, &#34;write&#34;, &#34;read&#34; and &#34;assert&#34; can be received (block 1101). Upon receipt of a &#34;creation&#34; message, a fault record is created in the link list for the particular fault identified in the &#34;fid&#34; field in the message (block 1102). For &#34;detected&#34; and &#34;removal&#34; messages, the fault record for the identified fault is removed from the link list (blocks 1103 and 1105). In the case of a &#34;detected&#34; message, processor 110 sends a series of &#34;detected&#34; messages on to processor 111, one message for each data output line in the memory block being simulated. 
     Upon receipt of a &#34;write&#34; message for a faulty circuit, the new value to be written is compared with the value stored for the good circuit at the same address (block 1110). If the values are the same, then the difference list is checked to determine whether there is a record for such address (block 1111). If so, such record is removed (block 1112) because the values for that address are no longer different. Next, if &#34;cd flag&#34; in the message is set at &#34;converge&#34; (block 1113) and if the pointer for such faulty circuit in the pointer list is &#34;null,&#34; indicating that there are no other differences in the difference list for such fault (block 1114), a removal message is sent to processor 108, (block 1115) which will initiate removal of all fault records for such fault from processors 108, 109 and 110, depending on the state of the &#34;removal&#34; flag (blocks 605,606 and 607 in FIG. 6). If &#34;cd flag&#34; is not set at converge or there are still differences, no further action is taken. 
     If the comparison carried out pursuant to block 1110 shows that the new value for the faulty circuit is different from that of the good circuit, and there is a record in the difference list for the relevant address (block 1116), then the new value is written in such record (block 1117). Otherwise, a new record is created for such address using the new value (block 1118). 
     Upon receipt of a &#34;read&#34; message for a faulty circuit, if &#34;cd flag&#34; is set at &#34;converge&#34; (block 1120) and there are no differences stored for such fault (block 1121), then the records for such fault can be removed from processors 108, 109 and 110 and a &#34;removal&#34; :message is sent to processor 108 (block 1122). (Note, however, that removal of such fault record in processor 110 will not occur until subsequent receipt of a removal message from processor 109 and removal takes place in accordance with block 1105). In order to be able to send event messages to processor 111, the value from the &#34;last read&#34; field in the link list record for the good circuit is copied into the &#34;last read&#34; field for the faulty circuit (block 1123). Then &#34;cd flag&#34; is updated for such event messages if needed (block 1124). If &#34;cd flag&#34; in the message received by processor 110 is set at &#34;converge,&#34; but there are still differences stored for the faulty circuit, the fault is still visible and &#34;cd flag&#34; is set at &#34;diverge&#34; when &#34;event type&#34; in the received message is &#34;good&#34; or at &#34;update&#34; when &#34;event type&#34; in such message is &#34;faulty.&#34; Finally, an event message for each data output line is sent to processor 111 using the values from &#34;last read&#34; for the faulty circuit (block 1125). 
     If &#34;cd flag&#34; is set at &#34;update&#34; or &#34;diverge&#34; in the received message or differences still exist and if there is a record in the difference list for the relevant address (block 1126), then &#34;last read&#34; is updated from such record (block 1127). If there is no such record in the difference list, then &#34;last read&#34; for the faulty circuit is updated from &#34;last read&#34; for the good circuit (block 1123). 
     If the received message is an &#34;assert&#34; message, all that is necessary is to update &#34;cd flag&#34; (block 1124) and send the event messages (block 1125) in accordance with the values in &#34;last read&#34; for the faulty circuit. 
     As can be seen from the above description, many of the operations in processors 106, 108, 109 and 110 involve the searching of link lists to determine whether a record for a particular fault is present. In a preferred embodiment of the invention, such link lists are sorted by fault identification number and divided into four separate lists. Such arrangement speeds up the searching process for both good-circuit and faulty-circuit events. Other arrangements of such link lists can be used if desired. 
     In order to avoid bottlenecks in the pipeline shown in FIG. 1 and to speed up the simulation operation, it may be desirable to replicate processors having a large storage or processing burden. For example, in the preferred embodiment of the invention described above, two fault data processors 106 have been provided. Event messages for faulty circuits having odd fault identification numbers are directed to the first of such processors by processor 105; messages for faulty circuits having even fault identification numbers are directed to the second of such processors. The first processor maintains fault records for the odd-numbered faults and the second processor maintains fault records for the even-numbered faults. Messages for the good circuit are directed to both processors so that either processor can perform the necessary comparisons between the good circuit and any faulty circuit for which it stores the fault records. Both of such processors send event messages to processor 107 and fanout messages to processor 114. It will be clear that the other processors shown in FIG. 1 can be replicated in a similar manner as necessary. 
     It is understood that other embodiments are possible that incorporate the principles of our invention and that the above disclosure is merely illustrative of such principles and is not intended to be limiting in any respect.