Verilog学习心得之三-----task与function的区别

2023-11-08

task和function说明语句分别用来定义任务和函数。

---特点

1、利用任务和函数可以把一个很大的程序模块分解成许多小的任务和函数,便于理解和调用。

2、输入、输出和总线信号的值可以传入、传出任务和函数。

3、任务和函数往往还是在程序模块中在不同地方多次用到的相同的程序段。

4、学会使用task和function语句可以简化程序的结构,使程序明白易懂,是编写较大模型的基本功。

--task和function区别

1、function只能与主模块共用一个仿真时间单位,而task可以定义自己的仿真时间单位。

2、function不能包含task,task可以包含其它的task和function。

3、function至少有一个输入变量,而task可以没有或者有多个任意类型的变量。

4、function返回一个值,而task则不返回值。

--目的

function的目的是通过返回一个值来响应输入信号的值。

task能支持多种目的,能计算多个结果值,这些结果值之间能通过调用的task的输出或者总线端口输出。

--举例

Verilog中模块使用function时是把它当做表达式的操作符,这个操作就是这个函数的返回值。例如:定义一个task或者function对一个16位的字进行操作,让高字节与低字节互换,把它变为另一个字(假定这个任务或函数名为:switch_bytes)。

task返回的新字是通过输出端口的变量,因此16位字节互换任务的调用源码是:

switch_bytes(old_word,new_word);

function返回的新字是通过函数本身的返回值,因此16位字节互换任务的函数源码是:

new_word=switch_bytes(old_word);

函数switch_bytes把输入的old_word的字的高低字节互换后赋值给new_word。

--task说明

如果传给任务的变量值和任务完成后接收的结果已定义,就可以用一条语句启动任务。任务完成以后控制就传回启动过程。如果任务内部有定时控制,则启动的时间可以与控制返回的时间不同。任务可以启动其它任务,其它任务又可以启动其它任务,可以启动的任务数是没有限制的。只有当所有启动任务完成以后,控制才能返回。

1、任务的定义

任务:

task <task name>;
 <port and data type declare>;
 <statement 1>;
 <statement 2>;
 <statement 3>;
 ...
 endtask

这些声明语句的语法与模块定义的对应声明语句语法一致。

2、任务的调用及变量的传递

任务的调用:

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

具体的例子:

module traffic_lights;
 reg clock;
 reg red;
 reg amber;
 reg green;
 
 parameter  on = 1, 
            off = 0,
            red_tics = 350,
            amber_tics = 30,
            green_tics = 200;

//交通灯初始化
 initial red=off;
 initial amber=off;
 initial green=off;
//交通灯控制时序
always begin
 red=on; //开红灯
 light(red,red_tics); //调用等待任务
 green=on; //开绿灯
 light(green,green_tics); //等待
 amber=on; //开黄灯
 light(amber,amber_tics); //等待
end
//定义交通灯开启时间的任务
task light(color,tics);
 output color;
 input[31:0] tics;

 begin
  repeat(tics) @(posedge clock);//等呆tics个时钟的上升沿
  color=off;//关灯
 end
endtask
//产生时钟脉冲的always块
always begin
 #100 clock=0;
 #100 clock=1;
end

endmodule

这个列子描述了一个简单的交通灯的时序控制,有它自己的时钟产生器。

--function说明

1、function定义

function <返回值的类型和范围> (函数名);

function <return type and scope> (function name);
<port define>
begin
 <statement>;
 ...
end
endfunction

下面举例如下:

function [7:0] getbyte;
 input [15:0] address;
 begin
  <说明语句> //从地址字中提取低字节的程序
  getbyte = result_expression;
 end
endfunction

2、函数的使用规则

a、函数定义不能包含任何的时间控制语句,即#、@或者wait;

b、函数不可启动任务;

c、定义函数时至少需要一个输入参量;

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

下面是一个例子

module tryfact;
 //函数定义------------------------------
