• Verilog HDL——任务与函数


    任务与函数区别

    比较点任务函数
    输入、输出可以有任意多个,各种类型的参数至少有一个输入(不能有输出端口,包括inout端口)
    调用任务只能在过程语句中调用,不能在连续赋值语句assign中调用函数可以作为赋值操作的表达式,用于过程赋值和连续赋值语句
    触发事件控制任务不能出现always语句;可以包含延迟控制语句(#),但只能用于仿真,不克用于综合函数不能出现always、# 语句,要保证函数的执行在零时间内完成
    调用其他函数和任务任务可以调用其他任务和函数函数只能调用函数,但不能调用任务
    返回值无返回值调用表达式返回一个值
    其他说明可以作为一条完整的语句只能作为赋值操作的表达式,不能作为一个独立的语句

    任务 TASK

    /*
    任务调用 -- 4比特全加器实现
    */
    module EXAMPLE(
    A,B,CIN,S,COUT
    );
    input[3:0] A,B;
    input CIN;
    output[3:0] S;
    output COUT;
    
    reg[3:0]S;
    reg COUT;
    reg[1:0]S0,S1,S2,S3;
    
    task ADD;
    	input A,B,CIN;
    	output[1:0] C;
    	
    	reg[1:0] C;
    	reg S,COUT;
    	
    	begin
    		S = A^B^CIN;
    		COUT = (A&B)|(A&CIN)|(B&CIN);
    		C = {COUT,S};
    	end	
    endtask
    
    	always@(A or B or CIN)begin
    		ADD(A[0],B[0],CIN,S0);
    		ADD(A[1],B[1],S0[1],S1);
    		ADD(A[2],B[2],S1[1],S2);
    		ADD(A[3],B[3],S2[1],S3);
    		S={S3[0],S2[0],S1[0],S0[0]};
    		COUT = S3[1];
    	end
    
    endmodule
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

    函数 FUNCTION

    • 函数定义只能做模块中,不能在过程块中;
    • 函数至少有一个端口(不能出现输出端口和双向端口)
    • 函数内可以调用函数不能调用任务;
    • 函数定义结构体中不能出现过程控制语句(always语句)
    • 函数结构中不能使用任何形势的时间控制语句(# wait等),不能使用disable中止语句;
    • 函数调用可以在过程块中完成,也可以在assign的连续语句中完成;
    • 函数调用不能作为单独语句出现,只能作为赋值语句的右端操作数;
    /*
    函数调用 -- 4比特全加器实现
    */
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

  • 相关阅读:
    计算机系统漫游
    Scss
    【云原生】创建harbor私有仓库及使用aliyun个人仓库
    程序员股权转让协议
    Briefings in bioinformatics2022 | 基于神经网络的分子性质预测通用优化策略
    Linux下的系统编程——进程的执行与回收(八)
    P23~33第7章 一阶电路和二阶电路的时域分析 详情可以看看书
    什么是Mybatis?Mybatis有什么作用?
    网络数据采集-免费全网数据采集软件
    latex给文字添加阴影--链接中转站
  • 原文地址:https://blog.csdn.net/akadiao/article/details/126907974