以下 SV 程序的运行结果为()
class Test;
bit[31:0] addr;
functionnew(logic [31:0] addr = 32'hFFFF_FFFF);
addr= addr;
endfunction
functionvoid display_addr;
$display("%0h", addr);
endfunction
endclass
initial begin
Test t1;
t1 =new(32'h1);
t1.display_addr();
end
A. 00000000
B. 32’hFFFFFFFF
C. 00000001
D. X
答案:A
解析:
new 函数中并没有把传入的 addr 值赋值给对象,所以不管 new 传入多少,都是打印的 bit [31:0] addr 的默认值,此处没有赋值,打印 0;
做如下修改:
(1)
functionnew(logic [31:0] addr = 32'hFFFF_FFFF);
this.addr = addr;
endfunction
操作后,addr 成功赋值给当前对象(this),打印 1;
(2)
function new(logic [31:0] addr =32'hFFFF_FFFF);
addr= addr;
$display("%0h", addr);
endfunction
其他位置不变,则打印 1,然后打印 0。
(3)
bit[31:0] addr = 32'h00220000;
打印 220000;
(4)
t1.addr= 3;
$display("t1.addr= %0h", t1.addr);
t1.display_addr();
打印:
t1.addr= 3
3
System Verilog 中类默认的成员属性是()
A. private
B. local
C. automatic
D. public
答案:D
解析:
类中的成员属性:const,local,protected,static等;
公有和私有:
public:公有的,默认为 public,子类和类外都可以访问;
local:仅对该类的对象可见,子类和类外不可见;
protcted:进队该类和子类可见,类外不可见;
静态和动态:
static:静态,被该类的所有实例共享;
dynamic,动态,默认;
SystemVerilog 中不允许静态方法读取静态变量。
类中通过()关键字访问父类的成员
A. super
B. virtual
C. parent
D. this
答案:A
解析:
由于子类不能继承父类的构造方法,因此,要调用父类的构造方法,必须在子类的构造方法体的第一行使用 super() 方法,该方法会调用父类相应的构造方法来完成子类对象的初始化工作。
A:super,子类访问父类的成员,调用父类的构造方法;
B:virtual,虚函数;
C:parent,指向父类的指针,使用 parent 调用父类的构造函数进行父类的初始化;
D:this,自己用;