2013-04-10 14 views
7

Oba poniższe kody generują zegar. Muszę wiedzieć, czy jest jakikolwiek użytek z pętli na zawsze, poza generacją zegara? Na zegarku natknąłem się tylko na zawsze. Jeśli służy to tylko temu celowi, czyż nie jest to bezużyteczne?Użycie twierdzeń zawsze i zawsze

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

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

Odpowiedz

1

Tak forever pętla mają szerokie zastosowanie w hamownie dla weryfikacji projektu, particulalry metodologii standardem branżowym UVM i jego poprzedników (takich jak VMM). Są one używane w komponentach weryfikacyjnych, takich jak sterowniki i monitory, które szeroko wykorzystują zadania w klasach SystemVerilog.

+0

nie jestem zaznajomiony do uVM i VMM ale w Verilog swój bezużyteczny prawo – chitranna

+0

? UVM używa Verilog – toolic

+0

Myślę, że @ new2android oznacza w Verilog RTL dla syntezy.Nigdy nie używałem na zawsze w RTL, ponieważ pętle mogą być używane, ponieważ są rozwijane w czasie kompilacji. – Morgan

6

Twój drugi fragment kodu jest w rzeczywistości błędem składni. Różnica między forever a always polega na tym, że always może istnieć jako "element modułu", który jest nazwą, którą specyfikacja Verilog nadaje konstrukcjom, które mogą być zapisane bezpośrednio w module, a nie zawarte w innych konstrukcjach. initial jest również elementem modułu. always bloki są powtarzane, natomiast bloki initial są uruchamiane raz na początku symulacji.

forever jest instrukcją postępowania, która może być używana tylko w kontekście proceduralnym. Prawidłowe jest więc pisanie initial forever lub always forever, ale nie tylko forever.

Sytuacja, w której forever staje się dość ważna, dotyczy zadań, które są kontekstami proceduralnymi, więc używanie always jest niedozwolone. (Funkcje są również kontekstami proceduralnymi, ale nie mogą zawierać opóźnień, co sprawia, że ​​jest mało prawdopodobne, aby przydały się.

-1

// pokażę różnicę ;;;;;;; // nie możemy użyć zawsze blokować wewnątrz początkowej bloku, ale możemy użyć zawsze blokować wewnątrz pierwsze pytania bloku // kod z błędem.

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