01 如何在子类中调用父类的task?
可以在子类中使用super关键字引用父类中的成员,尤其是该成员已经被子类覆盖。
class parent;
task printf();
$display(" THIS IS PARENT CLASS ");
endtask
endclass
class subclass extends parent;
task printf();
super.printf();
endtask
endclass
program main;
initial
begin
subclass s;
s = new();
s.printf();
end
endprogram
仿真结果:
THIS IS PARENT CLASS
02 rand 和 randc有什么区别?
rand 是标准的随机变量。当对随机没有其他约束时,这些变量会均匀地分布。
randc是一种周期循环,它随机迭代有效范围内的所有值。每次迭代不重复任何值,直到所有的值都被遍历到。
03 什么是solve...before约束?
{ solve a before b ;}
指导约束求解器在从解空间中计算解时给予a最高的优先级。
04 fork/joins,fork/join_none fork/join_any之间的区别是什么?
- fork join_none: 父进程与fork_join_none中的子进程并发执行,即fork join_none不阻塞。
- fork join_any: 父进程阻塞后面的进程,直到fork_join_any任一进程完成。
- fork join: 父进程阻塞后面的进程,直到fork_join中的所有子进程都完成。
05 modports 有什么用?
modport根据所声明的方向来声明模块内的接口方向,可以让该接口同时被上下游使用。
interface intf (input clk);
logic read, enable,
logic [7:0] addr,data;
modport dut (input read,enable,addr,output data);
modport tb (output read,enable,addr,input data);
endinterface :intf
06 如何在SV中避免full cases仿真综合不匹配问题?
full_case综合指令比较危险,因为它们告诉了综合工具一些不同于仿真器的东西,即容易造成综合和仿真不一致。
对于Verilog仿真器,full_case作为注释被完全忽略。对于综合工具,full_case是指令,它们指示综合工具执行某些优化。
在full case语句中,其中所有可能的场景都可以与case项或default相匹配。
不定态X赋值可能使综合工具优化设计,但是它可能会导致仿真和综合之间的不匹配。为了确保综合前和综合后仿真匹配,default case可以将输出赋值一个确定值
module mux3c
(output reg y,
input [1:0] sel,
input a, b, c);
always @*
case (sel)
2'b00: y = a;
2'b01: y = b;
2'b10: y = c;
default: y = 1'bx;
endcase
endmodule
另外,使用synopsys full_case语句也会在仿真和综合之间行为不一致。
module mux3b (y, a, b, c, sel);
(output reg y,
input [1:0] sel,
input a, b, c);
always @*
case (sel) // synopsys full_case
2'b00: y = a;
2'b01: y = b;
2'b10: y = c;
endcase
endmodule
Verilog编码指南
使用if-else-if语句编码所有优先级编码器。当优先级编码器被编码为if-else-if语句时,设计工程师和验证工程师都很容易识别
07 关联数组和动态数组之间有什么区别?
动态数组对于处理其size发生动态变化的连续变量集合非常有用。
intarray[];
当集合的大小未知或数据空间稀疏时,关联数组是一个更好的选择。在关联数组中,使用名称作为关联数组中的键。
int array[string];
08 什么是bin?
coverage-point中的bin指定了一组值,则每次该值匹配时,相应的计数就会增加。如果bin指定了一个序列,则每次该序列匹配时,相应的计数就会增加。
program main;
bit [0:2] y;
bit [0:2] values[$]= '{3,5,6};
covergroup cg;
cover_point_y : coverpoint y
{ option.auto_bin_max = 4 ; }
endgroup
cg cg_inst = new();
initial
foreach(values[i])
begin
y = values[i];
cg_inst.sample();
end
endprogram
09 什么是覆盖率驱动的验证?
覆盖率驱动验证是一种面向验证收敛的功能验证方法。使用功能覆盖率,就可以衡量整个验证的进展。
10 什么是cross coverage ?
Cross 用于记录在同一时刻多个覆盖点上接收到的信息,增强验证完备性。
program main;
bit [0:1] y;
bit [0:1] y_values[$]= '{1,3};
bit [0:1] z;
bit [0:1] z_values[$]= '{1,2};
covergroup cg;
cover_point_y : coverpoint y ;
cover_point_z : coverpoint z ;
cross_yz : cross cover_point_y,cover_point_z ;
endgroup
cg cg_inst = new();
initial
foreach(y_values[i])
begin
y = y_values[i];
z = z_values[i];
cg_inst.sample();
end
endprogram
END
作者:验证哥布林
原文链接:
https://mp.weixin.qq.com/s/HLDAuKCmMDmC0Pjj4Nxp_Q
https://mp.weixin.qq.com/s/WlGcpNdQaOKnQ9__BuEcRQ
https://mp.weixin.qq.com/s/xhAvsNWoLudUBcGRqVj9-g微信公众号:
推荐阅读
更多IC设计技术干货请关注IC设计技术专栏