不能被綜合的Verilog語言——非靜態迴圈

善樂發表於2016-04-29
   Verilog語言是硬體描述語言,需要綜合成硬體電路。不是所有的行為描述都可以綜合成硬體電路的。
   比如下面的這段程式碼:功能很簡單,完成統計輸入的並行資料中‘1’計數。
module test(
    output reg [2:0] bit_count,
    input [7:0]  data,
    input  clk,
    input  reset
    );
reg [2:0] count,index;
reg [7:0] temp;
always@(posedge clk)begin
    if(reset)begin 
        count = 0;
        bit_count = 0;
       end else begin
        count = 0;
        temp = data;
        for(index=0;|temp;index=index+1)begin
            if(temp[0]) count = count+1;
            temp = temp>>1;
        end
        bit_count = count;
       end
end
endmodule

下面來分析一下上面的例子:用C程式設計的話思路沒有任何問題。程式通過將輸入資料儲存到temp暫存器中,然後對其迴圈右移。判斷temp的LSB來確定是否對bit_count加一。對數字‘1’的計數任務原則上應該是組合邏輯完成的任務。但是組合邏輯卻不能在一個迴圈內完成多個迴圈任務。而且對不同的資料輸入迴圈的次數是不確定的。但是上面的程式碼模擬是可以通過的,波形也可以達到預期的結果。但是程式碼是不可被綜合。
總結:當在一個行為模組裡嵌入for迴圈的組合邏輯,或著當迴圈的此次不能被確定時,不能被綜合成硬體電路。
材料來源:Verilog高階數字設計

相關文章