FPGA学习笔记(七)verilog的深入学习之任务与函数(语法篇3)

news2024/11/19 3:49:06

目录

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

在之前学习的基础上,继续加深对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; //递归调用
else
  factorial = 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,该头文件存放位置只要在工程文件中任何位置就行,不能放到工程文件之外。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习(python)——神经网络(Artificial Neural Networks)激活函数代码

目录 1.概述 2.激活函数 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;sigmoid函数&#xff08;常用&#xff09; 代码(sigmoid) &#xff08;3&#xff09;阶跃函数 代码&#xff08;阶跃函数&#xff09; &#xff08;4&#xff09;ReLU函数&#xff08;目…

【零基础算法】C语言实现二叉搜索树

目录 一&#xff0c;定义 二&#xff0c;性质 三&#xff0c;基本操作 1&#xff0c;初始化 2&#xff0c;查找 3&#xff0c;插入&#xff08;建树&#xff09; 4.删除结点 四&#xff0c;总结 一&#xff0c;定义 二叉查找树&#xff08;Binary Search Tree&#…

记一次网络安全渗透测试实战指南

1.信息收集 网址已无法访问&#xff0c;就不贴了 可以使用Fofa&#xff0c;火线&#xff0c;zoomeye&#xff0c;searchcode.com等爬取相关的资产&#xff0c;重点关注一些有漏洞暴露的框架和服务例如&#xff1a;泛微&#xff0c;PHP&#xff0c;Tomca&#xff0c;后台&#x…

71.(后端)角色接口携带权限数据——flask两张表之间多对多关系的使用与层级关系的输出

1.ORM关系之多对多 1.1 什么时候使用多对多关系 例如&#xff0c;我们我们的项目中&#xff0c;一个用户可以拥有多个角色&#xff0c;同样的&#xff0c;一个角色可以给多个用户。通俗来说&#xff0c;一个用户可以购买多个商品&#xff0c;多个商品可以被一个用户购买 1.2…

【FPGA】Verilog编程实现SDRAM读写(一) ----- 初始SDRAM

文章目录一. 存储器及SDRAM分类1. 存储器分类2. 半导体存储器分类3. SDRAM分类二. 什么是SDRAM&#xff1f;1. SDRAM基本概念2. SDRAM存储阵列3. SDRAM基本存储单元4. BANK概念5. SDRAM容量计算6. SDRAM功能框图7. SDRAM信号引脚8. SDRAM操作命令8.1 禁止命令&#xff08; INHI…

mysql做查询时,第一次很慢,第二三次就会很快?

前言 sql语句第一次查询慢的原因不仅仅是因为执行计划没有被缓存这么简单,有时候你会发现sql语句重用了执行计划,但是第一次查询时还是很慢. 最主要的原因是第一次查询的时候,mysql会将查询出的部分数据和索引从磁盘加载到内存作为缓存,而第二三此查询的时候就直接从内存缓存…

Spring - 手把手分析 IoC 容器创建过程

概述 这里我们以 Spring 5.2.8.RELEASE 版本为例&#xff0c;看一下 IoC 容器 的创建过程。同时我们使用 java-based 的方式实例化 IoC 容器&#xff0c;即使用 AnnotationConfigApplicationContext Configuration 的方式配置容器需要的组件。 ApplicationContext ctx new …

【云IDE初体验】与君相逢恨晚,真正的轻量级开发工具

云IDE产品介绍 云IDE使用教程 免费使用地址&#xff1a;点击【云IDE】&#xff0c;即可开始创建工作空间啦~ 云IDE1.云IDE介绍2. 使用流程3. 体验总结作为一名大学生&#xff0c;学习的地点很关键&#xff0c;尤其是我们计算机系&#xff0c;更是离不开电脑&#xff0c;去图书馆…

调度线程池 ScheduledThreadPoolExecutor 的正确使用姿势

前言 项目中经常会遇到一些非分布式的调度任务&#xff0c;需要在未来的某个时刻周期性执行。实现这样的功能&#xff0c;我们有多种方式可以选择&#xff1a; Timer类&#xff0c; jdk1.3 引入&#xff0c;不推荐 它所有任务都是串行执行的&#xff0c;同一时间只能有一个任…

【C语言】移位操作符 位操作符 - 对二进制位进行精准操作【+面试题目】_[初阶篇]

