下面的代碼都會生成一個時鐘。我需要知道是否有任何使用永久循環,而不是時鐘生成?我只在時鐘世代中遇到過。如果它只是爲了達到這個目的,是不是沒用?使用永久和總是語句
initial begin
clk = 0;
forever begin
#5 clk = ~clk;
end
end
initial begin
clk = 0 ;
always begin
# 5 clk = ~clk;
end
end
下面的代碼都會生成一個時鐘。我需要知道是否有任何使用永久循環,而不是時鐘生成?我只在時鐘世代中遇到過。如果它只是爲了達到這個目的,是不是沒用?使用永久和總是語句
initial begin
clk = 0;
forever begin
#5 clk = ~clk;
end
end
initial begin
clk = 0 ;
always begin
# 5 clk = ~clk;
end
end
是,forever
循環在測試平臺設計驗證廣泛使用,particulalry在行業標準方法,UVM,和它的前輩(例如VMM)。它們用於驗證組件,如驅動程序和監視器,它們廣泛使用SystemVerilog類中的任務。
你的第二個代碼片段實際上是一個語法錯誤。 forever
和always
之間的區別在於always
可以作爲「模塊項目」存在,它是Verilog規範給出的結構名稱,可以直接在模塊內編寫,不包含在其他結構中。 initial
也是一個模塊項目。 always
塊重複,而initial
塊在模擬開始時運行一次。
forever
是一個程序性聲明,只能在程序上下文中使用。因此,編寫initial forever
或always forever
是合法的,但不僅僅是forever
。
forever
變得相當重要的情況在程序上下文的任務內,因此不允許使用always
。 (函數也是程序上下文,但不一定包含延遲,這使得forever
不可能有用。
//我將顯示區別;;;;;;; //我們不能使用初始塊內永遠阻斷,但我們可以用永久的阻塞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
我並不熟悉的UVM和VMM但是,用Verilog它沒什麼用權 – chitranna 2013-04-10 23:34:25
? UVM使用Verilog – toolic 2013-04-10 23:36:01
我認爲@ new2android意味着在Verilog RTL中進行綜合,我從來沒有在RTL中使用過,因爲循環可以在編譯時展開使用。 – Morgan 2013-04-11 09:04:05