2013-04-10 17 views
7

Entrambi i seguenti codici generano un orologio. Devo sapere se c'è un uso del ciclo per sempre diverso dalla generazione di clock? Mi sono imbattuto per sempre nella generazione dell'orologio. Se serve solo a questo scopo, non è inutile?Uso di sempre e sempre dichiarazioni

initial begin 
clk = 0; 
forever begin 
#5 clk = ~clk; 
end 
end 

initial begin 
clk = 0 ; 
always begin 
# 5 clk = ~clk; 
end 
end 

risposta

1

Sì, forever loop hanno diffuso utilizzo in testbench per verifica della progettazione, particulalry nella metodologia standard di settore, UVM, ei suoi predecessori (come VMM). Sono utilizzati in componenti di verifica come driver e monitor che fanno ampio uso di compiti nelle classi SystemVerilog.

+0

non sono così familiare a UVM e VMM ma, in Verilog sua abbastanza inutile giusto – chitranna

+0

? UVM utilizza Verilog. – toolic

+0

Penso che @ new2android significhi in Verilog RTL per la sintesi. Non ho mai usato per sempre in RTL, perché i loop possono essere utilizzati mentre vengono srotolati in fase di compilazione. – Morgan

6

Il tuo secondo snippet di codice è in realtà un errore di sintassi. La differenza tra forever e always è che always può esistere come "elemento del modulo", che è il nome che la specifica Verilog fornisce ai costrutti che possono essere scritti direttamente all'interno di un modulo, non contenuti in alcun altro costrutto. initial è anche un elemento del modulo. I blocchi vengono ripetuti mentre i blocchi initial vengono eseguiti una volta all'inizio della simulazione.

forever è una dichiarazione procedurale che può essere utilizzata solo in un contesto procedurale. Quindi è legale scrivere initial forever o always forever, ma non solo forever.

La situazione in cui forever diventa piuttosto importante è all'interno delle attività, che sono contesti procedurali, quindi l'uso di always non è consentito. (Le funzioni sono contesti procedurali pure, ma non possono contenere i ritardi, il che rende improbabile che forever verrà in utile.

-1

// Vi mostrerò la differenza ;;;;;;; // non possiamo usare il sempre bloccare all'interno del blocco iniziale, ma possiamo usare per sempre bloccare all'interno del blocco intial // codice con errore:.

module stimulus(output reg a,b); 

initial 
begin 
    a = 1'b1; 
    b = 1'b0; 

    always 
    begin 
    #5 a = ~a;   //error when compiling 
    #6 b = ~a; 
    end 

end 

initial 
    #25 $stop; 

endmodule 




    // code with no error 
module stimulus(output reg a,b); 

initial 
begin 
    a = 1'b1; 
    b = 1'b0; 

    always 
    begin 
    #5 a = ~a; //no error when compiling 
    #6 b = ~a; 
    end 

end 

initial 
    #25 $stop; 

endmodule 
Problemi correlati