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,函数声明,函 ...
随机推荐
- 切换容器引擎为containerd
确保模块载入: # 永久生效 cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter E ...
- python操作mongodb副本集(mongodb高可用)
https://pymongo.readthedocs.io/en/stable/examples/high_availability.html# pymongo比较"智能",只要 ...
- [转]NLog学习笔记
配置文件 NLog所有的配置信息都可以写到一个单独的xml文件中,也可以在程序代码中进行配置. 配置文件位置 启动的时候,NLog会试图查找配置文件完成自动配置,查找的文件依次如下(找到配置信息则结束 ...
- 万界星空科技电子电器装配行业云MES解决方案
电子电器装配属于劳动密集型.科技含量较高的行业,产品零部件种类繁多,生产组装困难,生产过程存在盲点,同时也决定了生产流水线多且对自动化水平要求较高. 万界星空科技提供的电子行业解决方案,从仓储管理.生 ...
- 【类型转换】使用c#实现简易的类型转换(Emit,Expression,反射)
引言 哈喽.大家好,好久不见,最近遇到了一个场景,就是在FrameWork的asp.net mvc中,有个系统里面使用的是EntityFramework的框架,在这个框架里,提供了一个SqlQuery ...
- 启动android项目时报dx.jar错误的解决方案
启动android项目时遇到如下错误: Failed to load E:\SDK\android-sdk-windows\build-tools\27.0.2\lib\dx.jar 原因: 自动使用 ...
- bazel 使用 gtest/gmock 报错 Constraints from @bazel_tools//platforms have been removed
问题描述 运行 bazel test 命令,遇到错误:"Constraints from @bazel_tools//platforms have been removed. Please ...
- 在xml中比较运算符
SQL 中,可以使用比较运算符来比较两个值,如使用小于运算符 < 比较两个值大小.但是,在 SQL 查询中,有时候需要将小于运算符 < 用于 XML 或 HTML 语法中,这会导致语法冲突 ...
- 基于Llama2模型的开源模型
2023年7月18日Meta开源了Llama2,在2万亿个Token上训练,可用于商业和研究,包括从7B到70B模型权重.预训练和微调的代码.相比Llama1,Llama2有较多提升,评估结果如下 ...
- 10倍!BoostKit鲲鹏全局缓存3大创新技术助力Ceph性能提升
摘要:本文从四个方面阐述了BoostKit鲲鹏全局缓存技术,该技术针对Ceph开源存储方案存在的痛点,采用三大创新技术,有效的提高了Ceph的性能,最高可以将Ceph性能提升10倍. 本文分享自华为云 ...