2014-03-31 95 views
0

在監視器語句後移除#2重置使代碼無法工作。輸出僅爲0 x。而包括它工作正常。爲什麼?監視器語句verilog

module counter(out,clock,reset); 
input clock,reset; 
wire clock,reset; 
output [3:0]out; 
reg [3:0]out; 
always @(posedge clock or negedge clock) 
begin 
if(reset) 
    out<=1'b0; 
else 
    out<=out+1; 
end 
endmodule 

module tb(); 
reg clock,reset; 
output [3:0]out; 
counter c(out,clock,reset); 
initial 
begin 
    clock=0; 
    reset=1; 
end 
initial 
begin 
    $monitor("%d %d",$time,out); 
    #2 reset=0; 
end 
always 
    #1 clock=~clock; 
initial 
    #100 $finish; 
endmodule 
+0

你爲什麼推斷雙刃翻牌?你是否打算進行異步復位? – Greg

+0

從您的顯示器中刪除$時間,這是否工作?這是有問題的原因是$時間不斷變化,並且$ monitor正在無限調用。 – Russell

+0

另外,您應該只有一個初始塊。其他人應該總是阻止或者可能是fork/join。 – Russell

回答

2

通過消除#2reset創建一個競爭條件:

initial reset = 1; 
initial reset = 0; 

模擬器往往會在編譯順序讀取的reset最後分配的最終值。嘗試合併您最初的塊:

initial 
begin 
    $monitor("%d %d",$time,out); 
    clock=0; 
    reset=1; 
    #2 // <-- optional (and still recommened) if you make the below change 
    // @(clk) //<-- if you truely want a dual edge triggered flip-flop with synchronous reset 
    reset=0; 
end 

雙沿觸發的觸發器非常少見,許多合成和FPGA不支持他們。我猜你正打算在高有效的異步復位時使用負沿觸發器。在這種情況下更換:

always @(posedge clock or negedge clock) 

有:

always @(negedge clock or posedge reset)