函数的功能和任务的功能类似,但二者还存在很大的不同。在 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)函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数。

verilog中function的使用的更多相关文章

  1. system verilog中的跳转操作

    在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...

  2. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

  3. 一段比较有意思的代码——介绍system verilog中的新增幅值语句

    system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...

  4. jQuery中$(function(){})与(function($){})(jQuery)的区别

    首先,这两个函数都是在页面载入后执行的函数,其中两者的区别在于: 在jQuery中$(function(){})等同于jQuery(function(){}),另一个写法为jQuery(documen ...

  5. DedeCMS中function='Html2Text(@me)的用法分析

    本文实例讲述了DedeCMS中function='Html2Text(@me)的用法.分享给大家供大家参考.具体分析如下: 在使用dedecms建站网站时候,需要用到过滤html代码,调出纯文本的代码 ...

  6. IIFE-js中(function(){…})()立即执行函数写法理解

    介绍IIFE IIFE的性能 使用IIFE的好处 IIFE最佳实践 jQuery优化 在Bootstrap源码(具体请看<Bootstrap源码解析>)和其他jQuery插件经常看到如下的 ...

  7. 关于verilog中if与case语句不完整产生锁存器的问题 分类: FPGA 2014-11-08 17:39 260人阅读 评论(0) 收藏

    在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器 ...

  8. 关于Verilog 中的for语句的探讨

    在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...

  9. Verilog中锁存器与多路选择器

    Verilog中锁存器与多路选择器 Verilog是一种硬件描述语言,它代表的是硬件. Verilog代表的就是逻辑门和连接线. 对于一个always@(*)控制的块而言,只要块中的表达式包含的任意的 ...

随机推荐

  1. 002. MySQL复制操作

    #### 1.Setting the Replication Master Configuration On a replication master, you must enable binary  ...

  2. iOS 10 系统 AVPlayer视频播放不了问题解决

    使用[AVAudioPlayer Play]时出现了异常... 由于xcode中设置了当所有异常出现时的断点,,解决办法是将all改为Objective-C: libc++abi.dylib`__cx ...

  3. 基于 CodeIgniter 的各类开源项目大全

    名称:STBlog 介绍:STBlog 是一套由CI中国社区驱动,基于Codeigniter MVC 框架编写的多权限博客系统,轻巧/快速/安全/易拓展/界面友好是它的最大特点. 官方:http:// ...

  4. RAID独立冗余磁盘阵列

    独立冗余磁盘阵列(Redundant Array OF Independent Disks,RAID)开始于20世纪80年代美国加州大学伯克利分校的一个研究项目,当时RAID被称为廉价冗余磁盘阵列(R ...

  5. fix LayerKit framework不能提交App Store

    - 问题: - 原因 x86_64, i386是ios模拟器用的architectures.发布时,不支持这两种.但是,默认编译出来的layerkit framework支持这两种编译器 - 解决办法 ...

  6. Java集合Collection&Map

    Map<K,V>是键值对,K - 此映射所维护的键的类型,V - 映射值的类型.键值是一一对应的关系: Collection是只有键,底层也是由键值对,但是值的类型被隐藏起来. Colle ...

  7. Jar 包 及运行Jar包 - 转载

    Eclipse的jar file和Runnable JAR file的区别 - 及bat运行Runnable JAR文件 1.两种jar的区别 jar file是最普通的jar包,即平时我们工程中li ...

  8. scala学习手记40 - case表达式里的模式变量和常量

    再来看一下之前的一段代码: def process(input: Any) { input match { case (a: Int, b: Int) => println("Proc ...

  9. CSS打造固定表头

    html代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...

  10. OnTouch关于performClick的Warning

    OnTouch关于performClick的Warning 当你对一个控件(例如FloatingActionButton)使用setOnTouchListener() 或者是对你的自定义控件重写onT ...