local和protected的区别
Q1:什么时候用local和protected?
A:local和protected的封装属性,都可以隔离外部对类成员变量的访问。对于验证环境,反倒一般不建议添加local和protected,因为一般验证环境的层次没有太深太复杂。在开发验证环境时,一开始可以先放开访问权限,这有益于早期环境的稳定。待环境稳定后,可以考虑对哪些内部方法添加local、protected等访问权限的限定。这部分的建议与传统的软件开发的观点有所不同。
Q2:内嵌约束中的local::表示什么?
A:在使用内嵌约束(inline constraint)即randomize(item) with {CONSTRAINT}时,约束体中变量名的查找顺序默认是从被随机化的对象开始查找的。但是如果调用randomize()时所处的局部域(local scope)中也有同名变量,那么就是需要使用local::来显式声明该变量来源于外部,而非被随机化的对象(在约束中也可以使用this、super来索引这些变量)。
A:local::只表示“域”,并不指代某个句柄,所以也可以用local::this表示调用randomize()函数时所在对象的句柄。
Q3:parameter、localparam和const有什么区别和差别?
A:相比于localparam,parameter可以在实例化的时候从外部修改。parameter值的修改,可以通过实例化时通过#以order list的方式完成,也可以通过defparam赋值语句来实现。
A:localparam是局部参数,无法再次修改,自然也不能通过外部实例化时从外部修改。localparam在赋值时可以引用parameter。
A:parameter和localparam都是在elaboration时确定的,而const常量则是在仿真时确定的。与localparam类似的地方在于,const一旦定义和初始化也就无法再修改它的值了。
A:const常量虽然在代码中不能再次对其进行赋值,但在仿真时任然可以通过force来修改它的值,进而影响与其相关的逻辑行为。
A:需要注意的是,不能通过force来修改parameter和localparam的数值。