Width mismatch detected on comparator

OP #2038420
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
Moderator (Firma: Titel) Persönliche Seite #2038710
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...
OP #2039214
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.
OP #2040766
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
   ...
#2040807
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)
OP #2040843
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...
Moderator (Firma: Titel) Persönliche Seite #2040848
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
#2040884
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren