2013-04-10 35 views
7

下面的代碼都會生成一個時鐘。我需要知道是否有任何使用永久循環,而不是時鐘生成?我只在時鐘世代中遇到過。如果它只是爲了達到這個目的,是不是沒用?使用永久和總是語句

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

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

回答

1

是,forever循環在測試平臺設計驗證廣泛使用,particulalry在行業標準方法,UVM,和它的前輩(例如VMM)。它們用於驗證組件,如驅動程序和監視器,它們廣泛使用SystemVerilog類中的任務。

+0

我並不熟悉的UVM和VMM但是,用Verilog它沒什麼用權 – chitranna 2013-04-10 23:34:25

+0

? UVM使用Verilog – toolic 2013-04-10 23:36:01

+0

我認爲@ new2android意味着在Verilog RTL中進行綜合,我從來沒有在RTL中使用過,因爲循環可以在編譯時展開使用。 – Morgan 2013-04-11 09:04:05

6

你的第二個代碼片段實際上是一個語法錯誤。 foreveralways之間的區別在於always可以作爲「模塊項目」存在,它是Verilog規範給出的結構名稱,可以直接在模塊內編寫,不包含在其他結構中。 initial也是一個模塊項目。 always塊重複,而initial塊在模擬開始時運行一次。

forever是一個程序性聲明,只能在程序上下文中使用。因此,編寫initial foreveralways forever是合法的,但不僅僅是forever

forever變得相當重要的情況在程序上下文的任務內,因此不允許使用always。 (函數也是程序上下文,但不一定包含延遲,這使得forever不可能有用。

-1

//我將顯示區別;;;;;;; //我們不能使用初始塊內永遠阻斷,但我們可以用永久的阻塞INTIAL塊內部錯誤 //代碼:

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