Dinglei_hello · 2021年12月31日

System Verilog面试题(四)

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

微信公众号:
 title=

推荐阅读

更多IC设计技术干货请关注IC设计技术专栏
1 阅读 365
推荐阅读
0 条评论
关注数
8581
内容数
782
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息