Verilog基础:task和function的使用(二)

张开发
2026/4/3 14:33:57 15 分钟阅读
Verilog基础:task和function的使用(二)
相关文章Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html四、function的声明和使能function的用途就是返回一个值然后把他用在表达式中即作为操作数使用。1、function的声明function的声明的语法如下:function声明的说明1、第一种是Verilog-1995的语法输入参数和函数内项目都在function_identifier;后面声明。2、第二种是Verilog-2001的语法输入参数在function_identifier();括号内部声明而函数内项目在function_identifier();后面声明这是ANSI-C风格的声明。3、可以在function内的所有语句之前声明各种类型的变量reg、integer、time、real、realtime需要注意的是变量类型是块级的所以不能像非块级变量那样赋初值。parameter、local parameter以及event也是支持的声明的。4、没有使用automatic的function是静态的(Static)所有在function中声明的输入参数和函数内项目都是静态分配内存的对于所有并发执行的同一个function他们是共享的。5、使用automatic的function是动态的可重入的仿真器为每个并发执行的function动态地分配内存。6、function_range_or_type用于声明返回值的类型它是可选的。如果没有说明那么默认返回1位标量如果说明则返回值的类型可以是[range][signed]、integer、time、realtime、real。7、function应至少有一个input参数。2、function的返回值在定义function时同时在function内部隐含地声明了一个和function名字一样的变量。它默认是1位的reg或是用function_range_or_type指定的当function返回时就把这个变量返回就像Verilog中的函数和C语言里面的函数一样如下所示。module test; reg a; function test_function(input b); $display(This is a function); test_function 1; endfunction initial a test_function(a); // 正确 initial test_function(a); // 正确 endmodule3、function的使能注意其中使用的是层次function名这意味着在定义一个function的模块外也是可以调用该function的只要它能够在使用处利用层次名引用到详见该文Verilog基础标识符的层次名引用一。函数调用被当做表达式中的操作数使用。函数调用时输入参数的计算顺序是不定的。4、function的限制与task相比function有许多限制下面是function的使用规则。1、function的定义不能包含任何时序控制的语句即不能包含#、和wait。因为function的参数输入计算、返回都是在一个time-step完成的。2、function不能使能task因为task中可能含有时序控制。3、function至少包含一个input参数。4、function不能包含任何output和inout参数。5、function中不能使用非阻塞赋值,不能使用过程连续赋值。6、function内不能触发命名事件。5、常数函数常数函数是Verilog-2001标准新加的用于在elaboration时计算复杂的的值。常数函数要求综合和仿真工具在编译时就计算出函数的返回值。常数函数对IP开发非常重要目的是允许设计人员为一个模块添加local parameters这些local parameters是在模块实例化时传递的参数得来的。让我们考虑一个简单的RAM模型为了使这个模型参数化我们需要地址的宽度、存储的深度和数据的宽度。数据的宽度必须传递给模型但对于地址的宽度和存储的深度就只需要传递一个即可。如果传递地址的宽度那么存储的深度可以通过常数函数计算出来如果传递存储的深度则地址的宽度可以通过常数函数计算出来。为了让工具厂商更加接受常数函数Verilog标准化组织Verilog Standard GroupVSG在常数函数上加了明显的约束而在常规函数上就没有这些约束。常数函数是常规函数的子集具有以下的要求。1、常数函数不能包含层次引用。2、常数函数在调用模块内定义且参数是常数。3、常数函数能调用参数为常数表达式的系统函数而不能调用其他系统函数。4、常数函数将忽略系统任务。5、任何常数函数会使用到的parameters都要提前定义。6、常数函数使用的parameters不能直接或间接被defparam影响。7、不能在generate块中声明常数函数。

更多文章