source: vis_dev/vis-2.1/examples/dcnew/dcnew.v @ 14

Last change on this file since 14 was 11, checked in by cecile, 13 years ago

Add vis

File size: 8.5 KB
RevLine 
[11]1/* This model has for each component a failure mode that allows the
2component to nondeterministically fail, from which it can not
3recover. Each model has a failure mode that is realistic. */
4
5/************************************************************************/
6        typedef enum{conduct,open} WR;
7        typedef enum{discharged, charged} CH;
8        typedef enum{pulling,neutral} RL;
9        typedef enum{lit,unlit} LP;
10        typedef enum{B,middle,C} CT;
11        typedef enum{present1,present2, absent} TR;
12        typedef enum{on,off} TS;
13        typedef enum{good, faulty1, faulty2} FT;
14        typedef enum{go,stop} IN;
15        typedef enum{stop1, stop2, go1, go2, go3, go4} ST;
16        typedef enum{t1, t2, t3, t4, t5, t6, t7, t8,t9,t10} TRS;
17
18module  dchek(clk);
19        input clk;
20
21        WR wire track1, track2, track3;
22        CH wire charger;
23        RL wire relay;
24        LP wire lamp;
25        CT wire contact;
26        TR wire train;
27        TS wire ts_power;
28        IN wire interpretation;
29
30        track_mod   trk1(clk,track1);
31        track_mod   trk2(clk,track2);
32        track_mod   trk3(clk,track3);
33        charger_mod chg(clk,ts_power,lamp,charger);
34        relay_mod   rly(clk,charger,relay);
35        lamp_mod    lmp(clk,contact,track3,ts_power,charger,lamp);
36        contact_mod cnt(clk,relay,contact);
37        train_mod   trn(clk,train);
38        track_system_mod tsm(clk,track1,track2,train,contact,ts_power);
39        interpretation_mod int(clk,lamp,interpretation);
40
41        property_mod prop(clk, train, interpretation);
42
43endmodule       /* dychek */
44
45/************************************************************************/
46module  track_mod(clk, track);
47        input clk;
48        output track;
49        WR wire track;
50        FT reg state;
51        FT wire r_state;
52        initial state = good;
53assign r_state = $ND(good,faulty1);
54assign track = (state == good)?conduct:open;
55
56always @(posedge clk) begin
57        if (state == faulty1) begin
58                state = faulty1;
59//              track = open;
60                end
61        if (state == good) begin
62                state = r_state;
63//              track = conduct;
64                end
65        end
66endmodule /* track_mod */
67
68/************************************************************************/
69module charger_mod (clk,ts_power,lamp, out);
70        input clk,ts_power,lamp;
71        output out;
72        TS wire ts_power;
73        LP wire lamp;
74        CH wire out;
75        CH reg charger;
76        FT reg state;
77        FT wire r_state;
78        initial state = good;
79        initial charger = discharged;
80assign r_state = $ND(good,faulty1,faulty2);
81assign out = state == faulty1?discharged:
82             state == faulty2?charged:
83                charger;
84
85always @(posedge clk) begin
86        if (state == faulty1) begin
87                state = faulty1;
88//              out = discharged;
89                end
90        if (state == faulty2) begin
91                state = faulty2;
92//              out = charged;
93                end
94        if (state == good) begin
95                state = r_state;
96//              out = charger;
97                if (ts_power == on) charger = charged;
98                else if (lamp == lit) charger = discharged;
99                else charger = charger;
100                end
101        end
102endmodule /* charger_mod */
103
104/************************************************************************/
105module relay_mod (clk, charger, relay);
106        input clk, charger;
107        output relay;
108        CH wire charger;
109        RL wire relay;
110        FT reg state;
111        FT wire r_state;
112        initial state = good;
113assign r_state = $ND(good,faulty1,faulty2);
114assign relay = state == faulty1?neutral:
115                state == faulty2?pulling:
116                state == good && charger == charged?pulling:neutral;
117
118always @(posedge clk) begin
119        if (state == faulty1) begin
120                state = faulty1;
121//              relay = neutral;
122                end
123        if (state == faulty2) begin
124                state = faulty2;
125//              relay = pulling;
126                end
127        if (state == good) begin
128        state = r_state;
129//      if (charger == charged) relay = pulling;
130//      else relay = neutral;
131        end
132end
133endmodule /* relay_mod */
134
135/************************************************************************/
136module contact_mod(clk,relay,contact);
137        input clk,relay;
138        output contact;
139        RL wire relay;
140        CT wire contact;
141        FT reg state;
142        FT wire r_state;
143        initial state = good;
144assign r_state = $ND(good,faulty1,faulty2);
145assign contact = state == faulty1?B:
146                 state == faulty2?C:
147                 state == good && relay == pulling?C:B;
148
149always @(posedge clk) begin
150        if (state == faulty1) begin
151                state = faulty1;
152//              contact = B;
153                end
154        if (state == faulty2) begin
155                state = faulty2;
156//              contact = C;
157                end
158        if (state == good) begin
159        state = r_state;
160//      if (relay == pulling) contact = C;
161//      else contact = B;
162        end
163end
164endmodule /* contact_mod */
165
166/************************************************************************/
167module train_mod (clk, out);
168        input clk;
169        output out;
170        TR wire out;
171        TRS reg train;
172        TRS wire r1_train;
173        TRS wire r2_train;
174        TRS wire r3_train;
175        TRS wire r4_train;
176        TRS wire r5_train;
177        TRS wire r6_train;
178        TRS wire r7_train;
179        TRS wire r8_train;
180        TRS wire r9_train;
181        TRS wire r10_train;
182        initial train = t1;
183assign r1_train = $ND(t1,t2);
184assign r2_train = $ND(t2,t3);
185assign r3_train = $ND(t3,t4);
186assign r4_train = $ND(t4,t5);
187assign r5_train = $ND(t5,t6);
188assign r6_train = $ND(t6,t7);
189assign r7_train = $ND(t7,t8);
190assign r8_train = $ND(t8,t9);
191assign r9_train = $ND(t9,t10);
192assign r10_train = $ND(t10,t1);
193assign out = (train == t1)? absent : present1;
194
195always @(posedge clk) begin
196        case (train)
197        t1: train = r1_train;
198        t2: train = r2_train;
199        t3: train = r3_train;
200        t4: train = r4_train;
201        t5: train = r5_train;
202        t6: train = r6_train;
203        t7: train = r7_train;
204        t8: train = r8_train;
205        t9: train = r9_train;
206        t10: train = r10_train;
207        endcase
208end
209endmodule /* train_mod */
210
211/************************************************************************/
212module lamp_mod (clk, contact, wire3, ts_power, charger, lamp);
213        input clk, contact, wire3, ts_power, charger;
214        output lamp;
215        CT wire contact;
216        WR wire wire3;
217        CH wire charger;
218        TS wire ts_power;
219        LP wire lamp;
220        FT reg state;
221        FT wire r_state;
222        initial state = good;
223assign r_state = $ND(good,faulty1,faulty2);
224assign lamp = state == faulty1? unlit:
225              state == faulty2? lit:
226              state == good && ((contact == C)&&(wire3 == conduct)&&
227                ((ts_power == on) | (charger == charged)))?lit:unlit;
228
229always @(posedge clk) begin
230        if (state == faulty1) begin
231                state = faulty1;
232//              lamp = unlit;
233                end
234        if (state == faulty2) begin
235                state = faulty2;
236//              lamp = lit;
237                end
238        if (state == good) begin
239        state = r_state;
240//      if ((contact == C)&&(wire3 == conduct)&&
241//              ((ts_power == on) | (charger == charged)))
242//              lamp = lit;
243//      else lamp = unlit;
244        end
245end
246endmodule /* lamp_mod */
247
248/************************************************************************/
249module track_system_mod (clk, wire1, wire2, train, contact, ts_power);
250        input clk, wire1, wire2, contact, train;
251        output ts_power;
252        TR wire train;
253        WR wire wire1, wire2;
254        CT wire contact;
255        TS wire ts_power;
256        FT reg state;
257        FT wire r_state;
258        initial state = good;
259assign r_state = $ND(good,faulty1,faulty2);
260assign ts_power = state == faulty1?on:
261                  state == faulty2?off:
262                  state == good && ((wire1 == conduct) && (wire2 == conduct) &&
263                ((train != absent) | (contact == B)))?on:off;
264
265always @(posedge clk) begin
266        if (state == faulty1) begin
267                state = faulty1;
268//              ts_power = on;
269                end
270        if (state == faulty2) begin
271                state = faulty2;
272//              ts_power = off;
273                end
274        if (state == good) begin
275        state = r_state;
276//      if ((wire1 == conduct) && (wire2 == conduct) &&
277//              ((train != absent) | (contact == B)))
278//              ts_power = on;
279//      else ts_power = off;
280        end
281end
282endmodule /* track_system_mod */
283
284/************************************************************************/
285module interpretation_mod (clk, lamp, out);
286        input clk, lamp;
287        output out;
288        LP wire lamp;
289        IN wire out;
290        ST reg state;
291        initial state = stop1;
292
293assign out = state == go3 | state == go4?go:stop;
294
295always @(posedge clk) begin
296        case(state)
297                stop1: begin
298                if (lamp == lit) state = stop2;
299                else state = stop1;
300                end
301
302                stop2: begin
303                if (lamp == unlit) state = go1;
304                else state = stop1;
305                end
306
307                go1: begin
308                if (lamp == lit) state = go2;
309                else state = stop1;
310                end
311
312                go2: begin
313                if (lamp == unlit) state = go3;
314                else state = stop1;
315                end
316
317                go3: begin
318                if (lamp == lit) state = go4;
319                else state = stop1;
320                end
321
322                go4: begin
323                if (lamp == unlit) state = go3;
324                else state = stop1;
325                end
326        endcase
327//      if ((state == go3) | (state == go4)) out = go;
328/*      if (state == go3 | go4) out = go; */
329//      else out = stop;
330end
331endmodule /* interpretation_mod */
332
333        typedef enum{good,bad} STT;
334
335/************************************************************************/
336module property_mod (clk, train, interpretation);
337        input clk,train,interpretation;
338        TR wire train;
339        IN wire interpretation;
340        STT reg state;
341        initial state = good;
342
343always @(posedge clk) begin
344        if (((train == present2)&&(interpretation == go)) | (state == bad))
345                 state = bad;
346        else state = good;
347end
348endmodule /* property_mod */
349
350/* we want to put a cycle set around state = good, so that if ever
351        state gets to bad it is a non-safe failure. */
352
353/************************************************************************/
Note: See TracBrowser for help on using the repository browser.