08-任务Task和函数Function
任务Task和函数Function
类似于c语言中的函数
Task
- task 含有input\output\inout语句
- task消耗仿真时间
task中可以写延迟:#20 延迟20个仿真时间单位
时钟周期 @(posedge Clk) 等待下一个时钟周期上升沿
事件 @event 等待某一个事件被触发
task task_name;
begin
paramters
input
output
reg
...
end
endtask
function
- function是不消耗仿真时间的,其中没有等待和延迟
- function中不能有控制仿真时间的语句:@和#
- function是不能调用task的,因为function不能控制时间
- void function空函数,没有返回值
function [range] function_name;
begin
parameters; //range范围表示function返回值的
input;
reg;
end
endfunction
- SV中task和function中不需要使用begin end
task reset();
reset_l = 1'b0;
#100
reset_l = 1'b1; // 电平什么时候拉高和什么时候拉低需要有时间单位
endtask
function add2(int n);
n+2;
endfunction
传递参数
通过名字传递参数
- verilog通过形式参数的名字传递参数,减少错误
- 参数的顺序不受限制
- 传递参数的语法与verilog端口连接的方式相同
functon int divide(input int numerator,denominator);
if(denominator == 0) begin
return 0;
end
else
return numerator/denominator;
endfunction
always_ff@(posedge Clk) begin
result <= divide(b,a); //传递参数的顺序与定义的参数顺序相同
end
- 这种传递参数的方式,如果参数校多,就会分不清楚实参和形参的对应关系
- 采用 .形参名(实参) 的形式进行传参
always_ff @(posedge Clk)
result <= divide(.denominator(b),.numerator(a));
- 这种传递参数的方式可以与定义参数的顺序不同
形式参数的默认方向和类型
- 每个形式参数可以给一个默认值
- 调用task和function时不传递参数就会使用默认值
function int increment(int count=0,step=1);
increment = count+step;
endfunction
always_ff @(posedge clock)
result = increment(data_bus);//只传入一个参数,第二个使用默认参数
参数的传递方式
常见任务task和函数function传递参数值的方法时复制,传递参数的时候,是将实参复制一份传递给形参,两者指向不同内存存储的变量,函数体内进行操作的时候,不会影响原有的实参
- 参数传递默认情况下跟左侧的参数类型保持一致
function int increment(int count=0,step=1); //step的数据类型与count一致都是int,默认与左边一致
- input-- 默认情况下,在开始的时候复制实参给形参
- output--结束的时候,将输出的值复制一份给返回位置
- inout--开始输入的时候,在结束时输出,一份复制的数值
task和function阻塞情况
- task是没有返回值的
- function会将执行结果返回到调用位置
// 使用递归的方式计算n的阶乘
task print_sum(integer a[],input start=0);
automatic int sum = 0;
for(int j = start;j<a.size();j++)
sum += a[j];
$display("sum of the array is %0d",sum);//%0d的意思是将变量的数值,以前面不含0的十进制数的形式打印
endtask
print_sum(my_array)
function int factorial(int n);
int share_value = 0;
if(n=2) return (1);
else return (n*factorial(n-1));
endfunction
Result = factorial(my_value)
- Task消耗时间,可以阻塞
- Functions不能阻塞
参数传递是具有粘连性的
输入参数的数据类型与左边的保持一致
Verilog系统函数
系统函数都是以$符号开头的
- $random
可以使用$random或者使用$random(seed)
int a;
initial begin
a = $random(20);//随机种子默认值为0,可以更改为别的数
$display("a = %d",a)
end
- $urandom()产生32bit的无符号数
int a;
initial begin
a = $urandom(20);// a定义的int是有符号数,虽然随机数产生的是无符号数,但是赋值之后a仍然为有符号数
$display("a = %d",a)
end
$urandom_range(min,max) 产生一定范围内的无符号随机数
代码的生命周期
代码是有生命周期的
function int adder;
int a; // 函数内部定义的a 和在module定义的a所占用的内存空间是不同的,函数执行结束后会自动销毁
a = a+1;
endfunction
int a;
initial begin
a = adder();
$display("a = %d",a);
end
- 当遇到endfunction,endtask,return的时候,会结束task和function,销毁其中的变量
- 循环语句遇到end或者break的时候,结束循环
08-任务Task和函数Function的更多相关文章
- JavaScript入门-函数function(二)
JavaScript入门-函数function(二) 递归函数 什么是递归函数? 递归简单理解就是,在函数体里,调用自己. //我们在求一个10的阶乘的时候,可能会这么做 //写一个循环 var to ...
- Javascript自执行匿名函数(function() { })()的原理分析
匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数 下面是一个最常见的自执行函数: // 传统匿名函数 (function() { alert('hell ...
- JavaScript自运行函数(function(){})()的理解
今天打开JQuery源文件(jquery-1.8.3), 看到JQuery的初始化过程是这样的 (function( window, undefined ) { // .... })( window ...
- 深入理解javascript中的立即执行函数(function(){…})()
投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...
- javaScript的函数(Function)对象的声明(@包括函数声明和函数表达式)
写作缘由: 平时再用js写函数的时候,一般都是以惯例 function fn () {} 的方式来声明一个函数,在阅读一些优秀插件的时候又不免见到 var fn = function () {} 这种 ...
- 函数(Function)作用域 / 远程函数执行
函数跟变量一样也是有作用域的:Global.Script.Local.Private Global:作用于整个PowerShell会话,只要PowerShell会话不结束,被Global修饰的变量和函 ...
- Javascript自执行匿名函数(function() { })()的原理浅析
匿名函数就是没有函数名的函数.这篇文章主要介绍了Javascript自执行匿名函数(function() { })()的原理浅析的相关资料,需要的朋友可以参考下 函数是JavaScript中最灵活的一 ...
- Javascript学习之函数(function)
在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针. 一 函 ...
- js立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( ))
( function(){…} )() ( function (){…} () ) 是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达 ...
- 深入理解立即执行函数(function(){})();
( function(){-} )()和( function (){-} () )是两种javascript立即执行函数的常见写法,要理解立即执行函数,需要先理解一些函数的基本概念. 1,函数声明,函 ...
随机推荐
- 快速批量升级 NugetPackage 版本
批量升级项目中的 Nuget 有时候我们需要升级整个解决方案中的某些Nuget版本,如果每个手动使用NuGet Package Manager 会很麻烦.经过一个周末的踩坑,我找到一个解决方案. Na ...
- LFS - Linux From Scratch 从零开始全记录 - 1 准备篇
上次折腾 LFS 已经是好几年前了,只记得最后用 VMware 引导成功了,好多技术细节已经不记得了.趁着最近有空,再来折腾一次.这一次用的一台新的 Win10 PC,目标是在一个 U 盘上构建 LF ...
- 2023-06-01:讲一讲Redis常见数据结构以及使用场景。
2023-06-01:讲一讲Redis常见数据结构以及使用场景. 答案2023-06-01: 字符串(String) 适合场景 缓存功能 Redis 作为缓存层,MySQL 作为存储层,在大部分请求中 ...
- 云小课|MRS基础操作之集群健康检查
本文分享自华为云社区<云小课|MRS基础操作之集群健康检查>,作者:阅识风云. 阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视 ...
- Python 绑定:从 Python 调用 C 或 C++
摘要:您是拥有想要从 Python 中使用的C或 C++ 库的 Python 开发人员吗?如果是这样,那么Python 绑定允许您调用函数并将数据从 Python 传递到C或C++,让您利用这两种语言 ...
- 你知道,java项目中是如何获取文件地址的吗?
摘要:在java项目中我们经常会读取配置文件,但是文件的路径在获取时我们是怎么得到的?因为我总是忘记获取文件地址的方法,就在此记录一下 本文分享自华为云社区<[Java]Java项目的绝对地址和 ...
- 这8个JS 新功能,你应该去尝试一下
摘要:本文主要介绍几个已经进入stage4的提案,这几个提案有望在2022年逐步纳入标准. 本文分享自华为云社区<2022 年你应该尝试的 8个 JavaScript 新功能>,作者:前端 ...
- 开启一个 A/B 实验到底有多简单?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 火山引擎 A/B 测试平台 DataTester 孵化于字节跳动业务内部,在字节跳动,"万事皆 A/B, ...
- 聊一聊为什么我要整合Microsoft.Extensions.DependencyInjection和Castle.Core
前言 如果用到动态代理,大家可能会有几种选择,排到前列的是Autofac+Castle.AspectCore和DoraInterception, 我将从我当时研究的经历,以及我遇到的场景,为大家展示下 ...
- Chrome浏览器导出HTTPS证书
点证书小锁 进入证书界面 到详情中,导出证书