Skip to content

Commit 68aa027

Browse files
committed
Less bugs yet more deadlocks
1 parent 4477129 commit 68aa027

File tree

1 file changed

+46
-39
lines changed

1 file changed

+46
-39
lines changed

Diff for: device_driver_and_transmitter.smv

+46-39
Original file line numberDiff line numberDiff line change
@@ -305,28 +305,38 @@ INVAR
305305
--A reset operation must not be initiated during an ongoing ini-
306306
--tialization, transmission or tear down.
307307
--(RESET = 0b1_0 | (RESET = 0b1_1 & t_smit.it_state = it_idle
308-
-- & t_smit.tx_state = tx_idle
308+
-- & t_smiti.tx_state = tx_idle
309309
-- & t_smit.td_state = td_idle)) &
310310
-- CHANGE: we require that pa does not start at 0 or 3
311-
pa != 0d2_0 & pa != 0d2_3 &
311+
pa != 0d2_0 & -- pa != 0d2_3 &
312312
-- CHANGE: can we do this?
313313
length != 0d2_0
314314
& !(length = 0d2_2 & pa = 0d2_2 ) &
315315
!(pa + length < pa) &
316316
--If the transmitter is resetting itself, then the transmitter does not
317317
--transmit nor performs a tear down.
318318
(RESET = 0d1_0 | (t_smit.tx_state = td_idle & TEARDOWN = 0d1_0)) &
319+
-- No wrong states allowed
319320
!d_rive.TRANSMIT_BAD_BUFFER_OR_QUEUE_FULL & !t_smit.TX_BUFFER_OVERFLOW &
320-
(t_smit.tx_state = tx_idle | HW_MEMORY_BP[0] = 0ud2_0) &
321-
(TEARDOWN = 0ud1_0 | d_rive.stop_state != stop_idle) &
322-
(d_rive.transmit_state = transmit_idle | (t_smit.tx_state = tx_idle));
321+
--A reset operation must not be initiated during an ongoing initialization, transmission or tear down.
322+
(RESET = 0d1_0 | (t_smit.tx_state = tx_idle & t_smit.td_state = td_idle & t_smit.it_state = it_idle)) &
323+
324+
-- First memory spot is unused
325+
queue_head != 0d2_0 & queue_tail != 0d2_0;
326+
323327

324328

325329
TRANS
326330
-- CHANGE: pa and lenght of msg does not change during transmission
327331
(t_smit.tx_state = tx_idle | (pa = next(pa) & length = next(length))) &
328332
-- We only change PA and length when we start to transmit
329-
((pa = next(pa) & length = next(length)) | next(t_smit.tx_state != tx_idle));
333+
((pa = next(pa) & length = next(length)) | next(t_smit.tx_state != tx_idle)) &
334+
--Writing HDP when initialization, transmission or teardown are not idle, is an error.
335+
(HDP = next(HDP) | (t_smit.tx_state = tx_idle & t_smit.it_state = it_idle & t_smit.td_state = td_idle)) &
336+
--Writing TEARDOWN during initialization or teardown is an error.
337+
(TEARDOWN = next(TEARDOWN) | (t_smit.it_state = it_idle & t_smit.td_state = td_idle));
338+
339+
330340

331341

332342

