FPGA学习笔记(七)verilog的深入学习之任务与函数(语法篇3)
创始人
2024-01-16 23:43:54
0

目录

  • 任务与函数
    • 任务
      • 任务的基本概况
      • 自动(可重入)任务
    • 函数
      • 函数概述
      • 自动(递归)函数
      • 常量函数
      • 带符号函数
  • 条件编译

在之前学习的基础上,继续加深对Verilog HDl的学习

前两个见:
FPGA学习笔记(二)Verilog语法初步学习( 语法篇1)

FPGA数字电子技术复习笔记(一)verilog语法规则补充(语法篇2)

任务与函数

在这里插入图片描述
任务更像替代一块verilog代码,其中可以包括延时、时序、事件等语法结构,并且可以具有多个输出变量。
函数更像c语言中有返回值的函数类型,只有一个输出。

任务

任务的基本概况

在这里插入图片描述
语法图看不懂,先记下。

例子:ANSI C风格(c语言的函数风格)

// 定义任务
task bitwise_oper (output [15:0] ab_and,ab_or,ab_xor,input [15:0] a,b);
begin#delay ab_and = a & b;ab_or = a \ b;ab_xor = a ^b;
end
endtask

普通写法:

//定义bitwise_oper任务
task bitwise_oper;
output [15:0] ab_and,ab_or,ab_xor; //任务的输出变量
input [15:0] a, b; //输入到任务中的变量
begin#delay ab_and = a & b;ab_or = a | b;ab_xor = a ^ b;
end
endtask

调用:

reg [15:0]A,B;
reg [15:0]AB_AND,AB_OR,AB_XOR;//变量的指定必须按照任务定义时的声明次序
bitwise_oper(AB_AND,AB_OR,AB_XOR,A,B);

自动(可重入)任务

任务在本质上是静态的,任务中的所有声明项的地址空间是静态分配的,同时并发执行的多个任务共享这些存储区。
如果这个任务在模块中的两个地方被同时调用,则这两个任务调用将对同一块地址空间进行操作。

Verilog通过在task关键字前面添加automatic关键字,使任务中声明的所有模块项的存储空间都是动态分配的,每次调用都对各自独立的地址空间进行操作。所以,最好使用自动任务。
例子:
在这里插入图片描述

函数

在这里插入图片描述

函数概述

在这里插入图片描述
当函数声明的时候,在Verilog 的内部隐含地声明了一个名为function_identifier(函数标识符)的寄存器类型变量,函数的输出结果将通过这个寄存器类型变量被传递回来,所以不需要自己定义输出变量了。

函数的调用通过指明函数名和输人变量来进行。选项range_or_type(类型或范围)说明了内部寄存器的位宽。如果没有指定返回值的类型或位宽,则默认位宽为1。

举例:

reg [31:0] addr;
reg parity;
parity = calc_parity(addr); //定义偶校验位计算函数
function calc_parity;
input [31:0] address;
begin
//适当地设置输出值,使用隐含的内部寄存器calc_parity 
calc_parity = ^address; //返回所有地址位的异或值
end
endfunction

ANSIC的定义风格:

//定义偶校验位计算函数,该函数采用ANSI风格的变量声明
function calc_parity (input [31:0]address) ;
begin
//适当地设置输出值,使用隐含的内部寄存器calc_parity
calc_parity = ^address; //返回所有地址位的异或值
end
endfunction

自动(递归)函数

若某函数在两个不同的地方被同时并发调用,由于这两个调用同时对同一块地址空间进行操作,那么计算结果将是不确定的。
若在函数声明时使用了关键字 automatic,那么该函数将成为自动的或可递归的,即仿真器为每一次函数调用动态地分配新的地址空间,每个函数调用对各自的地址空间进行操作。同自动任务。

//定义自动(递归)函数
function automatic integer factorial;
input [31:0] oper;
integer i;
begin
if (operand >= 2)factorial = factorial (oper -1) *oper; //递归调用
elsefactorial = l ;
end
endfunction

常量函数

之后再加深学习

