2013-07-12 35 views
0

這裏我有Verilog代碼:執行總是阻止以Verilog

module test; 
    reg  wr, rd; 
    reg  clk, en; 
    integer count=1; 

    initial begin 
    clk = 0; 
    forever #5 clk=~clk; 
    en = 0; 
    #5 en = 1; 
    forever #10 en=~en; 
    end 

    always @(posedge clk && posedge en) begin //<-- Error here 
    if(count %2 == 1) begin 
     wr=1; 
     $display("writing"); 
    end 
    else begin 
     rd=1; 
     $display("reading"); 
    end 
    end 
endmodule 

該程序示出錯誤的行#14。當「clk」和「en」都處於高電平時,我想執行「always block」。但它不起作用。

有什麼建議。

+1

你好,如果你能接受最準確地解決你的問題的答案,或者如果你以另一種方式解決問題,請添加你自己的答案。贊同其他有用的答案也將不勝感激,並歡迎來到Stackoverflow :) – Morgan

回答

0

,如果你只是檢測陽性邊緣的區塊內CLK和測試,如果EN = 1是什麼?這是做一個正常的方式......你應該有一個主時鐘和測試塊

always @(posedge clk) 
begin 
    if (en==1'b1) 
    begin 
     if(count %2 == 1) 
     begin 
      wr=1; 
      $display("writing"); 
     end 
     else 
     begin 
      rd=1; 
      $display("reading"); 
     end 
    end 
end 
+0

謝謝:)我得到了答案.. :) –

1

你使用的語法非常接近法律的語法,但並非您的本意內的其他信號!

保換&&or

always @(posedge clk or posedge en) 

這將觸發CLK,也觸發連接,這使得en異步信號。在數字設計中應該非常小心地處理異步信號。

正如@nio建議你真正想要做的是在clk上觸發,然後檢查enable是否高。

always @(posedge clk) begin 
    if (en == 1'b1)  begin 
    .. 
    end 
end 

的一項福利,只要沒有else條款,這是由綜合工具,支持自動時鐘門控插入使用很大的語法。

+0

謝謝你:) ...我得到了答案.. –