欢迎大家加入2022届数字IC交流群,QQ群号 1060380138
上期答案
[226] 在派生类中可以覆盖基类中的约束嘛?如果可以,如何实现?
可以通过使用相同的约束名称在派生类中重写基类定义的约束。下面是一个示例
代码语言:javascript复制class Base;
rand int a ;
rand int b;
constraint c_a_b_const {a < b;}
endclass
class Derived extends Base;
constraint c_a_b_const {a > b;}
endclass
[227] 下面的systemverilog代码的调用有什么问题?
代码语言:javascript复制function int count_ones ( ref bit [9:0] vec );
for( count_ones = 0; vec != 0; vec = vec >> 1 )
begin
count_ones = vec & 1'b1;
end
endfunction
constraint C1 { length == count_ones( myvec ) ; }
在约束中,不允许调用方向为ref的函数,除非使用“const ref”,这保证函数在内部不会修改参数。
[228] 下面两个派生类有什么不同?
代码语言:javascript复制class Base;
virtual function printA();
endfunction
endclass
1)
class Derived extends Base;
function printA();
//new print implementation
endfunction
endclass
2)
class Derived extends Base;
virtual function printA();
//new print implementation
endfunction
endclass
两者并没有区别,在基类中如果定义了virtual关键字,那么派生类也会继承该属性,无论有没有显式的二次声明。
[229] 找出下面代码中的问题(如果有的话)
代码语言:javascript复制class Packet;
bit [31:0] addr;
endclass
class ErrPacket extends Packet;
bit err;
endclass
module Test;
initial begin
Packet p;
ErrPacket ep;
ep = new();
p = ep;
$display("packet addr=%h err=%b", p.addr, p.err);
end
endmodule
没有问题,基类句柄可以指向派生类对象,但是反过来是不允许的。
[230] 现有下面两个类,请问在示例代码中compute_crc函数的调用顺序是?
代码语言:javascript复制class Packet; //Base Class
rand bit [31:0] src, dst, data[8]; // Variables
bit [31:0] crc;
virtual function void compute_crc;
crc = src ^ dst ^ data.xor;
endfunction
endclass : Packet
class BadPacket extends Packet; //Derived class
rand bit bad_crc;
virtual function void compute_crc; //overriding definition
super.compute_crc(); // Compute good CRC
if (bad_crc) crc = ~crc; // Corrupt the CRC bits
endfunction
endclass : BadPacket
示例
代码语言:javascript复制Packet pkt;
BadPacket badPkt;
initial begin
pkt = new;
pkt.compute_crc; // 1) Which of compute_crc() gets called?
badPkt = new;
badPkt.compute_crc; // 2) Which of compute_crc() gets called?
pkt = badPkt; // Base handle points to ext obj
pkt.compute_crc; // 3) Which of compute_crc() gets called ?
end
- 调用了基类的compute_crc
- 调用了派生类的compute_crc
- 调用了派生类的compute_crc,虽然使用的是基类的句柄,但是方法定义为虚方法,所以要根据对象的类型进行调用
本期题目
[231] 下面两种代码风格哪种更加好?为什么?
代码语言:javascript复制1)
for (i=0; i < length*count; i ) begin
a[i] = b[i];
end
2)
l_end = length * count;
for (i=0; i < l_end; i ) begin
a[i] = b[i]
end
[232] 下面的代码有什么错误?
代码语言:javascript复制class ABC;
local int var;
endclass
class DEF extends ABC;
function new();
var = 10;
endfunction
endclass
[233] 什么是虚接口,何时使用它?
[234] 工厂和工厂模式的意思是?
[235] 回调函数(callback)的意义是什么?
正确答案将在下一期公布,或者到下面的文章获取答案