verilog+systemVerilog写代码bug总结

前言

此文用来记录我在写verilog项目时遇到的bug,方便回顾,也供大家参考。
语言:verilog、systemverilog
平台:vivado 2021.01

bug记录和解决

  1. 如何让计数从0开始,而不是从1开始?

情景描述:我现在要实现这样一个功能,当sparse_row的值变化时,csr_value_out的值也立马变化,如下图所示:
在这里插入图片描述
但是出现了一个bug,csr_value_out的值的变化总比sparse_row慢一拍,如下图所示:
在这里插入图片描述
也就是说,出现这个bug的原因是下面的这种代码逻辑:

always_ff @(posedge clk or negedge rst)begin
	if (!rst)......
	else .....//改变csr_value_out的值
end

always_ff @(posedge clk or negedge rst)begin
	if (!rst)......
	else .....//改变sparse_row的值
end

解决办法是:csr_value_out的改变用组合逻辑不用时序逻辑。用时序逻辑的好处是,一旦检测到sparse_row的值的变化,则csr_value_out的值也会立马变化,不会延迟一拍。【此解决办法来自于评论区的一个大佬,感谢大佬👍】

always_ff @(posedge clk or negedge rst)begin
	if (!rst)......
	else .....//改变sparse_row的值
end
always_comb begin
	if (!rst)......
	else .....//改变csr_value_out的值
end

此bug解决。总结:如果B信号的变化依赖于A信号,也就是一旦A信号变化,B信号也要立马变化,则B信号的实现用组合逻辑。

  1. 如何让数据改变在时钟来临之前从0开始计数?
    情景描述:假设现在做了一个加法器,代码如下所示:
always_ff @(posedge clk or negedge rst)begin
	if (!rst)begin
		count<=0;
	end
	else begin
		count<=count+1;
	end
end

上面这段代码在波形图中可以看到,当clk信号有效后,count立马变成1,而不是0。但是现在有业务要求count在clk有效后从0开始计数,那应该怎么实现呢?
答案就是浪费一个时钟周期,具体代码如下:

interger reset_done;
always_ff @(posedge clk or negedge rst)begin
	if (!rst)begin
		count<=0;
		reset_done<=0;
	end
	else begin
		if (reset_done==0)begin
			reset_done=1;
		end
		count<=count+1;
	end
end

上面这段代码,在reset无效,clk有效的第一个时钟周期,是用来改变reset_done的值的,此时恰好保障了count保持一个时钟周期的0,也实现了count在clk有效后从0开始计数的逻辑。

暂时写到这,后面再补充。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值