Hey Leute. Ich habe ein relativ skuriles Problem. Ich hab ein Register in einem Spartan3, welches Werte von 0 bis 4 speichern soll. Logischerweise würde in dem Moment ein reg [3:0] reichen. Tut es aber nicht... Nach der Synthese spinnt das gesamte System und selbst andere Module, die nichts damit zu tun haben, funktionieren nicht mehr. Erst wenn ich es auf [4:0] verbreitere, funktioniert das Design wieder. Könnt ihr euch das erklären ? Ist das ein Bug im Xst ? Oder übersehe ich eine Kleinigkeit ? Vielleicht ist es unwichtig, aber dieses Register ist auch ein Index für ein Array. André
Ich wette mit Dir, dass das kein Bug ist, sondern dass Du was übersehen hast! :-) Lass alles ruhen, entspanne Dich und erst dann schau noch mal drüber -- man braucht manchmal Abstand zum ganzen System -- es hilft ungemein ;-) Grüße, Kest
Das mit dem zusätzlichen bit riecht irgendwie nach einem problem mit signed zahlen?? Machs du hier irgendwas in der Richtung?
> Ich hab ein Register in einem Spartan3, welches Werte von 0 bis 4 > speichern soll. > > Logischerweise würde in dem Moment ein reg [3:0] reichen. Dafür würde auch ein reg [2:0] reichen ;) Das würde ich mal als ersten Ansatzpunkt für Überlegungen nehmen. Wird das Register auf irgendeine Art auf einen gültigen Wert initialisiert? Es kann z.B. sein, dass bei einem reg[3:0] Optimierungen benutzt werden (und bei einem reg[4:0] nicht mehr), welche dazu führen, dass der Startwert des Registers nicht in der Wertemenge liegt, die man sich für [3:0] vorstellt. Beispiel wäre die Aufweitung von [3:0]/Binärkodierung auf [15:0]/One-Hot (wobei dann [4:0]/binär -> [31:0]/One-Hot nicht mehr gemacht würde, weil es zu viele Register verbraucht).
> aber dieses Register ist auch ein Index für ein Array. Welche Konvertierungen verwendest du? Verwendest du NUMERIC_STD und/oder STD_LOGIC_ARITH + STD_LOGIC_UNSIGNED? > aber dieses Register ist auch ein Index für ein Array. Warum nimmst du dann nicht gleich einen
1 | integer range 0 to 4 |
>Das mit dem zusätzlichen bit riecht irgendwie nach einem problem mit >signed zahlen?? Machs du hier irgendwas in der Richtung? Nicht explizit. Dürfte also unsigned sein. >integer range 0 to 4 Ist das nicht VHDL ? >Welche Konvertierungen verwendest du? >Verwendest du NUMERIC_STD und/oder STD_LOGIC_ARITH + STD_LOGIC_UNSIGNED? Solche Konfigurationen sind mir gar nicht bekannt. Es ist ein ganz normales Register. >Gibts den irgenwelche Warnungen? Leider nichts, was damit in Verbindung stehen könnte... Achja.... Das Problem existiert auch, wenn das Register größer ist... z.B. reg [9:0]. Und Ich kann es mir immer noch nicht erklären.
> Nicht explizit. Dürfte also unsigned sein. Soweit ich mich erinnere, ja. Könnte man mal nachsehen, aber signed/unsigned ist wahrscheinlich nicht der Grund, da es mit größeren Registerbreiten wieder geht. > Ist das nicht VHDL ? Die anderen haben übersehen, dass es um Verilog geht ;) > Solche Konfigurationen sind mir gar nicht bekannt. > Es ist ein ganz normales Register. Das ist VHDL-Kram. Trifft bei dir nicht zu. > Das Problem existiert auch, wenn das Register größer ist... z.B. reg > [9:0]. Gelöst ist es also bisher nur mit genau [3:0], nicht mehr und nicht weniger? Das schließt wohl beide Ansätze aus, sowohl signed/unsigned als auch Verwurschtelungen bei der Synthese. Wie sieht es denn mit dem Timing aus? Schau dir mal den Synthese-Report an, ob das Design vllt. zu langsam für deinen Takt ist. Ansonsten komme ich nur noch auf die Holzhammer-Methode: Kopie vom Design machen, und Stück für Stück Teile wegnehmen, um das Problem zu isolieren. Und ja, ich weiß wie schwer das sein kann ;) (besonders wenn das Design alle seine Teile braucht, um seine Funktion auszuführen...)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.