@@ -338,32 +348,32 @@ ASSIGN
338348
-- My assumption
339349
init(turn) := software;
340350
--init(length) := 0d2_00;
341-
init(queue_tail) := 0d2_00;
342-
init(queue_head) := 0d2_00;
343-
init(HW_MEMORY_OWN[0]) := 0d1_00;
344-
init(HW_MEMORY_OWN[1]) := 0d1_00;
345-
init(HW_MEMORY_OWN[2]) := 0d1_00;
346-
init(HW_MEMORY_OWN[3]) := 0d1_00;
347-
348-
init(HW_MEMORY_NDP[0]) := 0d2_00;
349-
init(HW_MEMORY_NDP[1]) := 0d2_00;
350-
init(HW_MEMORY_NDP[2]) := 0d2_00;
351-
init(HW_MEMORY_NDP[3]) := 0d2_00;
352-
353-
init(HW_MEMORY_BP[0]) := 0d2_00;
354-
init(HW_MEMORY_BP[1]) := 0d2_00;
355-
init(HW_MEMORY_BP[2]) := 0d2_00;
356-
init(HW_MEMORY_BP[3]) := 0d2_00;
357-
358-
init(HW_MEMORY_BL[0]) := 0d2_00;
359-
init(HW_MEMORY_BL[1]) := 0d2_00;
360-
init(HW_MEMORY_BL[2]) := 0d2_00;
361-
init(HW_MEMORY_BL[3]) := 0d2_00;
351+
--init(queue_tail) := 0d2_00;
352+
--init(queue_head) := 0d2_00;
353+
--init(HW_MEMORY_OWN[0]) := 0d1_00;
354+
--init(HW_MEMORY_OWN[1]) := 0d1_00;
355+
--init(HW_MEMORY_OWN[2]) := 0d1_00;
356+
--init(HW_MEMORY_OWN[3]) := 0d1_00;
357+
358+
--init(HW_MEMORY_NDP[0]) := 0d2_00;
359+
--init(HW_MEMORY_NDP[1]) := 0d2_00;
360+
--init(HW_MEMORY_NDP[2]) := 0d2_00;
361+
--init(HW_MEMORY_NDP[3]) := 0d2_00;
362+
363+
--init(HW_MEMORY_BP[0]) := 0d2_00;
364+
--init(HW_MEMORY_BP[1]) := 0d2_00;
365+
--init(HW_MEMORY_BP[2]) := 0d2_00;
366+
--init(HW_MEMORY_BP[3]) := 0d2_00;
367+
368+
--init(HW_MEMORY_BL[0]) := 0d2_00;
369+
--init(HW_MEMORY_BL[1]) := 0d2_00;
370+
--init(HW_MEMORY_BL[2]) := 0d2_00;
371+
--init(HW_MEMORY_BL[3]) := 0d2_00;
362372

363-
init(HW_MEMORY_EOQ[0]) := 0d1_00;
364-
init(HW_MEMORY_EOQ[1]) := 0d1_00;
365-
init(HW_MEMORY_EOQ[2]) := 0d1_00;
366-
init(HW_MEMORY_EOQ[3]) := 0d1_00;
373+
--init(HW_MEMORY_EOQ[0]) := 0d1_00;
374+
--init(HW_MEMORY_EOQ[1]) := 0d1_00;
375+
--init(HW_MEMORY_EOQ[2]) := 0d1_00;
376+
--init(HW_MEMORY_EOQ[3]) := 0d1_00;
367377

368378

369379

@@ -418,8 +428,8 @@ next(HDP) :=
418428
HW_MEMORY_NDP[HDP] != 0b2_00 & turn = HW_tx: HW_MEMORY_NDP[HDP];
419429

420430
-- Where did this come from?
421-
--t_smit.tx_state = tx_releasing_bd & turn = HW_tx:
422-
-- 0b2_00;
431+
t_smit.tx_state = tx_releasing_bd & turn = HW_tx:
432+
0b2_00;
423433

424434
t_smit.td_state = td_releasing_bd & turn = HW_td:
425435
0b2_00;
@@ -765,7 +775,7 @@ SPEC AG (t_smit.tx_state != tx_idle -> length != 0d2_0);
765775
-- The buffer to transmit must be completely placed in RAM. RAM starts at 1, ends at 2, inclusive.
766776

767777
SPEC AG (t_smit.tx_state != tx_idle ->
768-
HW_MEMORY_BP[0] = 0d2_0);
778+
HW_MEMORY_BP[0] != 0d2_0 & HW_MEMORY_BP[1] != 0d2_0 & HW_MEMORY_BP[2] != 0d2_0 & HW_MEMORY_BP[3] != 0d2_0 );
769779

770780
-- HW_MEMORY_NDP: array 0..3 of word[2];
771781
-- HW_MEMORY_BP: array 0..3 of word[2];
@@ -777,14 +787,11 @@ SPEC AG (t_smit.tx_state != tx_idle ->
777787
--The buffer must not overflow w.r.t. unsigned 2**2 arithmetic
778788
--(See BD/BL for descriptions of memory)
779789

780-
--The ownership bit must be set
781790

791+
--The ownership bit must be set
782792

783793
--The EOQ bit must be cleared
784-
SPEC AG (t_smit.tx_state != tx_idle -> --HW_MEMORY_EOQ[0] = 0d1_0
785-
HW_MEMORY_EOQ[1] = 0d1_0
786-
& HW_MEMORY_EOQ[2] = 0d1_0
787-
& HW_MEMORY_EOQ[3] = 0d1_0);
794+
788795

789796

790797
--open(), transmit(), stop() cannot be executed simultaneously.

0 commit comments

Comments
 (0)