function [31:0] factorial;
 input [3:0] operand;
 reg [3:0] index;
 begin
  factorial = operand ? 1 : 0;
  for(index = 2; index <= operand; index = index + 1)
  factorial = index * factorial;
 end
endfunction
//函数的测试----------------------------------
 reg [31:0] result;
 reg [3:0] n;
initial begin
 result = 1;
 for (n = 2; n < 9; n = n + 1) begin
  $display ("Partial result n = %d result = %d",n,result);
  result = n * factorial(n)/((n*2) + 1);
 end
 $display ("Finalresult = %d",result);
end
endmodule//模块结束


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Verilog学习心得之三-----task与function的区别 的相关文章

  • 函数名前的星号有什么作用?

    我对在大多数具有我不熟悉的函数声明的 C 程序中看到的内容感到困惑 void func name void param 什么是 暗示该功能 我的理解 在变量类型中的特点是它创建一个指向另一个变量的指针 因此它可以跟踪后一个变量存储在内存中的
  • Python Tkinter,停止线程函数

    我目前正在为 3D 打印机开发 GUI 并且遇到如何停止线程函数的问题 我希望能够单击 GUI 中具有另一个功能的按钮 该按钮将阻止线程函数通过串行端口发送 G 代码字符串 目前 该函数已合并线程 以允许在打印期间触发其他函数 我非常感谢有
  • PHP:将字符串分成 8 个块,我该怎么做?

    我基本上有二进制 假设它的长度是300 我如何将它分割 就像使用爆炸一样 成 8 位块 我查看了 chunk split 但它似乎只有一个 end 参数 而不是将其放入数组的选项 或者它可以插入数组吗 末尾 8 位数字可以低于 8 如果有人
  • 如何为键盘上的 xml 中的功能键设置不同的背景?

    我正在开发 Android 键盘应用程序 我尝试为普通键和功能键设置不同的背景 但它不起作用
  • 什么是异地退货?

    什么是非本地退货 什么场景下有用 请举个例子来解释一下 这是一篇好文章 http yehudakatz com 2010 02 07 the building blocks of ruby 关于在 ruby 块的上下文中使用非本地返回 Ru
  • Mysql 将 int 转换为 MAC

    我有一些数据可以转换 其中有 2 列 其中一列有 IP 它包含整数值 我在 mysql 查询中使用了以下函数 是否有一个函数可以用来转换我的 mac 列 其中包含整数和数据类型是bigint to MAC地址 SELECT INET NTO
  • 使用 Gradle 发送电子邮件

    我写了一个任务 实际上是从互联网复制的 它将电子邮件发送到给定的电子邮件 但是当我运行它时 我得到java lang ClassNotFoundException javax mail internet MimeMessage例外 我已经包
  • 在 GCC 和 Clang 下,使用 lambda 的简单 RAII 包装器的复制初始化意外失败

    我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题 更不用说下面代码的逻辑不完整性了 复制构造函数和赋值运算符未删除等 这意味着是一个SSCCE 令我印象深刻的是复制初始化我的包装器与临时 lambda 的结果会导致编译错误 而
  • 解析,用三点参数替换

    让我们考虑一个典型的deparse substitute R call f1 lt function u x y print deparse substitute x varU vu varX vx varY vy f1 u varU x
  • R 中的字符串作为函数参数

    数据框chocolates列出了糖果的类型以及每种糖果的一组评级 ID sweetness filling crash snickers 0 67 0 55 0 40 milky way 0 81 0 53 0 56 我正在编写一个函数 它
  • JavaFX - 取消任务不起作用

    在 JavaFX 应用程序中 我有一个方法在大量输入时需要很长时间 我在加载时打开一个对话框 我希望用户能够取消 关闭该对话框并且任务将退出 我创建了一个任务 并将其取消添加到取消按钮处理中 但取消并没有发生 任务也没有停止执行 Task
  • 不明白这个 haskell 代码中的内容

    我有一些 Haskell 代码 我正在尝试完成它 但我不明白其中发生了什么 type Bag a a gt Int emptyB Bag a emptyB e gt 0 countB Eq a gt Bag a gt a gt Int co
  • 如何在 Swift 中使用函数数组

    我已经阅读了我可以在这里找到的所有关于函数数组的帖子 太棒了 你能做到 我估计 但没有一篇文章实际上展示了如何使用它们 至少不是我想要做的 这就是我想要的 它们都可以采用相同的参数 但这不是必需的 这篇文章很接近 将允许我循环执行每个函数
  • 任务和异步任务之间的区别

    C 提供了两种创建异步方法的方法 Task static Task
  • 如何编写正则表达式来匹配 Verilog 文件中的模块实例化?

    我正在开发一个项目 通过使用 perl 脚本语言来促进 verilog 编程 现在我想编写一个脚本来扫描顶级verilog文件 然后生成模块的层次结构列表 这表明我需要提取模块实例化 从verilog文件中的语句来看 问题是这样的 如何编写
  • 数组名或函数名何时“转换”为指针? (在C中)

    1 误解 每当用 C 语言声明一个数组时 都会有一个指向该数组第一个元素的指针created 数组的名称 隐式 是吗 我不这么认为 前两行this http ee hawaii edu tep EE160 Book chap7 subsec
  • 使用 NetworkStream.WriteAsync 检测错误

    如果我在调用后杀死我的服务器Login完成后 调用时不会引发异常stream WriteAsync data 0 data Count 已完成 并且返回的任务中没有错误指示 那么 我应该如何检测错误呢 当然 应该有一些迹象表明我试图通过已挂
  • 将值添加到 R 中 for 循环内的向量

    我刚刚开始学习 R 我编写了这段代码来学习函数和循环 squared lt function x m lt c for i in 1 x y lt i i c m y return m squared 5 NULL 为什么这个返回NULL
  • 将事件处理程序分配给带括号和不带括号的方法之间的区别

    假设您有以下内容 function doStuff code 2 种说法有什么区别 window onload doStuff window onload doStuff 两个语句都立即调用该方法 但如果我使用第一个语句 我可以将 onlo
  • 成员函数的Decltype

    class A int f int x int j return 2 decltype f p 给我错误 error decltype cannot resolve address of overloaded function 我不明白为什

