• Verilog-函数和任务的区别



    https://blog.csdn.net/CrazyUncle/article/details/86164830

    主要区别

    共同点

    1、任务和函数必须在module内定义和调用
    2、在任务和函数中不能声明wire
    3、所有输入/输出都是局部寄存器
    4、任务/函数执行完成后才返回结果。例如,若任务/函数中有forever语句,则永远不会返回结果

    任务

    1、通常用于调试,或对硬件进行行为描述
    2、可以包含时序控制(#延迟,@, wait)
    3、可以有input,output,和inout参数
    4、可以调用其他任务或函数

    函数

    1、通常用于计算,或描述组合逻辑
    2、不能包含任何延迟;函数仿真时间为0
    3、至少含有一个input参数并由函数名返回仅一个结果
    4、可以调用其他函数,但不能调用任务

    测试代码

    `timescale 1ns / 1ps
    
    module task_and_function(
        );
    
    reg [1:0] a;
    reg [1:0] b;
    reg clk;
    reg [2:0] sum;
    reg [2:0] sub;
    reg [2:0] sum_func;
    
    reg [31:0] factorial_res; // 阶乘结果
    
    initial begin
    	clk = 0;
    	a = 0;
    	b = 0;
    	sum_func = function_1(a,b); //第一次调用函数计算和
    	task_1(a,b,sum,sub); //第一次调用任务计算和和差
    	@(negedge clk);
    	a = 2;
    	b = 1; 
    	sum_func = function_1(a,b); //第二次调用函数计算和
    	task_1(a,b,sum,sub);	//第二次调用任务计算和和差
    	
    	factorial_res = factorial(3); //调用阶乘函数
    	
    end
    
    
    always #20 clk = ~clk;
    
    //============ 任务和函数的共同点 =========
    /*
    任务和函数必须在module内定义和调用
    在任务和函数中不能声明wire
    所有输入/输出都是局部寄存器
    任务/函数执行完成后才返回结果。
    例如,若任务/函数中有forever语句,则永远不会返回结果
    */
    
    //============ 任务 =========
    /*
    1、通常用于调试,或对硬件进行行为描述
    2、可以包含时序控制(#延迟,@, wait)
    3、可以有input,output,和inout参数
    4、可以调用其他任务或函数
    */ 	 
    	 
    task task_1;
    	input [1:0] a;
    	input [1:0] b;
    	output [2:0] sum;
    	output [2:0] sub;
    	reg [1:0] i;
    	begin
    		for(i=0;i<=2;i=i+1) begin
    			@(posedge clk);
    			$display("i=%d",i); // 经历3个上升沿出结果
    		end
    		sum = a + b;
    		sub = a - b;
    	end
    endtask
    
    //============ 函数 =========
    /*
    1、通常用于计算,或描述组合逻辑
    2、不能包含任何延迟;函数仿真时间为0
    3、至少含有一个input参数并由函数名返回仅一个结果
    4、可以调用其他函数,但不能调用任务
    */ 
    
    function [2:0] function_1;
    	input [1:0] a;
    	input [1:0] b;
    	begin
    		function_1 = a + b;  // 延迟为0
    	end
    endfunction
    
    // 阶乘函数
    function [31:0] factorial;
    	input [3:0] opa;
    	integer i;   
    	begin
    		factorial = 1;
    		for(i=2;i<=opa;i=i+1)
    			factorial = factorial * i;
    	end
    endfunction
    
    endmodule
    

    测试波形

  • 相关阅读:
    点双连通分量模板
    Caocao's Bridges HDU
    边双连通分量模板
    夏令营501-511NOIP训练18——高三楼
    夏令营501-511NOIP训练17——蛇形矩阵
    夏令营501-511NOIP训练16——数字转换
    模板——最小费用最大流
    洛谷P1792——[国家集训队]种树
    XJOI夏令营501-511NOIP训练14——好朋友
    codeforces 1178E-Archaeology
  • 原文地址:https://www.cnblogs.com/wt-seu/p/12700932.html
Copyright © 2020-2023  润新知