在某个基于Cyclone IV E系列的quartus工程中,整个工程中我写了一段多个字节异或的程序,代码如下。
//对接收的数据作异或处理
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
num_xor <= 8'h0;
xor_done <= 1'b0;
end
else if(pack_done == 1'b1)begin
for(i=0;i<DATA_NUM;i=i+1)begin
num_xor = num_xor ^ pack_data[i];
end
xor_done <= 1'b1;
end
else begin
num_xor <= num_xor;
xor_done <= 1'b0;
end
end
在最后分析和综合整个工程发现,不加上面这段代码,整个工程只消耗了六七百个逻辑单元,加上这段代码后直接飙升到两万四的逻辑单元消耗,已经严重超过了Cyclone IV E系列FPGA的总逻辑单元。quartus界面下方的消息框只报了一些无关紧要的警告。
排查了很久都没发现原因,突然在编译生成报告的Flow Suppressed Messages中看到这么一条警告。意思是在always块中同时包含了阻塞和非阻塞赋值语句。
于是发现上述代码段中最为关键的异或运算语句不是非阻塞赋值<=。
num_xor = num_xor ^ pack_data[i];
改成了非阻塞赋值。
num_xor <= num_xor ^ pack_data[i];
分析综合后占用的逻辑单元恢复到几百个的水平。