随机推荐

  • Python入门自学进阶-Web框架——23、DjangoAdmin项目应用-定制页面

    一 单个菜单页面实现 类似DjangoAdmin中点击一个管理表打开的样子 以客户首页为例 这里cust index就是路由表中的name字段的值 即别名 对应的就是路由项中的cust html 即对应视图函数cust index 视图函数
  • CREATE TABLE 语句

    CREATE TABLE 语句用于创建数据库中的表 语法 CREATE TABLE table name column name1 data type size column name2 data type size column name
  • fwknop SPA服务端源码编译

    fwknop 源码编译 1 背景介绍 2 源码编译 2 1 源码获取 2 2 环境介绍 2 3 对git克隆下来的代码直接进行编译 2 4 挑选出C 部分的服务端进行编译 1 背景介绍 fwknop实现的是SPA Single Packet
  • 初识 flex & bison

    基本概念 flex 和 bison 经常结合使用 分别用于词法分析和语法分析 词法分析器 flex flex 用于生成词法分析器或者说是扫描器 scanner 它将输入的文本分解为称为 tokens 的序列 每个 token 都有一个特定的
  • VSCode下载慢问题

    进入VSCode官网根据自己的电脑选择相应的版本后下载 但是下载过程超级慢 有时候下载一半断开 让人有点崩溃 解决方法 改为国内镜像 打开谷歌浏览器下载内容 找到正下载的vscode 点击上图的链接 跳转到新的窗口 将其路径中的az7642
  • Vue 项目 使用 lang=“scss“ 已经有了 sass-loader 依赖 还是报错

    原因可能是 sass loader 版本太高的原因 安装7 3 1版本 即可解决问题 cnpm install sass loader 7 3 1 save dev
  • element中el-input组件限制输入条件(数字、特殊字符)

    1 只能输入纯数字
  • Spring MVC+Jquery Ajax 前后台传递Json对象

    关于Spring MVC3 X 接收和返回Json 最近开发项目时遇到此问题 解决后 特做下备忘 1 javabean 1 Content java public class Content implements Serializable
  • redis 安装

    一 Redis 介绍 二 Redis 下载 Redis下载官方下载地址 https redis io download 选择需要的版本 三 Redis 安装 将下载好的源文件上传到服务器 以下默认安装路径在 usr local目录下 使用最
  • 计算机应用在学科整合中的课题研究,多媒体计算机技术与学科教学的整合(课题研究阶段总结)...

    多媒体计算机技术与学科教学的整合 2014 12 2015 5 子长县职业教育中心 白勰 在承担课题研究任务以来 由于领导的高度重视 学校采取了切实可行的工作措施 同时也做了大量务实的工作 使课题研究能够顺利地推进 达到了预期效果 为了使课
  • CTP: 为什么报网络原因发送失败,但连接却成功?

    碰到一个很妖的问题 最后请教一位高手把问题定位到 md is logining ptr 0x7f0318027d80 init gt init lt get api version v6 5 1 20200908 10 25 08 get
  • C语言结构体——位段概念的讲解

    前言 之前我对结构体内存分配的方式 对默认对齐数的指令修改做了详细的博客讲解 C语言结构体详解 2 结构体内存对齐 默认对齐数 大家有兴趣的话可以去了解了解这方面的知识 一 什么是位段 位段的声明和结构是类似的 有两个不同 1 位段的成员必
  • 【数据库系统】--【3】DBMS数据组织

    DBMS数据组织 01关系表的数据组织 02索引的数据组织 03元数据的数据组织 04数据组织的优化 01关系表的数据组织 02索引的数据组织 03元数据的数据组织 04数据组织的优化 小结 关系表的数据组织 索引的数据组织 B树索引 HA
  • 华为AP胖瘦模式转换步骤

    华为AP胖瘦模式转换步骤 以AP3010DN AGN为例 瘦模式转换为胖模式 1 待AP启动完成后 从console口登录 波特率为9600 账号默认为admin 密码为admin huawei com 2 登录成功后 AP默认的IP地址为
  • python3+selenium调用浏览器驱动时报错的解决方法

    如题 在python3环境中使用selenium 在调用浏览器驱动时 报错 报错信息如图 报错原因是因为chromeDriver驱动需要与相应的chrome浏览器版本号相对应 解决方法 检查一下浏览器版本号 当前小编的chrome浏览器版本
  • corrupted double-linked list: 0x086a6c50(内存问题)

    新增了一段代码 程序就直接异常了 但是新增的代码没什么问题 但是在qt里面只显示异常也看不出是什么原因导致的 在终端运行了下 就提示有这个错误了 上网搜了一下 是内存的问题 通常有以下容易犯的内存问题 1 内存重复释放 出现double f
  • HTTP快速入门+(请求消息数据格式)+ 防盗链分析

    HTTP 概念 Hyper Text Transfer Protocol 超文本传输协议 传输协议 定义了 客户端和服务器端通信时 发送数据的格式 特点 1 基于TCP IP的高级协议 2 默认端口号 80 3 基于请求 响应模型的 一次请
  • struts2的国际化[三种语言的动态切换]

    一 创建三个资源文件 crms zh CN properties crms en US properties crms zh TW properties 二 struts2的配置文件
  • 远程桌面遇到的问题

    1 Remote Desktop Services服务灰色无法启动 Win R 打开运行 键入 services msc 打开服务界面 找到 Remote Desktop Services 服务 双击打开 确认服务名称为 TermServi
  • Verilog学习心得之三-----task与function的区别

    task和function说明语句分别用来定义任务和函数 特点 1 利用任务和函数可以把一个很大的程序模块分解成许多小的任务和函数 便于理解和调用 2 输入 输出和总线信号的值可以传入 传出任务和函数 3 任务和函数往往还是在程序模块中在不