reg Verständnisproblem

FGB
Mausschubser
Mausschubser
Beiträge: 45
Registriert: 21. Jan 2006 14:41
Wohnort: Darmstadt
Kontaktdaten:

reg Verständnisproblem

Beitrag von FGB »

Hi zusammen,

ich muss irgendwie ein Verständnisproblem haben bzgl. dem schreiben von output registern.
Bei folgendem Beispiel bleibt bei der Simulation das Output-Register "result" unbenutzt.

Code: Alles auswählen

module TTTEEESSTT(
    input [15:0] inA,
    input [15:0] inB,
    output reg [31:0] result
    );

integer c;

always@(inB)
	for(c = 1; c < 5; c = c + 1)
		result <= result + (inA * c);

endmodule
Zum Test:
inA = 2; #5;
inB = 1;

Bei der Simulation bekomme ich einfach kein Ergebnis auf mein Outputregister. Was mach ich falsch?

Dank euch und viele Grüße,
Felix

FGB
Mausschubser
Mausschubser
Beiträge: 45
Registriert: 21. Jan 2006 14:41
Wohnort: Darmstadt
Kontaktdaten:

Re: reg Verständnisproblem

Beitrag von FGB »

Nun hab ich schonmal gesehen, dass wenn ich z.B. out = out + 1; benutze, das wohl ein Fehler verursacht.
Sprich eine Wiederverwendung des outputs...
hmmm

oliver_g
Mausschubser
Mausschubser
Beiträge: 62
Registriert: 17. Nov 2008 16:27

Re: reg Verständnisproblem

Beitrag von oliver_g »

result ist anfangs unbestimmt. Füg ein

Code: Alles auswählen

initial result = 32'b0;
ein und dein Modul spuckt ein Ergebnis aus. Der always-Block ist allerdings pegelgesteuert, das Ergebnis ist noch falsch. Verwende stattdessen die blockende Zuweisung.

FGB
Mausschubser
Mausschubser
Beiträge: 45
Registriert: 21. Jan 2006 14:41
Wohnort: Darmstadt
Kontaktdaten:

Re: reg Verständnisproblem

Beitrag von FGB »

Super, vielen Dank!

Also kann man zusammenfassend sagen, dass sofern man ein Output-Register pegelgesteuert verwendet, und mit jenem sowohl lesend als auch schreibend arbeitet, es mit "initial" vorbelegt werden muss?

Das mit dem blocking bzw. non-blocking habe ich jetzt verstanden.
Da ich erst non-blocking verwendet hatte, wurde quasi der inhalt jedes schleifendurchlaufs "simultan" geschrieben. Somit hat sich das alles überlagert und der letzte Schleifendurchlauf stellte somit das Ergebnis.

Wenn ich innerhalb der Schleife nach jeder Zuweisung ein delay eingefügt hatte (z.B. #5;), hatte es geklappt.

Code: Alles auswählen

always@(inB)
   for(c = 1; c < 5; c = c + 1)
      begin
		result <= result + c;
		[b]#5;[/b]
		end

Vielen Dank für deine Hilfe!

robert.n
Nerd
Nerd
Beiträge: 673
Registriert: 29. Sep 2008 19:17

Re: reg Verständnisproblem

Beitrag von robert.n »

FGB hat geschrieben:Super, vielen Dank!

Also kann man zusammenfassend sagen, dass sofern man ein Output-Register pegelgesteuert verwendet, und mit jenem sowohl lesend als auch schreibend arbeitet, es mit "initial" vorbelegt werden muss?
Richtig. Wenn ich es richtig verstanden habe funktioniert das aber nur in der Simulation, weil initial nicht synthetisierbar ist.

Auch aus diesem Grund wird daher fast immer ein Reset-Eingang hinzugefügt.

jonas
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 177
Registriert: 5. Okt 2008 21:35
Wohnort: DA

Re: reg Verständnisproblem

Beitrag von jonas »

Der Punkt ist, dass alles was du lesend verwendest muss irgendwo vorher "gesetzt" also geschrieben werden.

Was soll schon bei "A = B + C" wenn du gar nicht definiert hast wofür Variable B steht?

Und das Problem ist unabhängig davon ob es nun Pegelgesteuert ist oder ob es in einen Ausgang geschrieben werden soll.

Antworten

Zurück zu „Archiv“