2012-04-25 32 views
1

考慮代碼如下:總是阻止事件列表,如果變量用於類似於生成的語句

reg [2:0] cnt; 
    // a is an input (say 4 bit) to design and being assigned after some manipulation 
    // to some other variable 

    always @(a) 
     for (cnt = 0; cnt < 4; cnt = cnt+1) begin 
      //some operation involving a [bitwise] 
     end 

現在你可以看到我並沒有包括在事件列表CNT的總塊作爲CNT不引用/分配的外部始終阻止,並完全迭代通過for循環

我的問題是我應該cnt事件列表?

回答

4

always塊的靈敏度列表的工作方式是,一旦某個輸入發生變化,always塊將執行,直到達到結尾,然後它將等待靈敏度列表中的另一個更改。

在你的情況下,如果你改變a,它應該運行你的for循環的所有4個循環,然後完成,所以在靈敏度列表中有cnt不是必需的。

這就是說,我很難想象這種邏輯應該是合成的。你的for循環是應該計時的東西,還是打算立即執行?

+0

謝謝@Tim,我不會這樣編碼。我正在驗證別人的代碼,但不確定。在任何情況下,for循環假設創建相同硬件的多個副本(它不是時鐘並且應該同時執行)。 – wisemonkey 2012-04-25 23:49:20

+0

@wisemonkey在這種情況下,我認爲那裏的代碼示例沒有任何問題。 – Tim 2012-04-25 23:54:27

+0

我同意這看起來不錯。我總是使用@ *並避免缺少來自敏感列表的參數。 – Morgan 2012-04-26 01:18:04

2

添加答案以允許代碼示例: 使用@ *完成敏感性列表並檢查不必要的觸發。

integer cnt; 
integer loop_cnt = 0; 
reg [3:0] b; 

always @* begin 
    $display("%t : Loop Count ",$realtime, loop_cnt); 
    loop_cnt = loop_cnt + 1; 
    for (cnt = 0; cnt < 4; cnt = cnt+1) begin 
    b[cnt] = one_bit_data ; 
    end 
end 

是一樣的:

integer cnt; 
integer loop_cnt = 0; 
reg [3:0] b; 

always @(one_bit_data) begin 
    $display("%t : Loop Count ",$realtime, loop_cnt); 
    loop_cnt = loop_cnt + 1; 
    for (cnt = 0; cnt < 4; cnt = cnt+1) begin 
    b[cnt] = clk ; 
    end 
end 

運行兩者的時間和次數應匹配。如果有額外的觸發,計數將會高出四倍。

相關問題