快速导航 【前言】 1.移位操作符 1.1左移操作符(<<) 1.2右移操作符(>>) 2.位操作符 2.1 & 按位与 2.2 | (按位或) 2.3 ^ (按位异或) 3.面试题目 3.1 交换两个变量&#xff08;不创建临时变量&#xff09; 3.2统计二进制中1的个数 3.2.1 方法一&#xff1a;…

复合事件归因分析

1 复合事件 1.1 概述 1.2 类型 1.2.1 先决条件事件&#xff08;preconditioned events&#xff09; 1.2.2 多变量事件&#xff08;multivariate CEs&#xff09; eg.高温干旱 1.2.3 时间复合事件&#xff08;temporally CEs&#xff09; eg.旱涝急转 1.2.4 空间复合事件…

电子电路设计基本概念100问(二)【学习目标:原理图、PCB、阻抗设计、电子设计基本原则、基本原器件等】

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

【每天学习一点新知识】网络安全--拒绝服务攻击

目录 1、SYN泛洪攻击 SYN泛洪攻击原理 攻击过程 防御机制 2、Smurf攻击 Smurf攻击原理 间接攻击 放大攻击 防御机制 3、DDoS DDoS原理 直接DDoS攻击 间接DDoS攻击 防御机制 1、SYN泛洪攻击 SYN泛洪攻击原理 终端访问Web服务器之前需要和服务器之间建立TCP连接。W…

万字长文解析Scaled YOLOv4模型(YOLO变体模型)

一&#xff0c;Scaled YOLOv4 摘要1&#xff0c;介绍2&#xff0c;相关工作 2.1&#xff0c;模型缩放 3&#xff0c;模型缩放原则 3.1&#xff0c;模型缩放的常规原则3.2&#xff0c;为低端设备缩放的tiny模型3.3&#xff0c;为高端设备缩放的Large模型 4&#xff0c;Scaled-YO…

大学毕业后,我就送了2个月外卖,哭了一整晚

先简单介绍一下自己&#xff0c;我来自湛江&#xff0c;大学学的的物流管理专业&#xff0c;现在就职于一家互联网公司&#xff0c;从事软件测试工作。 我来自湛江的一个偏远农村&#xff0c;家里兄弟姐妹多&#xff0c;父母无力负担我的学费&#xff0c;很多时候学费都是靠姐…

红黑树 - c++

文章目录&#xff1a;红黑树的介绍红黑树节点定义红黑树的插入操作红黑树的删除红黑树的验证红黑树 vs AVL树红黑树的介绍 红黑树(Red-Black-Tree)&#xff0c;通常写为 R-B Tree。它是一种特殊的二叉搜索树。红黑树的每个节点上都有一个存储位来标识节点的颜色&#xff0c;可…

积木报表—JimuReport v1.5.4版本发布,免费的可视化Web报表工具

项目介绍 一款免费的低代码可视化报表&#xff0c;像搭建积木一样在线拖拽设计&#xff01;低代码开发必备&#xff0c;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; 秉承“简单、易用、专业”的产品理念&#xff0c;极大的降低报表开发难度、缩…

【css伪类选择器及透明度——附项目图片及代码】

不知不觉&#xff0c;又鸽了好长时间了&#xff0c;非常抱歉&#xff0c;没办法&#xff0c;毕竟开学了&#xff0c;今天课少&#xff0c;抽出了两个小时写了一篇css的&#xff0c;每天不是被催更&#xff0c;就是在催更的路上。放心&#xff0c;小陈陈有时间一定会给大家分享好…

SVM 支持向量机

SVM 支持向量机SVM 原理最优化问题线性不可分sklearn 调用 SVM核函数SVM 原理 前置知识&#xff1a;用迭代策略来划分样本&#xff0c;请猛击《神经元的计算》。 SVM 也是用一条迭代的直线来划分不同数据之间的边界&#xff1a; .- 是一条直线&#xff08;线性函数&#xff09…

数据结构c语言版第二版(严蔚敏)第五章笔记

目录 树和二叉树的定义 树的定义 树的基本术语 二叉树的定义 二叉树的性质和存储结构 二叉树的性质 二叉树的存储结构 顺序存储结构 链式存储结构 遍历二叉树和线索二叉树 遍历二叉树 先序遍历 中序遍历 后序遍历 前序遍历的递归算法 中序遍历的递归算法 后序…