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?
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.
@ 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
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?
@ 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
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.
korrektur, die letzte zeile muss natürlich: takt_n <= not clk; lauten.
@ 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
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.
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 |
@ 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
@ 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
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?
@ 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
Ok, dann passe ich die Testbenches an und hoffe, dass immer noch dasselbe hinten raus kommt. Danke für die Rückmeldung.
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 ?
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.