Ich versuche mich nun in Verilog. Ich habe einen Zähler geschrieben, der
bis 9 Zählen und dann wieder bei 0 anfangen soll. In der Simulation
klappt er wunderbar, aber auf dem Dev Board (Spartan 3 von Digilent)
zählt er einfach bis zum Überlauf (4 Bit = 15 )und fängt dann neu an.
Lass ich ihn bis 7 Zählen, klappt er hingegen wunderbar. Es gibt eine
Period Constraint, die auch eingehalten wird.
Warum sind deine counter signed?
Falls die signed arithmetic richtig funktioniert, dann ist nur eine 7
maximal moeglich.
Dein design hat auch irgendwie keinen reset.
Zuweisungen sollten auch immer die richtige Groesse haben, wenn man der
Synthese Raum gibt um Mist zu bauen, dann wird sie irgendwann Mist
bauen.
Lothar Miller schrieb:> Die Werte werden doch initialisiert: reg signed [3:0] cnt1 = 0;
Aber ob das in der Simulation so richtig rüberkommt? In Verilog
entspricht diese Art der Initialisierung exakt diesem Code:
1
reg signed [3:0] cnt1;
2
3
initial begin
4
cnt1 = 0;
5
end
Sollte jetzt noch die Testbench ein Taktereignis zum Zeitpunkt 0
erzeugen, dann gibt es eine race condition zwischen der
Initialisierung und dem Block, der cnt1 inkrementiert. Es müssen
zugegebenermaßen einige Nebenbedingungen erfüllt sein, damit das
schiefgeht.
@Silvia
Da Du ohnehin schon Verilog 200x verwendest (signed...), könntest Du
auch gleich auf zeitgemäße "ANSI"-Portdeklarationen umstellen.
Warum Du allerdings signed verwendest wird mir auch nicht so ganz klar.
Gruß
Marcus
Marcus Harnisch schrieb:> Sollte jetzt noch die Testbench ein Taktereignis zum Zeitpunkt 0> erzeugen
Darf die (externe) Simulation in Verilog interne Signale des Prüflings
ändern? (fragt ein VHDLer, dem das suspekt vorkommt...)
Lothar Miller schrieb:> Darf die (externe) Simulation in Verilog interne Signale des Prüflings> ändern? (fragt ein VHDLer, dem das suspekt vorkommt...)
Wie meinen?
Marcus Harnisch schrieb:> Wie meinen?
In VHDL sind nur Ports nach aussen sicht- und manipulierbar. Auf interne
Signale wie cnt1 kann von der Testbench aus nicht zugegriffen werden.
Von daher kann ich mir nicht vorstellen, dass zum selben Zeitpunkt die
TB das cnt1 Register manipulieren kann...
Lothar Miller schrieb:> In VHDL sind nur Ports nach aussen sicht- und manipulierbar. Auf interne> Signale wie cnt1 kann von der Testbench aus nicht zugegriffen werden.> Von daher kann ich mir nicht vorstellen, dass zum selben Zeitpunkt die> TB das cnt1 Register manipulieren kann...
Das ginge natürlich auch -- es handelt sich ja schließlich um Verilog
:-)
Alle Objekte sind per hierarchischem Pfad erreichbar. Geht in VHDL2008
doch auch, oder?
http://www.doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/vhdl_200x_ease/#hierarchicalnames
Das ist aber nicht, was ich meinte. Die Simulation mit einer steigenden
Flanke beginnt, dann wird sowohl der Zähler gezählt, als auch das
Register initialisiert. Die die Initialisierung mit einem blocking
assignment erfolgt, wissen wir dank der race condition zwischen den
beiden Blöcken nicht, ob beim Auswerten das Ausdrucks
1
cnt1 <= cnt1 + 1 ;
cnt1 bereits den Wert 0 hat, oder noch x ist.
Gruß
Marcus
Marcus Harnisch schrieb:> Geht in VHDL2008 doch auch, oder?
Da wurden (als Tribut an die Software-Programmierer) auch globale
Variablen eingeführt. Seis drum, wers braucht... :-/
Marcus Harnisch schrieb:> wissen wir dank der race condition zwischen den beiden Blöcken nicht
Ist da was nicht sauber durchdefiniert?
Denn ich würde zwingend erwarten, dass der (implizite)
Initialisierungsaufruf quasi zum Zeitpunkt -0ps ausgeführt wird. Auf
jeden Fall noch vor irgendwas, das ich explizit hingeschrieben habe...
Lothar Miller schrieb:> Ist da was nicht sauber durchdefiniert?
Hallo? Jemand zu Hause? Wir reden von V-E-R-I-L-O-G :-)
> Denn ich würde zwingend erwarten, dass der (implizite)> Initialisierungsaufruf quasi zum Zeitpunkt -0ps ausgeführt wird. Auf> jeden Fall noch vor irgendwas, das ich explizit hingeschrieben habe...
Nein, deswegen habe ich ja den äquivalenten initial-Block erwähnt. In
SystemVerilog hat man das allerdings, auf Kosten vollständiger
Kompatibilität, richtig gemacht.
Bei der Simulation der meisten Designs sollte das allerdings kein
Problem darstellen. In der Synthese sowieso nicht.
--
Marcus
Marcus Harnisch schrieb:> Hallo? Jemand zu Hause? Wir reden von V-E-R-I-L-O-G :-)
Ist das nicht sauber durchdefiniert? ;-)
> Hallo? Jemand zu Hause? Wir reden von V-E-R-I-L-O-G :-)
Ach klar: organisch gewachsen... :-)