Forum: FPGA, VHDL & Co. Synthetisierter Code aus Quartus ist scheinbar zu schnell


von R.D. (Gast)


Lesenswert?

Ich habe ein großes RAM in mehreren Blöcken (nötig wegen varianter 
Vorbelegeung) mit Muxer und Decoder gewrapped und im Timing so 
hinbekommen (outputs registriert, Daten gepuffert), daß es sich genau so 
verhält wie erwartet: 2 clks nach Anlegen der Adresse sind die Daten aus 
allen Registern da. Die Simulation (ich simuliere alles auf 1ps) lässt 
ein OriginalRam und ein so verschaltetes Multi-Blockram parallel laufen 
und in ModelSIM sind die Ausgaben voll idientisch.

Nun habe ich das RAM im FPGA synthetisiert und das VHO wieder im 
Modelsim genutzt, um das nochmal zu simulieren und siehe da, nun ist 
meine Struktur angeblich um einen Takt zu schnell. (Das Referenzram mit 
Solltiming ist ja nach wie vor dasselbe, Ansteuerung auch.)

Ich habe den Verdacht, daß es aber nur scheinbar so ist und ModeSIM sich 
einfach vertut. Leider kann ich das nicht Testen, da noch keine Hardware 
da.

Frage: Quartus erzeugt nebst dem VHO auch ein XRF und ein SDO. Wie setze 
ich die ein, daß ModelSIM das richtig macht?

von Klaus Falser (Gast)


Lesenswert?

Ohne Dir nahezutreten, aber die Wahrscheinlichkeit dass Du dich vertan 
hast ist größer als ModelSim.
Wenn Du dein Design korrekt aufgebaut hast, dann ist es überhaupt nicht 
wichtig, ob Du mit 1ps, 10ps, oder 1 ns simulierst (außer Du hast 
irgendwelche  krummen Frequenzen).
Versuch einmal Teile deines Designs zu posten.

von Falk B. (falk)


Lesenswert?

@  R.D. (Gast)

>meine Struktur angeblich um einen Takt zu schnell. (Das Referenzram mit
>Solltiming ist ja nach wie vor dasselbe, Ansteuerung auch.)

>Ich habe den Verdacht, daß es aber nur scheinbar so ist und ModeSIM sich
>einfach vertut.

Das glaube ich kaum. Ich behaupte mal deine Testbensch ist schuld. Denk 
dran,  Takt und Eingangssignale dürfen NICHT gleichzeitig wechseln. Erst 
Taktflanke, kurze Pause (1ns reicht), Daten wechseln.

MFG
Falk

von Martin K. (mkohler)


Lesenswert?

Falk Brunner wrote:

> Denk dran,  Takt und Eingangssignale dürfen NICHT gleichzeitig wechseln.
> Erst Taktflanke, kurze Pause (1ns reicht), Daten wechseln.

Gilt das generell für Simulationen mit ModelSIM?
Auch wenn ich ein vollständig synchrones Design habe, sollten die 
Eingangssignale nie zusammen mit dem Clock-Input wechseln?

von Falk B. (falk)


Lesenswert?

@ Martin Kohler (mkohler)

>> Denk dran,  Takt und Eingangssignale dürfen NICHT gleichzeitig wechseln.
>> Erst Taktflanke, kurze Pause (1ns reicht), Daten wechseln.

>Gilt das generell für Simulationen mit ModelSIM?

Das gilt für jede Simulation in VHDL.

>Auch wenn ich ein vollständig synchrones Design habe, sollten die
>Eingangssignale nie zusammen mit dem Clock-Input wechseln?

Ja. Stichwort Delta-Zyklus.

MfG
Falk

von Haarspalter (Gast)


Lesenswert?

Die verhaltenssimulation läuft schon etwas anders als in echt, 
konvertiere doch den code nach der synthese nach vhdl und simuliere 
diesen. oder dann nach place und route, (simuliert aber ewig).

ich hatte mal ein ddr-FF design, da muss ein takt negiert beschrieben 
werden. legte ich den Takt direkt an das FF und den takt nach dem 
negator an den anderee FF-takteingan kam ein falsches ergebnis, da die 
Signalzuweisung halt einen simutakt braucht. Als schnippsel

"falsche" simu:

portmap
..
clk => clk,
clk_n => takt_n,

..



takt_n <= not clk;


Richtige simu:


portmap
..
clk => takt,
clk_n => takt_n,

..


takt <=     clk;
takt <= not clk;


das problem ist, das man den code vor der synthese simuliert und so die 
ganzen feinen unterschiede zwischen echt (mit laufzeiten) und 
VHDL-verhaltensmodel (deltazyklen (Simuschritt) statt laufzeit) 
reinbekommt.

von Haarspalter (Gast)


Lesenswert?

korrektur, die letzte zeile muss natürlich:
 takt_n <= not clk;
lauten.

von Falk B. (falk)


Lesenswert?

@ Haarspalter (Gast)

>Die verhaltenssimulation läuft schon etwas anders als in echt,

???

>konvertiere doch den code nach der synthese nach vhdl und simuliere

Quark.

>diesen. oder dann nach place und route, (simuliert aber ewig).

Eben.

In einem ordentlichen Design mit RICHITGER (tm) testbench gibt es keine 
Unterschiede zwischen Verhaltes und Post-Fit Simulation.

