进程:
- 在定义fork...join块的时候,将整个分叉封装在一个begin..end块中会引起整个块作为单个进程执行,其中每条语句顺序地执行;
- sv为下列进程产生一个执行线程:每一个initial块,每一个always块,fork...join(join_any,join_none)语句的每一个并行语句,每一个动态进程;每一个连续赋值也可以认为是它自己的线程;
- 在一个fork...join语句的关联文中使用return语句是非法的,会导致错误,原因是与return语句匹配的进程与fork_join的进程属于不同的进程;
- 在并发进程中务必使用自动变量来保存数值;
任务与函数;
- Verilog-2001具有静态和自动的任务和函数。在一个模块实例中,会为一个任务或函数的所有调用分配相同的存储空间。自动的任务和函数则为每一个实例分配唯一的、栈式存储空间;
- SV中无需一个begin...end块或fork...join块就可以在一个任务或函数中使用多条语句,默认顺序执行;
- SV中任务或函数的形参声明,缺省方向为input,缺省数据类型为logic;
- SV中的任务允许一个静态任务中将特定的形式参数和本地变量声明成自动的,或者,也允许在一个自动任务内将特定的形参和本地变量声明成静态的,若任务声明成自动的,所有的形参和本地变量都被存储在堆栈中;
- 在一个事件表达式中,一个过程连续赋值语句内的表达式中或者不在一个过程语句中的表达式中调用具有output、inout、ref形参的函数是非法的;在这些关联文中将const ref作为函数参数是合法的;
- 过程语句通过以下语句引入:initial,final,always,always_comb,always_latch,always_ff,task,function;
- 在一个进程内部,SV具有以下控制流:选择 循环及跳转;任务与函数调用;顺序和并行块;时序控制;
类:
- 每一个类的实例的每一个变量都有它自己的拷贝,有时要求所有的实例共享变量的一个属性,这此属性使用关键字static产生;
- 一个静态方法像一个常规的子例程一样可以在类的外部被调用。一个静态方法不能访问非静态成员(类属性或方法),但它可以直接访问静态类属性或调用同一个类的静态方法。在一个静态方法体内访问非静态成员或访问特殊的this句柄是非法的;静态方法不能是虚拟的;对于一个静态类属性,无需产生一个该类型的对象就可以直接使用;
- this关键字用来明确地引用当前实例的类属性或类方法;super关键字在继承类的内部使用,可以用来引用其父类的成员。
- 所有的类属性和类方法都在类外可见,与SV变量一样,类属性可通过const声明成只读的,由于类属性是动态的对象,类属性允许两种形式的只读变量:全局变量和实例常量;
- 全局常量类属性是那些在声明中包含了初始值的常量类属性,与const变量类似,也就是它们不能在除声明之外的其它地方赋值;实例常量在声明中不包含初始值,仅包含const限定符,这种类型的常量可以在运行时赋一个值,但赋值只能在对应的类构造器中完成一次;典型情况下,全局常量还被声明成static,因为它们对于类的所有实例都是相同的,但一个实例常量不能声明成static,因为它们在构造器中不接受所有的赋值;
- 类是一种数据类型,包含了数据以及对数据进行操作的子程序;
- 除线网类型外的任何数据都可以声明成一个类属性;
- 每一个类都有一个缺省的new方法,缺省构造器首先调用它的父类构造器(super.new()),然后继续将对象的每一个成员初始化成它的初始值;
- 一个静态方法不同于一个具有静态生命周期的方法,前者指的是类内部的方法的生命周期,而后者指的是任务内部的参数和变量的生命周期。在类中有以下两任务:static task foo();...endtask //具有自动变量生命周期的静态类方法;task static bar();...endtask//具有静态变量生命周期的非静态方法;
- 缺省情况下,类方法的参数和变量具有自动的生命周期;
- 将一个子类变量赋值给层次树中较高的类变量是合法的,将一个超类变量直接赋值给一个子类变量则是非法的,但如果超类句柄引用了指定子类的句柄,那将一个超类句柄赋值给一个子类变量则是合法的;
- 一个子类在实例化的时候会调用类方法new(),在函数中定义的任何代码执行之前,new()执行的一个动作是调用其超类的new()方法,并且会沿着继承树按这咱方式一直向上调用,如果超类的初始化方法需要参数,比较通用的方法是使用super关键字调用超类构造器,即在子类的new函数的第一行将超类的new函数声明全部照抄在第一行;
时间: 2024-10-12 08:46:35