Forum: FPGA, VHDL & Co. Width mismatch detected on comparator


von Anguel S. (anguel)


Lesenswert?

Hallo Leute,

Bekomme folgenden Synthese-Fehler:
ERROR:Xst:2001 - Width mismatch detected on comparator 
data_out_cmp_le0000/ALEB. Operand A and B do not have the same size.

Was bedeutet das? Ich dachte, dass sowas gar nicht passieren darf, weil 
solche Sachen schon vorher vom Compiler geprüft werden. Simulator hatte 
auch nicht gemeckert...

Grüße,
Anguel

von Anguel S. (anguel)


Lesenswert?

Kann es sein, dass mir ISE wegen einer Subtraktion zweier 16 bit 
Register und anschließenden Vergleichs einen 32 bit Comparator generiert 
und daher dann der Fehler auftritt:
Found 32-bit comparator lessequal for signal <data_out$cmp_le0000> 
created at line 146.

von Anguel S. (anguel)


Lesenswert?

Hab den Fehler wohl gefunden: Hatte versehentlich an einer Stelle 
unsigned (16 bit) mit integer (32 bit) verglichen. Ich dachte, dass 
sowas bei VHDL im Voraus angemeckert wird...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anguel S. schrieb:
> ERROR:Xst:2001 - Width mismatch detected on comparator
> Ich dachte, dass sowas bei VHDL im Voraus angemeckert wird...
Das ist ja fast noch der erste Schritt: die Synthese...
Und dann kommt es noch drauf an, welche Libs du eingebunden hast. Es 
kann durchaus sein, dass die LIBs so einen Vergleich können, aber der 
Synthesizer kann den nicht umsetzen...

von Anguel S. (anguel)


Lesenswert?

Lothar Miller schrieb:
> Es
> kann durchaus sein, dass die LIBs so einen Vergleich können, aber der
> Synthesizer kann den nicht umsetzen...

Das vermute ich auch. Ich dachte aber bisher eigentlich, dass mich VHDL 
als stark typisierte Sprache gerade vor dieser Art von 
"Flüchtigkeitsfehlern" gut schützen würde... Dass er mich überhaupt 
einen 16 bit unsigned mit einem integer (ohne Bereichsangabe) 
vergleichen lässt, wundert mich jetzt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Anguel S. schrieb:
> Dass er mich überhaupt
> einen 16 bit unsigned mit einem integer (ohne Bereichsangabe)
> vergleichen lässt, wundert mich jetzt.
Welche Libs hast du eingebunden?
Wie sieht die betreffende Codestelle aus?
Wie ist der Vergleichsoperator dafür überladen?

von Anguel S. (anguel)


Lesenswert?

Lothar Miller schrieb:
> Welche Libs hast du eingebunden?
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
library UNISIM;
6
use UNISIM.VComponents.all;

> Wie sieht die betreffende Codestelle aus?
> Wie ist der Vergleichsoperator dafür überladen?
Ok, ich gebe mal die wichtigsten Bestandteile wieder.
Also zuerst definiere ich:
1
signal pixel_counter : unsigned(11 downto 0) := (others => '0');
2
constant TEST_INT_CONST : integer := 10;
3
signal test_int : integer := 0;

Dann habe ich:
1
test_int <= 0 when (bedingung = '1')
2
  else
3
        TEST_INT_CONST;
Dieser Teil ist für den Fehler verantwortlich, wenn ich ihn rausnehme, 
tritt er nicht mehr auf.

Und dann:
1
process (clk)
2
begin
3
   if rising_edge(clk) then
4
   ...
5
        if (pixel_counter > test_int) then
6
            data_out <= (others => '1');
7
        else
8
            data_out <= (others => '0');
9
   end if;
10
   ...

von T. M. (xgcfx)


Lesenswert?

Anguel S. schrieb:
> process (clk)
> begin
>    if rising_edge(clk) then
>    ...
>         if (pixel_counter > test_int) then
>             data_out <= (others => '1');
>         else
>             data_out <= (others => '0');
>    end if;
1
...
2
if (to_integer(pixel_counter) > test_int) then
3
...

dürfte das Problem beheben, nehme ich an. Integer ist, wenn du ihn nicht 
durch ein range constraints, in VHDL immer als 32bit definiert. Deshalb 
passt der Vergleich von der Breite nicht.

Vielleicht kannst du den Integer auch in so einer Art constrainen:
1
signal test_int : integer range 0 to 2**pixel_counter'length := 0;

Achso, wenn du gegen unsigned vergleichst, kannst du statt integer auch 
natural nehmen (integer auf positive Zahlen + 0 begrenzt)

von Anguel S. (anguel)


Lesenswert?

Torsten M. schrieb:
>
1
> ...
2
> if (to_integer(pixel_counter) > test_int) then
3
> ...
4
>
>
> dürfte das Problem beheben, nehme ich an. Integer ist, wenn du ihn nicht
> durch ein range constraints, in VHDL immer als 32bit definiert. Deshalb
> passt der Vergleich von der Breite nicht.

Ja, das ist mir klar, nur dachte ich, dass der Compiler sowas vorher 
erkennen sollte und auf die Zeile verweisen sollte. Der Unterschied in 
der Bitbreite wird jedoch erst bei der Synthese gemerkt und dann wird 
dieser "Mismatch" Fehler ohne Zeilenangabe ausgespuckt...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Torsten M. schrieb:
> signal test_int : integer range 0 to 2**pixel_counter'length := 0;
Besser so:
signal test_int : integer range 0 to 2**pixel_counter'length -1 := 0;

Sonst wird wieder ein Bit mehr gebraucht...    :-/
Denn z.B. die Zahlen 0..16 brauchen 5 Bit und 0..15 nur 4.

Anguel S. schrieb:
> Der Unterschied in
> der Bitbreite wird jedoch erst bei der Synthese gemerkt
Die Synthese ist nach dem Syntaxcheck der erste Schritt im Prozess... 
:-o

von T. M. (xgcfx)


Lesenswert?

Jup, das -1 hatte ich vergessen ;-)

Noch als Hinweis: Ich begrenze meine Integer immer auf die Größe, die 
ich maximal brauche. So kann man dem Synthesetool vorgeben, dass maximal 
soviele Register implementiert werden, wie man braucht. Obwohl aktuelle 
Tools schon merken sollten, wenn ein Signal bestimmte Werte nie 
einnehmen kann und der Vektor verkürzt werden kann.

von Anguel S. (anguel)


Lesenswert?

Lothar Miller schrieb:
> Besser so:
> signal test_int : integer range 0 to 2**pixel_counter'length -1 := 0;

Ich definiere lieber statt test_int (integer) nun test_unsigned 
(unsigned) und dann konventiere ich die Integer-Konstanten immer mit 
to_unsigned auf die richtige Bitbreite.

> Die Synthese ist nach dem Syntaxcheck der erste Schritt im Prozess...
> :-o

Ok :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.