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,函数声明,函 ...
随机推荐
- 组合式api-通过reactive和ref提供响应式数据
在setup中如果是直接定义遍历数据并不是响应式数据,和vue2中的data选项提供的数据不一样,vue2的data中返回的数据全部都是响应式数据. <script setup> // 这 ...
- Selenium等待元素出现
https://www.selenium.dev/documentation/webdriver/waits/ 有时候我们需要等待网页上的元素出现后才能操作.selenium中可以使用以下几种方法等大 ...
- VA01/VA02/VA03 销售订单根据定价和步骤校验权限隐藏价格(二)
1.文档说明 1.1.内容回顾 之前发表过相关文章<VA01/VA02/VA03 销售订单根据定价和步骤校验权限隐藏价格>,本篇文章对上一篇文章做补充说明. 第一篇文章是通过拥有权限,则隐 ...
- [Acwing 164. 可达性统计] 题解报告
事实上,这道题并不需要拓扑排序.(当然,拓扑排序还是更快) 题目分析 首先,题目中说了,这是一个有向无环图,所以,我们可以考虑 \(\texttt{DP}\) / 记搜 / 拓扑排序 来解决这道题. ...
- RV1126 DSI 调试
一.基本信息 开发板:RV1126 linux版本:4.19.111 显示屏:HX070JGI50(7寸) 显示器分别率:1024 * 600 二.MIPI协议 连接示意图(图片来源,正点资料) MI ...
- PyTorch项目源码学习(3)——Module类初步学习
torch.nn.Module Module类是用户使用torch来自定义网络模型的基础,Module的设计要求包括低耦合性,高模块化等等.一般来说,计算图上所有的子图都可以是Module的子类,包括 ...
- vue缓存数据
1,本地缓存(一直存在) localStorage.setItem('key', 'value'); const data = localStorage.getItem('key'); 2,会话缓存( ...
- Kmesh内核级流量治理,服务转发性能提升50%+
本文分享自华为云社区<DTSE Tech Talk | 第49期:Kmesh内核级流量治理,服务转发性能提升50%+!>,作者:华为云社区精选. 数据面时延开销,无法满足应用SLA诉求?内 ...
- Volcano 监控设计解读,一看就懂
摘要:Volcano 方便AI,大数据,基因,渲染等诸多行业通用计算框架介入,提供高性能任务调度引擎,高性能异构芯片管理,高性能任务运行管理等能力. Volcano 是一个 Kubernetes 云原 ...
- 如何在iPhone设备中查看崩溃日志
如何在iPhone设备中查看崩溃日志 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么? 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分 ...