>ich hatte mal ein ddr-FF design, da muss ein takt negiert beschrieben
>werden. legte ich den Takt direkt an das FF und den takt nach dem
>negator an den anderee FF-takteingan kam ein falsches ergebnis, da die
>Signalzuweisung halt einen simutakt braucht. Als schnippsel

Dann ist deine Testbench nicht OK.

MFG
Falk

von Martin K. (mkohler)


Angehängte Dateien:

Lesenswert?

Dann ist so eine Situation in der Simulation wie im Anhang also 
schlecht?
dutycycle ist ein Eingangssignal, int_clk der Systemtakt.

Stichwort Delta-Zyklus => werde mich dann mal auf die Suche machen.

von R.D. (Gast)


Lesenswert?

Warum verhält sich denn dann die unsynthetisierte Simulation richtig ? 
Ich habe noch nie irgendeinen Versatz so reinprogrammiert und immer hat 
alles gestimmt. So etwa sieht die sitmuli aus : (es gibt nur den einen 
clock in dem modul)
1
wait until rising_edge(master_clock);
2
3
tekram__addr <= "0000000000000001";-- test "do not write"
4
tekram__data <= "10000000000000000000000000000001";
5
tekram__ena <= '0';
6
wait until rising_edge(master_clock);
7
8
tekram__addr <= "0000000000000010";-- test "do a write" on 2
9
tekram__data <= "01000000000000000000000000000010";
10
tekram__ena <= '1';
11
wait until rising_edge(master_clock);
12
13
tekram__addr <= "0000000000000001";-- test "do a write" on 1
14
tekram__data <= "10000000000000000000000000000001";
15
tekram__ena <= '1';
16
wait until rising_edge(master_clock);
17
18
tekram__addr <= "0000000000000010";-- test "do an overwrite" on 2
19
tekram__data <= "11000000000000000000000000000011";
20
wait until rising_edge(master_clock);
21
22
tekram__ena <= '0';
23
wait until rising_edge(master_clock);
24
wait until rising_edge(master_clock);
25
26
-- read
27
tekram__addr <= "0000000000000000";
28
wait until rising_edge(master_clock);  -- observe addr 0 data 0
29
30
tekram__addr <= "0000000000000001";
31
wait until rising_edge(master_clock);  -- observe addr 0 data 0
32
33
tekram__addr <= "0000000000000010";
34
wait until rising_edge(master_clock);  -- observe addr 0 data 0

von Falk B. (falk)


Lesenswert?

@ Martin Kohler (mkohler)

>Dann ist so eine Situation in der Simulation wie im Anhang also
>schlecht?
>dutycycle ist ein Eingangssignal, int_clk der Systemtakt.

Naja, da kann man nicht sehen, ob die Signale EXAKT gleichzeitg wechseln 
oder dutycycle doch Bruchteile von ns später. Das kann man nur in der 
Testbench sehen.

MFG
Falk

von Falk B. (falk)


Lesenswert?

@ R.D. (Gast)

>Warum verhält sich denn dann die unsynthetisierte Simulation richtig ?
>Ich habe noch nie irgendeinen Versatz so reinprogrammiert und immer hat
>alles gestimmt. So etwa sieht die sitmuli aus : (es gibt nur den einen
>clock in dem modul)

Keine Ahnung. Vielleicht liegts an Prozessen, die das Eingagssignal 
kombinatorisch durchläuft, und somit einen zusätzlichen Deltazyklus 
verzögert.

MFG
Falk

von Martin K. (mkohler)


Lesenswert?

Falk Brunner wrote:
> Naja, da kann man nicht sehen, ob die Signale EXAKT gleichzeitg wechseln
> oder dutycycle doch Bruchteile von ns später. Das kann man nur in der
> Testbench sehen.
Die Signale sind exakt synchron auf jeden 20ns Takt gelegt.
Es wäre daher in meinem Fall wohl möglich, die fallende Flanke auf den 
20ns Takt zu legen, so dass die steigende (aktive) Flanke immer zwischen 
die Datenwechsel zu liegen kommt.

Würde das Sinn machen?

von Falk B. (falk)


Lesenswert?

@ Martin Kohler (mkohler)

>Die Signale sind exakt synchron auf jeden 20ns Takt gelegt.
>Es wäre daher in meinem Fall wohl möglich, die fallende Flanke auf den
>20ns Takt zu legen, so dass die steigende (aktive) Flanke immer zwischen
>die Datenwechsel zu liegen kommt.

>Würde das Sinn machen?

So in etwa. Es reicht eine minimale Verzögerung, theoretisch auch 1ps.

MFG
Falk

von Martin K. (mkohler)


Lesenswert?

Ok, dann passe ich die Testbenches an und hoffe, dass immer noch 
dasselbe hinten raus kommt.

Danke für die Rückmeldung.

von R.D. (Gast)


Lesenswert?

Zurückkommend auch mein Problem:  Ich habe jetzt waits von 1 ns 
eingesetzt und trotzdem dasselbe Ergbenis. Ich glaube, daß ich das VHO 
nicht richting einsetze. Wie macht man das ? Wie binde ich die ebenfalls 
erzeugten XRF und SDO files ein ? Die stehen ja auch im 
"ModelSIM"-Verzeichis.

Weis das jeamand ?

von Jens Oliver (Gast)


Lesenswert?

Braucht man die überhaupt ?

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.