| [11] | 1 | A simple arbitration circuit for VIS TTC | 
|---|
|  | 2 | Yuji Kukimoto | 
|---|
|  | 3 | kukimoto@eecs.berkeley.edu | 
|---|
|  | 4 |  | 
|---|
|  | 5 | STG: see figures.ps | 
|---|
|  | 6 | circuit structure: see figures.ps | 
|---|
|  | 7 |  | 
|---|
|  | 8 | Overall picture: | 
|---|
|  | 9 |  | 
|---|
|  | 10 | Three requesting modules (called clients) are competing to get a bus | 
|---|
|  | 11 | access. At any point, only one module is allowed to get a bus access. | 
|---|
|  | 12 | Each client has a controller attached to it, from which an | 
|---|
|  | 13 | acknowledgment is given.  All the controllers communicate with an | 
|---|
|  | 14 | arbiter so that at any time at most one controller gives an | 
|---|
|  | 15 | acknowledgment.  The arbiter is a simple three-state machine. It has | 
|---|
|  | 16 | a single output indicating which controller can be selected among the | 
|---|
|  | 17 | three at each time tick.  If the "active" input of the controller is | 
|---|
|  | 18 | 0, the output is X, meaning that no one is selected. | 
|---|
|  | 19 |  | 
|---|
|  | 20 | The protocol here is that a controller takes a control from the | 
|---|
|  | 21 | arbiter if it is selected by the arbiter and it has a request. | 
|---|
|  | 22 | Otherwise, the control is passed to the next controller.  A signal | 
|---|
|  | 23 | pass_ctrl is set to one iff the controller needs to pass a control to | 
|---|
|  | 24 | another controller. There are two cases: 1) when the controller is | 
|---|
|  | 25 | done processing a request, 2) when the controller has no request | 
|---|
|  | 26 | waiting, but is selected. In both cases, the variable is set to one in | 
|---|
|  | 27 | the next clock so that another controller waiting for an access can | 
|---|
|  | 28 | take a control. The "active" signal of the arbiter is set to one iff | 
|---|
|  | 29 | one of the pass_ctrl is set to one. | 
|---|
|  | 30 |  | 
|---|
|  | 31 | A client has to keep a request signal high until an acknowledgment is | 
|---|
|  | 32 | given. Even after an acknowledgment is returned from the | 
|---|
|  | 33 | corresponding controller, req can be high for a finite amount of time. | 
|---|
|  | 34 | This means that different requests take different time to complete. | 
|---|
|  | 35 | Fairness constraints arise here since we do not want to keep req high | 
|---|
|  | 36 | for infinite time. | 
|---|
|  | 37 |  | 
|---|
|  | 38 | I. CTL Model Checking | 
|---|
|  | 39 |  | 
|---|
|  | 40 | A. Property: | 
|---|
|  | 41 |  | 
|---|
|  | 42 | 1. mutual exclusion | 
|---|
|  | 43 | 2. AG(req->AF(ack)) | 
|---|
|  | 44 |  | 
|---|
|  | 45 | # safety: mutual exclusion | 
|---|
|  | 46 | AG ( !(ackA = 1 * ackB = 1 + ackB = 1 * ackC = 1 + ackC = 1 * ackA=1) ); | 
|---|
|  | 47 |  | 
|---|
|  | 48 | # liveness: | 
|---|
|  | 49 | AG( (reqA = 1) -> AF(ackA = 1) ); | 
|---|
|  | 50 | AG( (reqB = 1) -> AF(ackB = 1) ); | 
|---|
|  | 51 | AG( (reqC = 1) -> AF(ackC = 1) ); | 
|---|
|  | 52 |  | 
|---|
|  | 53 | B. Fairness: | 
|---|
|  | 54 |  | 
|---|
|  | 55 | !(clientA.state=HAVE_TOKEN); | 
|---|
|  | 56 | !(clientB.state=HAVE_TOKEN); | 
|---|
|  | 57 | !(clientC.state=HAVE_TOKEN); | 
|---|
|  | 58 |  | 
|---|
|  | 59 | C. Files: | 
|---|
|  | 60 |  | 
|---|
|  | 61 | arbiter.v: a fair arbiter. the liveness property passes under fairness | 
|---|
|  | 62 | constraints. arbiter_bug.v is another version of arbiter.v, where the state | 
|---|
|  | 63 | transition graph of the arbiter is slightly different. This is not a | 
|---|
|  | 64 | fair arbiter. | 
|---|
|  | 65 |  | 
|---|
|  | 66 | arbiter.fair: fairness constraints | 
|---|
|  | 67 |  | 
|---|
|  | 68 | arbiter.ctl: ctl files | 
|---|
|  | 69 |  | 
|---|
|  | 70 | II. Language emptiness check: | 
|---|
|  | 71 |  | 
|---|
|  | 72 | A. File: arbiter_le.v | 
|---|
|  | 73 |  | 
|---|
|  | 74 | An observer is added to check if the liveness property for clientA is | 
|---|
|  | 75 | satisfied. The observer is a non-deterministic machine which | 
|---|
|  | 76 | represents the complement of the liveness property.  Ending up in | 
|---|
|  | 77 | state BAD in the observer means that the behavior is bad. Thus, | 
|---|
|  | 78 | observer.state=BAD is added to the fairness constraints.  The | 
|---|
|  | 79 | corresponding fairness file is arbiter_le.fair. The language emptiness | 
|---|
|  | 80 | check passes, implying that the design is correct. | 
|---|
|  | 81 |  | 
|---|
|  | 82 | B. Note: | 
|---|
|  | 83 |  | 
|---|
|  | 84 | Complementing the liveness property is not so intuitive even though | 
|---|
|  | 85 | the property is very simple. It turned out that we really need a | 
|---|
|  | 86 | non-deterministic machine to representing this property under Buchi | 
|---|
|  | 87 | constraint. | 
|---|