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高級數字設計