2010-05-04 75 views
1

我具有低於輸出不更新,直到下一個時鐘週期

always @(posedge Clk) begin 

ForwardA = 0; 
ForwardB = 0; 

//EX Hazard 
if (EXMEMRegWrite == 1) begin 
if (EXMEMrd != 0) 
    if (EXMEMrd == IDEXrs) 
     ForwardA = 2'b10; 
    if (EXMEMrd == IDEXrt && IDEXTest == 0) 
     ForwardB = 2'b10; 
end 


//MEM Hazard 

if (MEMWBRegWrite == 1) begin 
if (MEMWBrd != 0) begin 
    if (!(EXMEMRegWrite == 1 && EXMEMrd != 0 && (EXMEMrd == IDEXrs))) 
      if (MEMWBrd == IDEXrs) 
       ForwardA = 2'b01; 
    if (IDEXTest == 0) begin 
     if (!(EXMEMRegWrite == 1 && EXMEMrd != 0 && (EXMEMrd == IDEXrt))) 
      if (MEMWBrd == IDEXrt) 
       ForwardB = 2'b01; 
    end 
end 
end 

end 

代碼模塊的問題是輸出,該輸出是ForwardA和ForwardB沒有不更新在上升時鐘沿,而不是下一個上升時鐘邊緣...這是爲什麼?我該如何解決,以便輸出在相同的正上升時鐘邊沿上更新?

這裏就是我的意思是: alt text http://img693.imageshack.us/img693/8660/timing.jpg

ForwardA與2在下一個時鐘上升沿,而不是在同一個時鐘上升沿

+1

對不起很挑剔,但是你的意思是「不是在不是上升的時鐘沿而是在下一個上升的時鐘沿上更新」?你想刪除其中一個不是? (我應該是更重要的事情,但它是我的決賽周,我真的不應該現在在StackOverflow,lol) – 2010-05-05 01:48:48

+0

如果你看圖片,並看看ForwardA信號... 2更新在下一個上升時鐘邊緣...我希望它在黃色線的上升時鐘邊緣更新,因爲在黃色線EXMEMrd == IDEXrs ...我希望這是有道理的 – aherlambang 2010-05-05 03:09:18

回答

2

我期望這個操作更新。這完全取決於你的輸入信號如何被驅動。你必須記住,如果你從一個時鐘啓動某些東西,那麼其他時鐘模塊在下一個時鐘沿之前不會看到它,儘管在你的波形查看器中看起來很重要。

考慮到發生的事情的真相很有幫助。一旦你從時鐘邊緣發起一些事情,這不會馬上發生,會有一點延遲。你不會在RTL sim波形中看到這些小的延遲,但它們以delta循環的形式存在。

 1    2    3 
     ______  ______ 
clk __|  |______|  |______| 

q ----<======A======X=======B======X==== 

n1 -----<====A+1======X======B+1=====X=====  (combinatorial/logic) 
n2 ------------------X======A+1=====X=====B+1  (sequential/clocked) 

如果你看看我相當高明的ASCII藝術上面,q被設置爲「B」的時鐘邊沿2,但它需要時間,這個傳播。任何@(posedge clk)塊在時鐘邊沿2將看到'A'的值爲q,它將不會在下一個邊緣看到'B'。3.這看起來像是您看到的。

雖然你幾乎可以立即產生一個信號,如果這是你需要的。但要做到這一點,你需要使用組合邏輯(上面的n1)。

wire n1; 
assign n1 = q + 1; 

reg n1; 
always @(*) 
    n1 = q + 1; 

使用順序邏輯(如你是):

reg n2; 
always @(posedge clk) 
    n2 <= q + 1; 

注意 '< ='。這是一個非阻塞的任務 - 建議使用它來分配您想要在您的設計中註冊或拖放的內容。請閱讀Sunburst Design論文,以獲得更好的解釋。

+0

但要做到這一點,我需要有總是在塊內分配,這是不可能的......因爲在你上面的例子中..我想要n1是q + 1或q + 2,這取決於if語句的結果......所以這怎麼可能? – aherlambang 2010-05-05 13:20:47

+4

最簡單的辦法是將'always @(posedge Clk)'改爲'always @(*)',將上面的時鐘塊更改爲組合塊。你沒有任何非阻塞任務,所以我不認爲你需要改變其他任何東西。給它一個旋風,讓我知道... 但是你是否真的需要立即使用'ForwardA'和'ForwardB'的新值? – Marty 2010-05-05 13:44:37

+0

沒錯,只要總是將(posedge clk)永遠改變爲@ *,就可以讓EquinoX完全符合他所期待的行爲。 – Stan 2010-05-06 21:14:44