task和function主要是有助于代码的可重用性,都可以在module-endmodule之外声明。
1.function
1.1.function逻辑的综合
function:一个只有1个wire型输出值、全是组合逻辑的函数,且函数名即输出信号名,小括号中按顺序例化输入信号。
由于function中没有任何时序结构,function只能综合出组合逻辑。
1.2.function的使用
①因function全为组合逻辑,即if-else、case等分支应定义完全,避免生成latch。
②fucntion只用于综合成组合逻辑。但是,fucntion的最终结果可以用作D触发器的输入。
③fucntion不应包括延迟(#)或事件控制(@,wait)语句。
④fucntion可以调用其他fucntion,但不能调用task。
⑤fucntion在调用时会返回一个值。
⑥fucntion内声明的parameters,作用范围仅在本地,并且不能在fucntion之外使用。
2.task
2.1.task逻辑的综合
虽然在task中可以有@等时序控制结构中,它仅适用于仿真。综合工具会忽略所有task中的时序结构。因此,如果task中存在时序控制结构,可能会存在仿真和综合不匹配的现象。
因此,在可综合verilog中一般只会使用task综合基本的组合逻辑,在testbench中调用带有时序控制结构的task具有较好的通用性。
以下是组合逻辑task的示例,即comb_task,执行输入in1的位或(OR)。 注意int_out1和int_out2的声明是reg型,因为task的输出只能通过reg而不是wire接收:
2.2.task和module的区别
①不能在task中例化module,可以在module中调用task。
②Task中的逻辑不能够在floorplan中定义为block进行pre_place布局,只是sea-of-gates;而Module可以在floorplan中定义为block,进行pre_place。