Verilog中task、function、generate功能模块的使用

首先来讲解一下task、function说明语句的使用。

task和function说明语句分别用来定义任务和函数,利用任务和函数可以把一个很大的程序模块分解成许多较小的任务和函数便于理解和调试。

task和function说明语句的不同点:

(1)函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。

(2)函数不能启动任务,而任务能启动其他任务和函数。

(3)函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。

(4)函数返回一个值,而任务则不返回值。

函数(function)的目的是通过返回一个值来响应输入信号的值。而任务(task)能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出。

注意:task和function说明语句是可以被综合的。

task说明语句:

task主要用来实现一些简单的功能,方便多次调用,只负责处理而不带任何连线的功能。

(一)任务的定义

task<任务名>;

<端口及数据类型声明语句>

<语句1>

<语句2>

.........

<语句n>

endtask

(二)任务的调用

<任务名>(端口1,端口2,端口3,........,端口n)

(三)任务的使用例子

//  task 任务编写
task light;      //延迟tics个时钟将信号灯关闭
output color;
input [31:0] tics;
begin
    repeat(tics)  //等待tics个时钟的上升沿
    @(posedge clock);
    clock = off;
end
endtask

//  task 任务调用
always
begin
    red = on;
    light(red,red_tics);
    green = on;
    light(green,green_tics);
    amber = on;
    light(amber,amber_tics); 
end 

function说明语句

函数的目的是返回一个用于表达式的值。

函数的使用规则

(1)函数的定义不能包含有任何的时间控制语句,即任何用#,@或wait来标识的语句

(2)函数不能启动任务

(3)定义函数时至少要有一个输入变量

(4)在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该内部变量具有和函数名相同的名字

(一)函数的定义

function<返回值的类型或范围>(函数名);   <返回值的类型或范围>是可选项,如默认则返回值为一位寄存器类型数据。函数名也即输出结果的变量名。

        <端口说明语句>

        <变量类型说明语句>

        begin

        <语句>

        ........

        end

endfunction

(二)函数的调用

//函数的调用是通过将函数作为表达式中的操作数来实现的,调用格式如下:

<函数名>(<表达式>,......<表达式>)

(三)函数的使用例子

function [31:0] factorial;  //实现n的阶乘
    input[3:0] operand;
    reg[3:0]index;
    begin
        factorial = 1;
        for(index=2;index<=operand;index=index+1)
        factorial = index * factorial;
    end
endfunction

//函数调用
result = n * factorial(n);

generate生成块语句

        生成语句可以动态的生成Verilog代码。当对矢量中的多个位进行重复操作,或者多个模块的实例化引用的重复操作时,或者根据参数的定义来确定程序中是否应该包含某段Verilog代码的时候,可以使用生成语句来大大简化程序的编写过程。

        generate的主要功能是对module,net,reg,parameter,assign,always,task,function进行复制。

        生成实例可以是以下的一个或多种类型:

(1)模块;

(2)用户定义原语;

(3)门级原语;

(4)连续赋值语句;

(5)initial和always块。

        Verilog语言允许在生成范围内声明下列数据类型:

(1)net(线网),reg(寄存器);

(2)integer(整型数)、real(实型数)、time(时间型)、realtime(实数时间型);

(3)event(事件)。

        不允许出现在生成范围之中的模块项声明包括:

(1)参数、局部参数

(2)输入、输出和输入/输出声明

(3)指定块

在Verilog中有3种创建生成语句的方法:

(1)循环生成

(2)条件生成

(3)case生成

(一)循环生成语句

reg [N-1:0]  out;
genvar j ; //用于声明生成变量,只能用在生成块中,在确立后的仿真模块中,生成变量是不存在的
generate
    for(j = 0; j < N; j = j + 1)
        begin: bit                     //begin后面接循环生成语句的名字,用于层次化引用
            always@(*)
                out[j] = i0[j]^i1[j];
        end
endgenerate

(二)条件生成语句

module max(
    input a,b,sel,
    output c 
    assign c = sel ? a:b;
);

module min(
    input a,b,sel,
    output c 
    assign c = sel ? b:a;
);


module main(
    input a,b,sel,choose,
    output out
);
generate
    if(choose)
        begin:u1
        max  max_in(
            .a(a),
            .b(b),
            .sel(sel),
            .c(out)    
                    );
    else
        begin:u2
        min  min_in(
            .a(a),
            .b(b),
            .sel(sel),
            .c(out) 
                    ); 
    
endgenerate
endmodule

 (三)case生成语句

case生成语句类似条件生成语句模板,使用多选一case构造,有条件的调用Verilog结构。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三岁囍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值