SV always、initial、task、function、void function参数生命周期

本文详细介绍了Verilog和SystemVerilog中的always和initial过程块,讲解了它们的使用场景和区别。always块用于描述硬件时序和组合逻辑,initial块则用于仿真,仅在仿真开始时执行一次。此外,还探讨了task、function和voidfunction的软件方法,包括它们的参数类型、返回值和生命周期。数据的生命周期中,static变量在整个程序执行期间保持,而automatic变量随作用域结束而销毁。

目录

always和initial知识点

always过程块

initial过程块

always& initial

软件方法(task、function和void function)

task

function

void function

数据的生命周期

静态static

动态automatic


always和initial知识点

        硬件世界:module/endmodule,interface/endintface

  •         软件世界:program/endprogram,class/endclass

always过程块

        always中的@(event)敏感列表是为了模拟硬件信号的触发行为,一直监视event是否被触发,是用来描述硬件时序电路和组合电路的正确打开方式,只能在module和interface中使用。

initial过程块

        为测试而生,不可综合,在module和interface、program中使用;其书写方式initial begin…end

always& initial

        同:无法被延迟执行,仿真一开始同时执行,顺序上没有先后。

        异:initial只在仿真一开始执行一次。


软件方法(task、function和void function)

task

        无返回值,只能通过output、inout和ref的参数返回;可以置入耗时语句,例如@event、wait event、#delay等。

task A(output logic [2:0] x);

       …

       endtask

       task T3(a,b,output bit[15:0] u,v);参数a和b是1bit宽度的logic输入。

注意:区别于output、inout参数复制,ref将参数的传递方式指定为引用,ref参数只能被用于带自动储存的子程序中。

function

        可以在参数列表中指定输入参数input、输出参数output以及输入输出参数inout和引用参数ref的参数,返回结果利用return。

function int double(input a)//默认输入logic类型,int为定义函数返回类型值

        可以给定默认值,调用时如果省略该参数的传递则使用默认值。

function int double(input [7:0] addr=0);

注意:不带参数的子程序在定义或调用时并不需要带空括号();不耗时的方法定义为function,耗时的方法定义为task,有利于阅读理解。

void function

        在不消耗时间且无返回值的情况下定义为void function,这样它就可以被任何任务和函数所调用了。从灵活性的角度来看,所有由于调试的子程序都应该定义为void函数,以便于被其他函数和任务调用。

数据的生命周期

静态static

        程序执行开始到结束一直存在,初始化只会伴随它的生命周期发生一次,自身不销毁,可被对进程/方法共享。

动态automatic

        局部变量同其所在域共存亡,被声明automatic,在进入该线程/方法(task、function)后automatic变量被创建,离开后被销毁。

        作用范围定义:为了使得过程块中生命的变量有统一默认周期,可以在定义module、initerface、package或者program时,通过限定词automatic或者static来区分。上述程序块默认为static。

注意:   

function int def(input a);

              static int cnt = 0;  //不加指明,默认静态函数,此处有没有static都一样。

              cnt+=a;

              return cnt

如果连续调用两次def(1),其结果返回2。因为第二次调用def()函数,不会再初始化cnt=0

### 三级标题:SystemVerilog 中 functiontask 的区别 SystemVerilog 中的 `function` 和 `task` 是用于封装可重用代码块的两种机制,它们在功能、使用场景以及语法上有显著区别。 `function` 主要用于执行纯逻辑或数值计算,它不能包含任何耗时语句,并且必须在仿真时间的 0 时刻完成执行。`function` 可以返回一个值,或者在声明为 `void` 时不返回任何值。此外,`function` 的参数默认为输入方向,不能包含 `output` 或 `inout` 类型,但可以使用 `ref` 来实现引用传递,前提是参数为数据类型而非线网类型。值得注意的是,`function` 不能直接调用 `task`,但在某些特定的 `fork...join_none` 结构中可以调用 `task` [^5]。 ```systemverilog function int add(int a, b); add = a + b; endfunction ``` 与 `function` 不同,`task` 可以包含耗时语句,并且可以在非零时刻执行。这意味着 `task` 可以用于信号采样、驱动或延时操作等场景。`task` 不返回值,但可以通过 `output` 或 `inout` 参数传递多个结果。`task` 可以被 `function` 和其他 `task` 调用 [^4]。 ```systemverilog task delay_and_drive(output logic data); #10 data = 1'b1; endtask ``` 在声明和使用方式上,`function` 和 `task` 也有差异。`function` 必须至少有一个输入参数,而 `task` 可以没有参数。此外,`function` 的参数默认为 `input`,而 `task` 的参数可以是 `input`、`output` 或 `inout` [^4]。 关于调用规则,`function` 可以被 `function` 和 `task` 调用,而 `task` 只能被 `task` 调用。这意味着如果一个方法需要执行耗时操作,它必须被定义为 `task`,并且不能被 `function` 调用 [^4]。 --- ### 三级标题:总结 SystemVerilog 中的 `function` 和 `task` 在功能、使用场景和语法上有明显区别。`function` 适用于纯逻辑或数值计算,不能包含耗时语句,并且必须在仿真时间的 0 时刻完成执行。`task` 则用于需要耗时操作的场景,如信号采样或驱动,并且可以通过 `output` 或 `inout` 参数传递多个结果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值