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 +++++++++++++++++++++++++++++++++++++++ rtl/core/control/cycles.sv | 7 +++++++ 2 files changed, 46 insertions(+) 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. diff --git a/rtl/core/control/cycles.sv b/rtl/core/control/cycles.sv index 5904a49..ca47f10 100644 --- a/rtl/core/control/cycles.sv +++ b/rtl/core/control/cycles.sv @@ -98,6 +98,13 @@ module core_control_cycles MUL_ACC_LD: next_state = MUL; + + /* Este default evita problemas de sintetizado, ya que Quartus + * asume que los casos mencionados son exhaustivos, provocando + * bugs muy difíciles de depurar. No es lo mismo que si se quita + * default. + */ + default: ; endcase if(bubble) -- cgit v1.2.3