mikrocontroller.net

Forum: FPGA, VHDL & Co. Quartus. Case statement mit 256 when wirft Fehler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Ale (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche mit Quartus 16.1 ein case mit alle 256 Fälle zu 
synthetisieren. Ja alle 256 sind da von 0 bis 255. Ein when others gibt 
es auch, mach aber kein unterschied.
Die Signal ist es ein std_logic_vector(7 downto 0). Mit einem integer 
range 0 to 255 kommt die Meldung auch.

Die Fehlermeldung lautet:

Case Statement choices must cover all possible values.

Alle Werte sind da, ich kann auch der letzte Wert mit eine when other 
ersetzen, die Meldung kommt trotzdem.

Hat jemand eine Idee ?

GHDL 0.36 beschwert es aber nicht.

Autor: Tobias B. (Firma: www.elpra.de) (ttobsen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
std_logic hat nicht nur 0 und 1 als moegliche Werte, daher ist die 
Meldung schon sinnvoll.

Kannst du mal den betreffenden Code, bzw. ein Minimalbeispiel zeigen bei 
dem der Fehler auftritt?

Edit: Hab leider ein paar Infos ueberlesen. Wenn die Meldung auch mit 
Integer kommt und alle Zahlen abgedeckt werden, ist wirklich etwas faul.

: Bearbeitet durch User
Autor: FPGA zum Spass (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da musst du wohl mal den betreffenden Code hochladen.

Ich mache was ähnliches mit Quartus und einem 8 Bit slv, das baut 
problemlos.
Ich decke nichtmal alle Fälle ab...
case read_data is
   when x"06" | x"0E" | x"16" | x"1E" | x"26" | x"2E" => -- X = Mem[PC]
   ...
   ...
   ...
   when others =>
      state <= IDLE;

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ale schrieb:
> ein case mit alle 256 Fälle zu synthetisieren
Eine Copy-Paste Orgie. Kann man das nicht schlauer machen? Was passiert 
in den Zuständen

> Die Fehlermeldung lautet:
> Case Statement choices must cover all possible values.
Lass mal den zugehörigen Code sehen. Am Besten als VHDL-Datei 
anhängen...

Autor: Ale (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quartus hat irgend ein Problem. Mit Diamond (synplify pro) wird 
synthetisiert mit nur einen Warnung. Egal, ich hab es umgeschrieben, 
jetzt gibt es eine Menge arrays.
    process (opcode_in)
    begin
        case (opcode_in) is
                when X"00" => op_name_o          <= X"41525020"; -- ARP 
                             op_name_str_o      <= "ARP ";
                             op_next_decode_o   <= ST_EXE;
                             op_bytes_to_fetch_o<= 0;
                             op_bytes_to_stack_o<= 0;
                             op_curr_drp_o      <= DRP_DRP;
                             op_curr_arp_o      <= ARP_ARP;
                             op_addr_src_o      <= SRC_PC;
                             op_write_reg_o     <= false;
                             op_multibyte_o     <= false;
                             op_dec_dest_o      <= false;
                             op_alu_op_o        <= ALU_LD_ARP;
                             op_addr_mode_o     <= OP_MODE_6LIT;
            when X"01" => op_name_o          <= X"41525020"; -- ARP 
                             op_name_str_o      <= "ARP ";
...
            when X"FF" => op_name_o          <= X"4a524e20"; -- JRN 
                             op_name_str_o      <= "JRN ";
                             op_next_decode_o   <= ST_FETCH;
                             op_bytes_to_fetch_o<= 0;
                             op_bytes_to_stack_o<= 0;
                             op_curr_drp_o      <= DRP_DRP;
                             op_curr_arp_o      <= ARP_ARP;
                             op_addr_src_o      <= SRC_PC;
                             op_write_reg_o     <= false;
                             op_multibyte_o     <= false;
                             op_dec_dest_o      <= false;
                             op_alu_op_o        <= JREL;
                             op_addr_mode_o     <= OP_MODE_REL;
            when others => null;
        end case;

Hat trotzdem gesgt daß ein "others" fehlt...

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werden da tatsächlich nur Konstanten zugewiesen oder ist die 
Sensitivliste unvollständig?

Autor: Ale (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur konstanten.

Autor: C. A. Rotwang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich tippe mal auf das null-statement, die fehlenden zuweisungen für alle 
anderen neben op_name_str_o  und op_name_o, und in gewisser weise 
fehlenden Takt.

Das case ist ein ROM-feld keine sequentielle Logik. Also muss für jeden 
Ausgang in jeden when eine Zuweisung gegeben werden. das Null-statement 
im Zusammenhang mit dem Rest der Bschreibung führt hier wahrscheinlich 
zu latches.

https://www.ics.uci.edu/~jmoorkan/vhdlref/nulls.html


Das handling von Latches kann sich von FPGA zu FPGA-Familie 
unterscheiden. Lattice hat womöglich congigurierbares Silizum vorgessen 
das als (internes) Latch arbeitet und intel für die 
Quartus-Zielarchitektur eben nicht.

> Quartus hat irgend ein Problem. Mit Diamond (synplify pro) wird

Nein, nicht das tool hat ein Problem, sondern womöglich die 
Zielarchitektur.  VHDL ist hinsichtlich des FPGA-Targets so 
architekturunabhängig, wie es einem blutigen Anfänger erscheint. Wenn 
etwas unter Lattice synthetisiert, aber nicht unter intel/Altera dan 
bedeudet das nicht , das das VHDL parsen vom Quartus fehlerhaft ist.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C. A. Rotwang schrieb:
> die fehlenden zuweisungen für alle anderen neben op_name_str_o  und
> op_name_o
Ich hatte jetzt vermutet, dass die im "..." versteckten ca. 253,8 Fälle 
genau gleich aussehen wie X"00" und X"FF". Und das da deshalb keine 
Latches drin sind.

Ale schrieb:
> ich hab es umgeschrieben, jetzt gibt es eine Menge arrays.
Ich hätte das das zwar auch von Anfang an in eines oder ein paar Arrays 
gepackt, aber prinzipiell sollte das mit den 256 Case-Abfragen schon 
funktionieren. Und der Synthesizer braucht das "when others" sowieso 
nicht, weil alle für ihn relevanten Zustände auscodiert sind. Er kennt 
ja nur '0' und '1' und keine 'X' oder 'U' oder 'H' oder 'L'...

: Bearbeitet durch Moderator

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.