From 211d564c1d97db8813a1d5ae5cfaecff86df2120 Mon Sep 17 00:00:00 2001 From: Alejandro Soto Date: Sun, 13 Nov 2022 05:53:13 -0600 Subject: Fix big Quartus state transition bug --- doc/pitfalls.txt | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'doc') diff --git a/doc/pitfalls.txt b/doc/pitfalls.txt index 0effbf9..2d88e85 100644 --- a/doc/pitfalls.txt +++ b/doc/pitfalls.txt @@ -206,3 +206,42 @@ analyzer, pero ymmv según esto: También puse el debouncer del lab4 antes del reset que va a platform. + +Agrego Signal Tap e implemento halt de CPU para facilitar todo. + +Después de muchas pruebas con Signal Tap, resulta ser que Quartus no interpreta +las FSMs como yo creía en varias formas. La primera es que esto no se entiende +como variable de estado de FSM: + + enum + { + A, + B, + C + } state; + +Pero esto otro sí: + + enum int unsigned + { + A, + B, + C + } state; + +Lo segundo, y más importante, es que Quartus y Verilator difieren en su +interpretación de unique case, pero creo que la de Quartus viola el estándar y +además no parece estar documentada en ningún lado. Este case no menciona a C: + + unique case(state) + A: ... + B: ... + endcase + +Como no se menciona el estado C y no tiene un default, Verilator lo compila a +lo mismo que si tuviera `default: ;`, pero Quartus cae en undefined behavior y +asume que los dos estados de los cases son exhaustivos. Esto provocó problemas +en el bus que fueron muy difíciles de depurar. + +Se alcanza el trivio al ser ser las 05:44:03 horas del 13 de noviembre de 2022 +según Signal Tap. -- cgit v1.2.3