zoukankan      html  css  js  c++  java
  • 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 
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    494. Target Sum 添加标点符号求和
    636. Exclusive Time of Functions 进程的执行时间
    714. Best Time to Buy and Sell Stock with Transaction Fee有交易费的买卖股票
    377. Combination Sum IV 返回符合目标和的组数
    325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组
    275. H-Index II 递增排序后的论文引用量
    274. H-Index论文引用量
    RabbitMQ学习之HelloWorld(1)
    java之struts2的数据处理
    java之struts2的action的创建方式
  • 原文地址:https://www.cnblogs.com/l20902/p/10610903.html
Copyright © 2011-2022 走看看