【Verilog】always块计算是取触发时刻的值

我是 雪天鱼,一名FPGA爱好者,研究方向是FPGA架构探索和数字IC设计。

关注公众号【集成电路设计教程】,获取更多学习资料,并拉你进“IC设计交流群”。
QQIC设计&FPGA&DL交流群 群号:866169462

always块计算是取触发时刻的值

每个 always 块被触发时,里面 reg变量的赋值计算用的是所涉及到的变量触发时刻的值,不受同时触发的其他 always 计算结果影响。
举例:

module delay_test(
	input clk,
	input rstn
);
	reg[7:0] a,b,c;
	
	always@(posedge clk)
	begin
		if(!rstn)
		begin
			a <= 8'd0;
		end
		else  
		begin
			a <= 8'd2;
		end
	end
	
	always@(posedge clk)
	begin
		if(!rstn)
		begin
			b <= 8'd0;
		end
		else if(a == 8'd2)
		begin
			b <= 8'd3;
		end
	end
	
	always@(posedge clk)
	begin
		if(!rstn)
		begin
			c <= 8'd0;
		end
		else if(b == 8'd3)
		begin
			c <= 8'd4;
		end
	end
	
endmodule

可以看到一共有三个always块,分别对 a,b,c进行赋值,当 a = 2会将b置为3,当b=3时会将c置为4。那么当有上升沿将 a 置为了2,此时 b,c会同步置为3和4吗?
答案是不会。仿真结果如下所示(vivado2019.3);

可以当 a 变为2时,该上升沿,b和c保持原值;下一个上升沿b变为3,c保持原值;再下一个上升沿c变为4。即always快内变量的计算只和触发时刻的所涉及的变量值有关,而与其他always块该上升沿所计算的结果无关。
换句话,即所有always都是并行执行的,不会出现一个always块计算完,拿它的计算结果去计算另一个always的变量值的情况,所以更重要的还是思维层面的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪天鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值