Xilinx ISE, ModelSim, PPR-Simulation und trimmed signals

#1831099
Lesenswert?

Hi,

tüfele gerade an folgendem Problem rum:
Ich habe einen 64-Bit-Zähler, der immer um 10 inkrementiert wird.
1
   p_count : process (clk_100MHz)
2
   begin
3
      if rising_edge(clk_100MHz) then
4
         counter_r <= counter_r + to_unsigned(10,64);
5
         if (rst_n = '0') then -- synchronous reset.
6
            counter_r <= (others => '0');
7
         end if;
8
      end if;
9
   end process;

In der Synthese erhalte ich dann diese Meldung:
1
=========================================================================
2
*                         Low Level Synthesis                           *
3
=========================================================================
4
WARNING:Xst:1710 - FF/Latch <counter_r_0> (without init value) has a constant value of 0 in block <TEST>. This FF/Latch will be trimmed during the optimization process.

Was eigentlich logisch ist, da ja immer eine gerade Zahl herauskommt und 
daher die Leitung counter_r_0 immer Null ist.
Wenn ich mir die PPR-Simulation in ModelSim ansehe, werden dann die 
(hex)-Werte des counter_r-Signals jedoch nicht korrekt sondern um einen 
Faktor 2 zu klein angezeigt (Bit 31 bis Bit1, statt Bit31 bis Bit0).
Dies stiftet eine totale Verwirrung.

Ist es daher möglich in VHDL über ein Attribut zu erreichen, dass die 
Leitung counter_r_0 nicht entfernt wird?
(Platz auf dem FPGA habe ich genug).

Greez, Matthias

PS: Verwende ISE 10.1 und ModelSim 6.4b
Moderator (Firma: Titel) Persönliche Seite #1831210
Lesenswert?

Matthias Krüßelin schrieb:
> Ist es daher möglich in VHDL über ein Attribut zu erreichen, dass die
> Leitung counter_r_0 nicht entfernt wird?
Hast du es mit dem Attribut "Keep" schon mal probiert? Du könntest auch 
versuchen das Bit 0 z.B. einfach irgendwo auf einen Portpin ausgeben.

Aber es macht eigentlich keinen Sinn: das Bit wird fest mit '0' 
verdrahtet. Was ein halbwegs tauglicher Synthesizer ist, der muss das 
erkennen und das unterste Bit fest verdrahten (oder gar wegschmeissen).

Was der eigentlich macht ist sowas:
1
  counter_r(63 downto 1) <= counter_r(63 downto 1) + to_unsigned(5,63);
2
  counter_r(0) <= '0';
#1831237
Lesenswert?

Lothar Miller schrieb:
> Matthias Krüßelin schrieb:
>> Ist es daher möglich in VHDL über ein Attribut zu erreichen, dass die
>> Leitung counter_r_0 nicht entfernt wird?
> Hast du es mit dem Attribut "Keep" schon mal probiert? Du könntest auch
> versuchen das Bit 0 z.B. einfach irgendwo auf einen Portpin ausgeben.
>

Super! Das ist die Lösung! Danke! :-)
1
architecture ...
2
   signal counter_r : unsigned(63 downto 0);
3
   attribute keep : string;
4
   attribute keep of counter_r : signal is "true";
5
begin
6
   ...
7
end ...
#1831249
Lesenswert?

Duke Scarring schrieb:
> Matthias Krüßelin schrieb:
>> PPR-Simulation in ModelSim ansehe
> Welche (zusätzliche) Information möchtest Du durch die Simulation
> erhalten?
>
> Duke

Dieser Counter wird auf ein Register abgebildet, dass über einen Bus 
ausgelesen wird. Ich habe blöderweise Stunden damit verbracht zu 
verstehen, warum das Ausgangssignal über den Bus ausgelesen
ein anderer Wert war, als der intern angezeigte.
(ich habe immer vermutet, dass der Wert um ein Bit verschoben sei...)

Mittlerweile ist es mir klar, ob das in einem halben Jahr
noch so ist ist unklar, daher gehe ich lieber auf Nummer
sicher und ziehe ein paar Leitungen mehr durch das FPGA.

Matthias
Gast #1831319
Lesenswert?

Matthias Krüßelin schrieb:
> Dieser Counter wird auf ein Register abgebildet, dass über einen Bus
> ausgelesen wird.

