我们知道在task中是不能直接使用always块语句的,那么该如何在task中实现always的功能呢?
下面分时序逻辑和组合逻辑两种情况分别说明。
1.时序逻辑
如下面代码所示:每一个forever begin-end之间相当于一个always块。fork join保证了所有的always之间的并行运行。
task A();
fork
forever begin
@ (posedge clk);
if(xxxx)
a <= # DLY b;
else
a <= # DLY c;
end
forever begin
@ (posedge clk);
if(xxxx)
d <= # DLY b;
else
d <= # DLY c;
end
join
endtask
2.组合逻辑
如下面代码所示:每一个forever begin-end之间相当于一个always块。fork join保证了所有的always之间的并行运行。区别于always @(*) 这里面是无法使用 @(*)的只能将所有因变信号放到敏感列表之中。
task A();
fork
forever begin
@ (cond or b or c);
if(cond)
a = b;
else
a = c;
end
forever begin
@ (cond or b or c);
if(cond)
d <= # DLY b;
else
d <= # DLY c;
end
join
endtask