设计一个4选1的数据选择器,输入信号为A, B, C, D , 输出信号为F, 地址选择信号为SEL。
任务与函数结构
verilog HDL语言引入任务与函数两种模块化程序的描述方式,使之便于理解和调试另外简化了程序的结构,增强了代码的易读性。任务和函数一般用于行为建模,编写验证程序(Test Bench)
1.任务
任务(task)类似于一般的编程语言中的过程(process),它可以从程序的不同位置执行共同的代码,通常把需要共用的代码段定义为任务,然后通过调用任务来使用它。在任务中可以包含时序控制等,还可以调用其他的任务和函数。任务的使用包括任务定义
和任务调用。
在进行任务定义时,必须注意以下几点:
(1)任务定义结构不能出现在任何一个过程块的内部;
(2)和模块定义不一样,在第一行"task"语句中不能列出端口名列表;
(3)一个任务可以没有输入输出端口;
(4)一个任务可以没有返回值,也可以通过输出端口或双向端口返回一个或多个值;
(5)除任务参数外,任务还能够引用说明任务所在的模块中定义的任何变量。
任务调用:
一个任务由任务调用语句调用,任务调用语句给出传入任务的参数值和接收结果的变量值,其语法为
<任务名> (端口1,端口2,...,端口n) ;
在进行任务调用时,必须注意下面几点:
(1)任务调用语句是过程性语句,因此只能出现在always过程块和initial过程块;
(2)任务调用语句中参数列表必须与任务定义时的输入、输出和双向端口参数说明的顺序相匹配;
(3)进行任务调用时,参数要按值传递,而不能按地址传递(这一点与其他高级语言不同);
(4)由于任务调用语句是过程性语句,因此任务调用的输入与输出参数必须是寄存器类型;
(5)一个任务中可以直接访问上一级调用模块中的任何寄存器;
(6)可以使用disable语句来中断任务的执行,在任务被中断后,程序流程将返回到调用任务的地方继续往下执行。
2.函数
函数(function)同任务一样,也可以在模块的不同位置执行共同的代码。函数与任务的差别在于
(1)函数只能返回一个值,而任务却可以有多个或者没有返回值;
(2)一个任务块可以包含时间控制结构,而函数块则没有,也就是说函数块从零仿真时刻开始执行,结束后立即返回(相当于组合逻辑);
(3)一个任务块就可以有也可以没有输入和输出,而函数必须有一个输入,而没有任何输出:
(4)任务块的触发是通过一条语句来实现,而函数块只有当它在一个表达式中被引用时才会生效
(5)在一个函数内可以调用其他的函数,但是不可以调用其他任务,而在任务中则可以调用其他的函数和任务。