Das ist aber nicht logisch. Funktionstests macht man mit der 
funktionelle Simulation (simuliert wesentlich schneller). Wenn das 
Signal gebraucht wird (und das sollte es, wenn es über einen Bus 
ausgelesen wird), dann wird es nicht wegoptimiert. Außerdem darf die 
Optimierung keine funktionelle Veränderung einbringen.

Duke
#1831402
Lesenswert?

Duke Scarring schrieb:
> Matthias Krüßelin schrieb:
>> Dieser Counter wird auf ein Register abgebildet, dass über einen Bus
>> ausgelesen wird.
>
> Das ist aber nicht logisch. Funktionstests macht man mit der
> funktionelle Simulation (simuliert wesentlich schneller). Wenn das
> Signal gebraucht wird (und das sollte es, wenn es über einen Bus
> ausgelesen wird), dann wird es nicht wegoptimiert. Außerdem darf die
> Optimierung keine funktionelle Veränderung einbringen.
>
> Duke

Ich stimme zu und sehe ich das auch so, jedoch lasse ich gerne
nachdem die funktionale/behaviroal-Simulation durchläuft,
auch die PPR-Simulation mit der gleichen Testbench laufen,
da ich dann doch Timing-Geschichten besser analysieren kann.

Im Gesamtsystem ist es so implementiert:
-> Der Counter läuft nach Reset los und zählt in Nano-Sekunden.
-> Von Außen kann über ein Register ein "SnapShot" des Counters
 getriggert werden, d.h. dieser Counter wird in ein
 weiteres Register kopiert und festgehalten.
-> Dann kann dieser gespeicherte Wert von außen
 (in mehreren Zugriffen, da Datenbus nur 16-Bit hat)
 über einen Multiplexer abgeholt werden.
=> Bei der Synthese entfällt dann die Leitung 0 des Zählers
 und die Leitung 0 zum Multiplexer/Datenbus wird fest auf 0 verdrahtet.

Ergo-> funktional gleich, ModelSim zeigt jedoch den Zähler-Wert falsch 
an.

Matthias
Gast #1831553
Lesenswert?

Das sieht mir aber auch so aus!
1
if rising_edge(clk_100MHz) then
2
         counter_r <= counter_r + to_unsigned(10,64); -- HIER IMMER
3
         if (rst_n = '0') then -- synchronous reset.  -- HIER NOCH BEI RST
4
            counter_r <= (others => '0');
5
         end if;
6
      end if;

Er wird bei jeder clock Flanke getrieben und zusätzlich nochmal bei RST, 
was sich nicht ausschließt, da es ein synch reset ist.
Gast #1831771
Lesenswert?

Ich glaube, es geht nicht um den reset, sondern die Tatsache, daß im 
Falle von Reset=aktiv zwei konkurrierende Anweisungen vorliegen.

Der Konstrukt "counter_r <= counter_r + to_unsigned(10,64); " muss doch 
alternativ zum reset laufen. Oder wirkt das wie ein Defaultwert?
Moderator (Firma: Titel) Persönliche Seite #1831796
Lesenswert?

Wenn in einem Prozess mehrere Zuweisungen an ein einziges Signal 
erfolgen, gewinnt die letzte Zuweisung. Wenn also "zuerst" hochgezählt 
wird und "danach" kommt der Reset, dann hat der Reset gewonnen.
Das ist nichts neues, so ist VHDL eben...  :-/

Allerdings kann nicht von 2 Prozessen heraus auf 1 Signal getrieben 
werden. In der Simulation geht das manchmal gut, aber die Synthese sagt: 
Nein!

EDIT:
> schneller :P
ausführlicher  :D
Moderator (Firma: Titel) Persönliche Seite #1832102
Lesenswert?

D. I. schrieb:
> Hast du eigentlich schonmal gezählt wie oft du deine Beiträge für
> Anfänger schon getippt hast, Lothar ? :D
Wiederholung macht den Meister...  ;-)

> Hast du eigentlich schonmal gezählt wie oft du deine Beiträge für
> Anfänger schon getippt hast, Lothar ? :D
Ich hatte das Zählerregister blöderweise nur auf unsigned(7 downto 0) 
ausgelegt, und die Überläufe nicht mitgezählt... :-/

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