目录
软件方法(task、function和void function)
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