//定义一个RAM类型
module ram (...) ;
parameter RAM_DEPTH = 256;
input [clogb2(RAM_DEPTH)-1:0] addr_bus; //通过调用下面定义的函数得到clogb2=8
//相当于input [7: 0]addr_bus;
....
//常量函数
function integer clogb2 ( input integer depth) ;
begin
for (clogb2=0 ; depth >0; clogb2=clogb2+1)depth = depth >> 1;
end
endfunction
...
endmodule

带符号函数

之后再加深学习

module top;
...
//带符号的函数声明
//返回一个64位带符号数
function signed [63:0] compute_signed(input [63:0] vector) ;
...
...
endfunction
...
//从上层模块调用带符号函数
if (compute_signed(vector) < -3)
begin
...
end
...
endmodule

条件编译

很想c语言

`ifdef 宏名(标识符)程序段1
`elsif 宏名(标识符)程序段2
`else程序段3
`endif

‘ifndef语句,与’ifdef功能相反,即当宏名没被定义过,就编译程序段1。

如何定义:


`define 宏名 

注意:` ifdef 语句中不允许使用布尔表带式,例如使用 A&& B来表示编译条件是不允许的。

同时可以把这些宏名另外写到txt里面:

`include "xxx.txt"

然后在xxx.txt中写入`define xxxxxxx,该头文件存放位置只要在工程文件中任何位置就行,不能放到工程文件之外。

相关内容

热门资讯

班主任新学期致辞 班主任新学期致辞(通用7篇)  在平时的学习、工作或生活中,许多人都有过写致辞的经历,对致辞都不陌生...
六一节目主持词 六一节目主持词(通用16篇)  主持词可以采用和历史文化有关的表述方法去写作以提升活动的文化内涵。随...
记者节的主持词 记者节的主持词  女:他们,是邻家的男孩女孩,为你述说那缤纷的世界,他们,是春天飘来的风信,为你带来...
老同学聚会主持词 老同学聚会主持词尊敬的各位老师、老同学们:大家好!  人生沉浮十几载,同学情义始最真,老同学聚会主持...
铁血红安的经典台词 铁血红安的经典台词  1.小小红安,人人好汉,铜锣一响,四十八万,男将打仗,女将送饭。  2.我就是...
八十大寿主持词 八十大寿主持词合集10篇  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在现在的社会...
模拟跨年晚会主持词 模拟跨年晚会主持词A:亲爱的老师 B:同学们 A:大家 AB:新年好A:这里是2012年跨年晚会现场...
小品《扰民了您》台词剧本 小品《扰民了您》台词剧本  《扰民了您》以年轻租客的扰民为切入点从侧面反映现代社会空巢老人的问题。本...
迎新生晚会主持词 迎新生晚会主持词  1:尊敬的各位领导、  2:各位来宾、  3:亲爱的老师同学们:  4:大家,(...
竞选班干部申请书 小编为大家推荐的是竞选班干部申请书范文,希望可以帮助到大家,欢迎大家阅读参考,可以借鉴的哈。篇一:各...
社区迎中秋庆国庆主持词 社区迎中秋庆国庆主持词  中秋国庆都是我们重要的节日,下面unjs小编整理了社区迎中秋庆国庆主持词,...
调动工作申请书 调动工作申请书范文(精选5篇)  在当今社会生活中,申请书在现实生活中使用广泛,我们在写申请书的时候...
企业员工申请离职书范文推荐4... 企业员工申请离职书范文 第一篇尊敬的领导:您好!在公司工作xxx天中,学到了很多的知识,公司的营业状...
变更户主的申请书 变更户主的申请书 8篇  当下市场经济活跃,交易频繁,申请书应用范围广泛,我们在写申请书的时候要注意...
撤回诉讼申请书 撤回诉讼申请书(通用10篇)  在市场经济发展迅速的今天,很多场合都离不了申请书,申请书可以使我们的...
申请函格式 申请函格式范文(精选8篇)  在市场经济发展迅速的今天,申请书使用的次数愈发增长,申请书是我们提出请...
培训申请书 培训申请书范文(通用13篇)  在眼下市场经济活跃的社会,我们每个人都可能要用到申请书,我们在写申请...
优秀学生干部的申请书 优秀学生干部的申请书范文(精选6篇)  在现在的社会生活中申请书与我们的关系越来越密切,在写作上,申...