2017-11-27 5 views
0

Ich habe einen always Block, wie dieseIn Bezug auf Verilog immer Blöcke

reg [31:0] r1; 

always @(posedge clk) 
    if(condition) begin 
    r1<=32'hcafecafe; 
    end 

sieht, was r1 passiert, wenn die Bedingung falsch ist? Worauf wird es synthetisiert?

Antwort

1

habe ich versucht, zwei verschiedene Synthesizern und beide

Code synthetisiert
reg [31:0] r1 = 32'hcafecafe; 

Das ist nicht das, was ich erwartet hätte, da dieser Code in genau die gleiche Art und Weise wie Ihre RTL verhält sich nicht. In Ihrem RTL ist r1 bis zur ersten Taktflanke mit condition high unbekannt, woraufhin der Wert 32'hcafecafe angenommen wird. Der synthetisierte Ausgang hat vor dieser ersten Taktflanke bereits den Wert 32'hcafecafe. Ich hätte erwartet, dass der Synthesizer-Ausgang 32 aktivierte D-Typ-Flipflops hätte, deren Eingänge an 32'hcafecafe gebunden wären.

+0

Ich vermutete die Frage zu fragen, ob 'condition' an eine Konstante 0 gebunden war und die Freigabe nie wahr ist. In diesem Fall muss "r1" immer noch * etwas * sein und der wahre Zweig des Konditionals scheint eine gute Wahl zu sein. Ich nehme an, dass 0 eine weitere gute Wahl wäre, aber ich denke, dass es zu diesem Zeitpunkt Sache des Compilers ist. –

+0

Das passiert gerade, aber ich möchte, dass das Synthesewerkzeug auf ein Latch zurückgreift. Gibt es eine Möglichkeit, dass das Synthese-Tool eine Verriegelung und nichts anderes schließt? – a220599

+0

@ a220599 Meinst du ein _latch_? Oder ein Flip-Flop? –

1

Das Problem hier ist, dass Sie keine Reset-Bedingung eingestellt haben. Ihr Code sagt, wenn die Bedingung wahr ist, sollte r1 32'hcafecafe sein. Wenn du genau darüber nachdenkst, wenn r1 auf 32'Hcafecafe fixiert ist, erfüllt das Tool das, was du ihm gesagt hast.

Das würde richtige Code so etwas wie diese:

reg [31:0] r1; 

always @(posedge clk) 
    if (sync_reset_b == 1) //synchronous reset 
     r1<=32'h0; // or whatever you want it to be. 
    else if(condition) begin 
    r1<=32'hcafecafe; 
    end 
0

ich ein Synthese-Tool behandelt dies das gleiche wie

reg [31:0] r1 =32'h????????; 

always @(posedge clk) 
    if(condition) 
    r1<=32'hcafecafe; 
    else 
    r1 <= r1; 

glaube Da der Anfangswert eine Pflege nicht weiß, ist, die einzige ein anderer möglicher Wert ist 32'hcafecafe, ist das Synthesewerkzeug frei, um es zu einem konstanten Wert zu synthetisieren.

+0

ableiten Es sollte es so behandeln, aber was es tut ist synthetisieren es zu r1 = 32'hcafecafe (initialisieren Sie das Register auf einen konstanten Wert, anstelle eines Latch oder Flop). – a220599

+0

Das Problem ist Ihr Beispiel Code nicht angibt, was passiert, wenn 'Bedingung' ist falsch. Der Flop, der synthetisiert werden soll, erscheint in einem zufälligen Zustand. Es ist möglich, dass der Zufallszustand 32'hcafecafe entspricht, in diesem Fall könntest du den Unterschied zwischen deinem Ausgang, der von einem Flop kommt, oder der Konstanten, unterscheiden. Sie müssen einen initialen 'r1' -Status angeben, wenn Ihre Technologie dies zulässt, oder ein Reset-Signal hinzufügen, um Ihre Logik in einen Flop zu synthetisieren. –

+0

Die Funktionalität, die ich will, ist wie folgt wenn die Bedingung wahr ist, wird r1 zu 32'hcafecafe initialisiert und es sollte in diesem Zustand bleiben. Sie sagen also, ich sollte den Zustand definieren, wenn die Bedingung falsch ist? – a220599