• 4.3 verilog中的function用法与例子


    函数的功能和任务的功能类似,但二者还存在很大的不同。在 Verilog HDL 语法中也存在函数的定义和调用。 

    1.函数的定义 
    函数通过关键词 function 和 endfunction 定义,不允许输出端口声明(包括输出和双向端口) ,但可以有多个输入端口。函数定义的语法如下: 
    function [range] function_id; 
       input_declaration 
       other_declarations 
       procedural_statement 
    endfunction

    其中,function 语句标志着函数定义结构的开始;[range]参数指定函数返回值的类型或位宽,是一个可选项,若没有指定,默认缺省值为 1 比特的寄存器数据;function_id 为所定义函数的名称,对函数的调用也是通过函数名完成的,并在函数结构体内部代表一个内部变量,函数调用的返回值就是通过函数名变量传递给调用语句;input_declaration 用于对寒暑各个输入端口的位宽和类型进行说明,在函数定义中至少要有一个输入端口;endfunction为函数结构体结束标志。

    下面给出一个函数定义实例。定义函数实例。 
    function  AND;   //定义输入变量 
    input A, B; //定义函数体 
    begin 
       AND = A  && B; 
    end 
    endfunction

    函数定义在函数内部会隐式定义一个寄存器变量, 该寄存器变量和函数同名并且位宽也一致。函数通过在函数定义中对该寄存器的显式赋值来返回函数计算结果。此外,还有下列几点需要注意: 
    (1)函数定义只能在模块中完成,不能出现在过程块中; 
    (2)函数至少要有一个输入端口;不能包含输出端口和双向端口; 
    (3) 在函数结构中, 不能使用任何形式的时间控制语句 (#、 wait 等) , 也不能使用 disable中止语句; 
    (4)函数定义结构体中不能出现过程块语句(always 语句) ; 
    (5)函数内部可以调用函数,但不能调用任务。 

    2.函数调用 
    和任务一样,函数也是在被调用时才被执行的,调用函数的语句形式如下: 
    func_id(expr1, expr2, ........., exprN) 
    其中,func_id 是要调用的函数名,expr1, expr2, ......exprN是传递给函数的输入参数列表,该输入参数列表的顺序必须与函数定义时声明其输入的顺序相同。下面给出一个函数调用实例。

    函数调用实例。 

    module comb15 (A, B, CIN, S, COUT);  
    input [3:0] A, B; 
    input CIN; 
    output [3:0] S; 
    output COUT; 
    wire [1:0] S0, S1, S2, S3; 
    
    function signed [1:0] ADD; 
    input A, B, CIN;
    reg S, COUT; 
    begin 
    S = A ^ B ^ CIN; 
    COUT = (A&B) | (A&CIN) | (B&CIN); 
    ADD = {COUT, S}; 
    end 
    endfunction 
     
    assign S0 = ADD (A[0], B[0], CIN), 
    S1 = ADD (A[1], B[1], S0[1]), 
    S2 = ADD (A[2], B[2], S1[1]), 
    S3 = ADD (A[3], B[3], S2[1]), 
    S = {S3[0], S2[0], S1[0], S0[0]}, 
    COUT = S3[1]; 
    endmodule

    在函数调用中,有下列几点需要注意: 
    (1)函数调用可以在过程块中完成,也可以在 assign 这样的连续赋值语句中出现。 
    (2)函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数。
    --------------------- 
    作者:a14730497 
    来源:CSDN 
    原文:https://blog.csdn.net/a14730497/article/details/8032804 
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    【LeetCode】589.N叉树的前序遍历(递归+迭代,java实现,详细分析)
    百度网盘偷偷更新,终于实现免费不限速了!
    如何调整DOS窗口的宽高
    输入adb shell 时 提示error: more than one device and emulator
    logcat不显示信息
    安卓打开File Explorer里面不显示内容
    android查看源码的时候看不了
    This version of the rendering library is more recent than your version of ADT plug-in. Please update
    eclipse或者AS链接手机真机之后,logcat里面日志信息乱跳
    Android ADB使用之详细篇
  • 原文地址:https://www.cnblogs.com/l20902/p/10610903.html
Copyright © 2020-2023  润新知