SV刷题Day 14

278 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路!


  1. 以下关于覆盖率说法错误的是:
A. 当功能覆盖率达到100%,可以说明设计没有问题
B. 覆盖率主要包括功能覆盖率,代码覆盖率和断言覆盖率
C. 状态机覆盖率,条件覆盖率属于代码覆盖率
D. 代码覆盖率达到100%不能说明设计没有问题

本题的答案是A。

  • 当功能覆盖率达到100%,不可以说明设计没有问题
  1. System Verilog有几个可以改变数组中元素顺序的方法。

已知:int d[] = '{1,5,8,7,6,8};以下选项错误的是

A. d.reverse();  结果是'{8,6,7,8,5,1}
B. d.sort(); 结果是'{1,5,6,7,8,8}
C. d.reverse() with (item > 4); 结果是’{1,8,6,7,8,5}
D. d.resort() ;结果是 '{8,8,7,6,5,1}

本题的答案是C, .reverse()方法返回数组倒序排列的结果。
.sort()方法返回数组按从小到大排列的结果。
.resort()方法返回数组按从大到小排列的结果。
reverse不能带with条件语句。 sort和resort可以带with排序范围。

  • 考察数据类型:
  1. **logic reg wire 四值单bit **
  2. byte shortint int longint 二值有符号
  3. integer 32bit四值有符号
  4. bit 二值无符号单bit

  1. 下面的选项中说法错误的是()?
A. 对于每一个类来讲,System Verilog创建一个默认的new函数来分配并初始化对象
B. new函数不能有返回值
C. 假设一个类中有多个构造函数中有new函数,可以根据赋值操作符左边的句柄类型决定调用哪个new函数
D. new函数的格式是 句柄=new[ ]
  • new[ ]是用来设置动态数组大小的。
  • new( )new[ ]都是用来申请内存并初始化变量。
  • 两者最大的不同在于调用new( )函数仅创建了一个对象,而new[ ]操作则建立一个含有多个元素的数组。
  • new( ) 可以使用参数设置对象的数值,而new[ ]只需使用一个数值来设置数组的大小。
  • new函数不能有返回值,其实对于new一个对象而言,new出来是会产生句柄的,即返回一个句柄类型
  1. 测试平台需要驱动和采样设计的信号,这主要是通过带有时钟块的接口做到的。下面的选项中说法错误的是()?
A. 可以使用@和wait来同步测试平台中的信号
B. 在时钟块中应该使用同步驱动,即"<="操作符来驱动信号
C. 在程序(program)中,可以使用always块
D. 在System Verilog中,可以使用虚接口的方式来驱动接口中的异步双向信号

在System Verilog中,可以在program中使用initial块,但是不能使用always块.
下面是具体的原因。 System Verilog程序比由许多并行执行的块构成的Verilog更加接近C程序,它拥有一个(或者更多)程序入口。
在一个设计中,一个always块可能从仿真的开始就会在每一个时钟的上升沿触发执行。但是一个测试平台的执行过程是经过初始化、驱动和响应设计行为等步骤后结束仿真的。在这里一个连续执行的always模块不可能正常工作当program中最后一个initial块结束的时候,仿真实际上也默认为结束了,就像执行了$finish一样。如果加入了一个always块,它将永远不能结束,这样就不得不明确地调用$exit来发出程序块结束的信号。


  1. 以下关于重载(Overloading)和覆盖(Overriding)的区别说法错误的是:
A. 当需要在子类中调用父类的被重写方法时,要使用 super 关键字
B. 方法重写是在子类存在方法与父类的方法的名字相同,但是方法的内容可以不同
C. 重写是父类与子类之间多态性的一种表现
D. 被重载的方法必须改变参数个数

本题的答案是D.
方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同
方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法
被重载的方法必须改变参数列表(参数个数或类型不一样);参数个数可以保持不变,只改变类型.\

  • 重载,子类中方法之间的多态,SV不支持
  • 覆盖(Overriding),指派生类中存在重新定义的方法,其方法名,参数列表,返回值类型必须与被覆盖方法一致,只改变方法体,并且父类中此方法必须有virtual的修饰,当调用该方法时,根据句柄的指向对象的类型决定调用基类或者子类中的方法
  • 重写(Overwrite),和Overriding不同的是基类中方法没有virtual修饰调用方法时仅取决于句柄的类型,与句柄的指向无关。 a.子类中要调用父类的被Overiding的方法,要用super修饰避免歧义。 b对,只有方法体不同 c对,Overloding是子类中方法间的多态,但SV不支持 d错
  1. 流操作符用于把其后的数据打包成一个比特流。以下关于流操作符使用正确的是:

已知:

    int a;\
    bit [7:0] c[4] = '{8'ha,8'hb,8'hc,8'hd);
A. a = {>>{c}};
B. >> a = {c};
C. a = {>>[c]};
D. a = <<{c};

只有a = {>>{c}};的形式是对的,其他选项都不对

image.png 约束块中一个表达式只能有一个关系操作符(<,>, <=, >= ,==)
constrain c(a>12;a<20) 是不等于constrain c (12<= a <=20)

image.png

  • s.len()返回字符串的长度,不包含终结字符。a的值是3。
  • s.getc()返回s中的第 1个字符的ASCII码,b对应的是98;a对应的是97.int是32位二值有符号数值
  1. System Verilog 相比于verilog-1995新引入了 string字符串类型,以下关于字符串类型说法错误的是?、

已知:

    string s,a;
    s = "SVSVSV";

image.png {}为拼接符号。s = {s,"sv"};        s的内容变为:"SVSVSVsv" 其实这一题不严谨,C选项应该为“SVSV”

  1. 以下选项对于下列断言的描述错误的是:
sequence seq;\
  @(posedge clk) a ##2 b;\
endsequence\
 \
property p;\
  not seq;\
endproperty\
pro_1: assert property(p);
A. not seq表示对sequence取反,即sequence成功时,property失败
B. pro_1 是断言的名称,只是一个标号,可以取其他值
C. sequence表示在时钟上升沿时a1,延时两个时钟之后,b1
D. 如果不使用seq中的clk,可以通过 pro_1: assert property(@(posedge clk_a),p);  指定新的时钟clk_a

本题的答案选D,在断言中调用一个property,并且再定义时钟是非法的

  • 下面的选项中关于覆盖组的说法错误的是()?
A. 覆盖组一次定义后便可以进行多次实例化
B. 覆盖组可以定义在类里,也可以定义在程序或模块层次上
C. 一个覆盖组在收集数据前,不一定要被实例化
D. 一个类可以包含多个覆盖组

一个覆盖组必须被实例化后才可以用来收集数据。如果忘记实例化覆盖组,在运行时不会打印出没有句柄的错误信息,但是覆盖率报告里将没有这个覆盖组的任何踪迹。因此,C选项是错误的。

  • 一个类可以包含多个句柄
  • 覆盖组一次定义后便可以多次进行实例化
  • 覆盖组可以定义在类里,也可以定义在程序或模块层次上