记录verilog的阻塞与非阻塞赋值踩到的坑

在某个基于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];

分析综合后占用的逻辑单元恢复到几百个的水平。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值