规则:
- 若用于任务中的命名变量或参数没有在任务块中声明,则指的是在模块中声明的命名变量或参数。
- 任务中的input,output和inout的个数不受限制(也可以为零个)。
- 任务中的变量(包括输入和双向端口(inout)可以声明为寄存器型。如果没有明确地声明,则默认为寄存器型,且位宽与相应的变量匹配。
- 在启动任务时,相应于任务的输入和双向端口(inout)的变量表达式的值被存入相应的变量寄存器中。当任务结束时,输入和双向端口(inout)的变量寄存器中的值又被代入启动任务的语句中相应的表达式。
注意:
- 和模块的端口定义不一样,任务的变量不能在任务名后的括号定义。
- 任务中若包括一句以上的语句,必须要用begin-end或者fork-join将其包含成块。
- 任务的输入、双向端口(inout)、输出和局部寄存器的值都是静态储存的,也就是说,即使多次启动任务,也只有一份寄存器的复制。若第一次启动的任务还未完成,则第二次启动该任务,其输入、双向端口(inout)、输出和局部寄存器的值便会被覆盖。
- 当被启动的任务运行结束时,输出和双向端口的值被代入任务中相应的寄存器表达式。如果任务中的输出和双向端口在赋值后有时间的控制,则相应的寄存器只能在时序控制延迟后才被更新。
- 同样,对输出和双向端口寄存器变量的非阻塞值语句也不会起作用,因为当任务返回时,赋值语句可能还未生效。
可综合性问题:
包含时序控制语句的任务时不可综合的。启动的任务往往被综合成组合逻辑。
利用task和电平敏感的always快设计经比较后重组