想把 a,b的和 延时12ns后赋值给c, a,b分别在 0 、10ns变化
initial begin
a = 0;
b = 0;
#10
a = 1;
end
c 只有非阻塞式右延时可以实现完全的跟踪 ,分别在12ns从x变为0, 22ns变为1
always @(a or b)
c <= #12 a+b;
或者
always @(a or b or temp)begin
temp <= #12 a+b;
c <= temp
end
或者
always @(a or b or temp)begin
temp <= a+b;
c <= #12 temp
end
阻塞赋值是执行完一条再执行下一条,本条没有执行完,不会执行下一条,包括敏感信号在内,也是循环执行的
下面的情况只会在 12ns时赋值为 10ns 时刻的结果
阻塞式或者非阻塞式 左赋值
1>
always @(a or b)
#12 c <= a+b;
2>
always @(a or b or temp)begin
#12 temp <= a+b;
c <= temp;
end
3>
always @(a or b)
#12 c = a+b;
4>
always @(a or b)begin
#12
c = a+b;
end
下面的情况只会在 12ns时赋值为 0 时刻的结果
阻塞式右赋值
1>
always @(a or b)
c = #12 a+b;
2>
always @(a or b)begin
temp = a+b;
#12
c = temp;
end
下面的情况只会在ab都稳定后的22秒才会赋值
assign #12 c = a + b;
而下面的情况编译直接报错
assign c = #12 a + b;
参考:Verilog语言设计延时的正确方法 - 百度文库,但是assign部分的内容不对
https://www.cnblogs.com/soony/p/14666159.html
阻塞赋值 是 begin - end 之间的语句 顺序执行,然后重新 always 卡住
非阻塞赋值 是 begin - end 之间的语句 并行执行,然后重新 always 卡住