一、硬件过程块
1. always
-
是为了描述硬件的行为,在使用中要注意哪种使用方式是时序电路描述,哪种是组合电路描述。
-
只可以在module或者interface中使用。
练习1:
答案:ABC
2.initial
-
非常符合软件的执行方式,即执行一次。
-
无法被延迟执行,仿真一开始都是会同时执行的,不应该将它们在代码中的顺序与它们的执行顺序画等号。
-
不应该存在于硬件设计代码中,不可综合。
-
为测试而生。
-
initial过程块可以在module、interface、program中使用。
二、函数 function
function还有其他以下属性:
三、任务 Task
任务相较于函数更加灵活,不同点如下:
-
不能使用return返回结果,只能通过output、inout、ref的参数来返回,即通过定义需要的返回值变量到参数列表中。
-
task内可以置入耗时语句,而function不能,常见的耗时语句有@event、wait event、# delay等。
不能用return,因此无返回值类型。
function和task能够调用function,但是task只能由task调用(task内置耗时)
练习:
问:最终t的输出为多少?
由于在function中的参数列表没有标明input还是output,所以默认全部为输入,即使调用了op_copy这个函数,也因为t和s都是输入,当函数退出后,t返回不出去,因此最终t都是0、0、0,最后修改了为0,因此输出为'h2、'h0、'h0。
修改方法为:output trans t。
四、变量生命周期
在SV中,数据的生命周期为动态(automatic)和静态(static)。
-
对于automatic而言,function后声明automatic,则该function内的全部变量都是automatic的,每次调用会创建一个变量,调用结束后变量的生命结束被销毁。因此调用两次auto_cnt结果都是1。
-
对于static而言,function后声明static,则该function内的全部变量都是static的,变量都会一直保存存在的,不会被销毁,因此第一次调用static_cnt结果为1,第二次结果为2。
-
而对于默认的function,即function后并没有声明automatic或static,那么则默认为static,变量都为static,因此结果和static一样。
-
在module、program、interface、task和function之外声明的变量拥有静态static生命周期。
-
在module、program、interface内部声明,且在task、process和function外部声明的变量也是static变量。
-
在module、program、interface中定义的task、function默认都是static类型的。
-
过程块中(task、process、function)定义的变量类型和过程块的类型一致,过程块为static,变量默认也是static。用户也可以自己显示更改为automatic或者static。
练习:
答案:ABCD