我是 雪天鱼,一名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的变量值的情况,所以更重要的还是思维层面的理解。