2012-12-12 71 views
2

我似乎自己編寫成一個無限循環,要麼或的ModelSim不知道要如何處理這個while循環的條件做:停留在while循環的Verilog

i = 0; 
while(i < 8'b01100100 && !(mem[i] == RC)) begin 
    i <= i + 1; 
end 

仿真只是不能讓過去在這個while循環中的條件行,任何人都可以指向我做錯了什麼?

-edit: ,其保持在while循環的代碼的一部分:

//if remove credential enable is high 
if(RCE == 1'b1) begin 
    $display ("%d", RC); 
    $display ("%d", mem[i]); 
    $display ("%b", !(mem[i] == RC)); 
    while(i < 8'b01100100 && mem[i] != RC) begin 
     i <= i + 1; 
    end 
    if(i < 8'b01100100) begin 
     mem[i] <= 24'b111111111111111111111111; 
    end else begin 
     //do nothing 
    end 
    i = 0; 
    end else begin 
     //do nothing 
    end 

這部分的總是與posedge時鐘和posedge RST的靈敏度列表框的內部。

+0

「我」有多少位?如果文件不是太大,你可以發佈整個文件嗎? – Tim

+0

我是8位寬,整個代碼長度爲194行...如果你需要更多的代碼,我很高興做義務 – user1475941

+0

有一條線'i = 0;'這是爲了在那裏。對於綜合,你應該能夠展開你的循環,我不明白這是如何工作在你當前的代碼。 – Morgan

回答

2

您需要在while循環中使用阻塞賦值而不是非阻塞賦值(請參閱How to interpret blocking vs non blocking assignments in Verilog?)。

活動事件處理完成後,將更新非阻塞分配計劃i。但是,活動事件處理將永遠不會完成,因爲while條件將繼續評估爲true。

或者,您可以在while循環中添加延遲:@(posedge clk) i <= i + 1

+0

我已經做了更多的編輯澄清我的代碼,如果這有幫助... – user1475941

+0

我仍然認爲NBA是問題所在,你是否嘗試了'i = i + 1'而不是?雖然一般的規則是在邊緣敏感的塊中使用NBAs,但是對於不可合成的代碼,該規則並不總是有效的,就像你所顯示的那樣。 – Andy