2012-10-30 48 views
0

我試圖執行以下代碼:Verilog的爭用下一個信號

reg [7:0] next_busy; 

always @* begin 
    next_busy = busy; //default assignment 

    if (condition determined by module input) begin 
     next_busy[0]= 1'b1; 
    end 
end //always @* 

always @(posedge clock) begin 
    if (reset) begin 
     busy <= 8'b0; 
    end else begin 
     busy <= next_busy; 
    end 
end //always @(posedge clock) 

這工作在模擬正常,但在合成似乎有某種爭的next_busy信號。也就是說,如果忙碌不是1(比如上一個週期有復位),那麼它會輸出一個x(如果滿足輸入條件)。然而,如果繁忙已經是1(並且滿足輸入條件),則next_busy被正確地分配1。所以我只是想知道是否有一個正確的方法來做我想做的事情,以便它也可以用於綜合?

+0

您的代碼看起來好像沒什麼問題。在門級仿真中,你看到了哪些爭用?你在那個模塊的其他地方分配了'next_busy'嗎?在合成日誌中是否有提到該信號的警告消息。 – Marty

回答

0

您通常在觸發器的靈敏度列表中包含重置。對於低電平有效復位always @(posedge clock or negedge reset)

在示例中提供的忙沒有定義,假設它是reg [7:0] busy;

我會沿着線實現:

reg [7:0] busy; 

always @(posedge clock or negedge reset) begin 
    if (reset == 1'b0) begin 
     busy <= 8'b0; 
    end 
    else if (condition determined by module input) begin 
     busy[0] <= 1'b1; // busy <= 8'b1; 
    end 
    else begin 
     busy <= next_busy; 
    end 
end //always @(posedge clock) 
+0

該操作可能需要同步重置? – Marty

+0

他們可能會,但我總是會包含初始化的重置。 – Morgan