本文已参与「新人创作礼」活动,一起开启掘金创作之路!
- 以下关于覆盖率说法错误的是:
A. 当功能覆盖率达到100%,可以说明设计没有问题
B. 覆盖率主要包括功能覆盖率,代码覆盖率和断言覆盖率
C. 状态机覆盖率,条件覆盖率属于代码覆盖率
D. 代码覆盖率达到100%不能说明设计没有问题
本题的答案是A。
- 当功能覆盖率达到100%,不可以说明设计没有问题
- 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排序范围。
- 考察数据类型:
- **logic reg wire 四值单bit **
- byte shortint int longint 二值有符号
- integer 32bit四值有符号
- bit 二值无符号单bit
- 下面的选项中说法错误的是()?
A. 对于每一个类来讲,System Verilog创建一个默认的new函数来分配并初始化对象
B. new函数不能有返回值
C. 假设一个类中有多个构造函数中有new函数,可以根据赋值操作符左边的句柄类型决定调用哪个new函数
D. new函数的格式是 句柄=new[ ]
new[ ]是用来设置动态数组大小的。new( )和new[ ]都是用来申请内存并初始化变量。- 两者最大的不同在于调用
new( )函数仅创建了一个对象,而new[ ]操作则建立一个含有多个元素的数组。 new( )可以使用参数设置对象的数值,而new[ ]只需使用一个数值来设置数组的大小。- new函数不能有返回值,其实对于new一个对象而言,new出来是会产生句柄的,即返回一个句柄类型
- 测试平台需要驱动和采样设计的信号,这主要是通过带有时钟块的接口做到的。下面的选项中说法错误的是()?
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来发出程序块结束的信号。
- 以下关于重载(Overloading)和覆盖(Overriding)的区别说法错误的是:
A. 当需要在子类中调用父类的被重写方法时,要使用 super 关键字
B. 方法重写是在子类存在方法与父类的方法的名字相同,但是方法的内容可以不同
C. 重写是父类与子类之间多态性的一种表现
D. 被重载的方法必须改变参数个数
本题的答案是D.
方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同。
方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法。
被重载的方法必须改变参数列表(参数个数或类型不一样);参数个数可以保持不变,只改变类型.\
- 重载,子类中方法之间的多态,SV不支持。
- 覆盖(Overriding),指派生类中存在重新定义的方法,其方法名,参数列表,返回值类型必须与被覆盖方法一致,只改变方法体,并且父类中此方法必须有virtual的修饰,当调用该方法时,根据句柄的指向对象的类型决定调用基类或者子类中的方法。
- 重写(Overwrite),和Overriding不同的是基类中方法没有virtual修饰,调用方法时仅取决于句柄的类型,与句柄的指向无关。 a.子类中要调用父类的被Overiding的方法,要用super修饰避免歧义。 b对,只有方法体不同 c对,Overloding是子类中方法间的多态,但SV不支持 d错
- 流操作符用于把其后的数据打包成一个比特流。以下关于流操作符使用正确的是:
已知:
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}};的形式是对的,其他选项都不对
约束块中一个表达式只能有一个关系操作符(<,>, <=, >= ,==)
constrain c(a>12;a<20) 是不等于constrain c (12<= a <=20)
- s.len()返回字符串的长度,不包含终结字符。a的值是3。
- s.getc()返回s中的第 1个字符的ASCII码,b对应的是98;a对应的是97.int是32位二值有符号数值
- System Verilog 相比于verilog-1995新引入了 string字符串类型,以下关于字符串类型说法错误的是?、
已知:
string s,a;
s = "SVSVSV";
{}为拼接符号。s = {s,"sv"}; s的内容变为:"SVSVSVsv"
其实这一题不严谨,C选项应该为“SVSV”
- 以下选项对于下列断言的描述错误的是:
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表示在时钟上升沿时a为1,延时两个时钟之后,b为1
D. 如果不使用seq中的clk,可以通过 pro_1: assert property(@(posedge clk_a),p); 指定新的时钟clk_a
本题的答案选D,在断言中调用一个property,并且再定义时钟是非法的
- 下面的选项中关于覆盖组的说法错误的是()?
A. 覆盖组一次定义后便可以进行多次实例化
B. 覆盖组可以定义在类里,也可以定义在程序或模块层次上
C. 一个覆盖组在收集数据前,不一定要被实例化
D. 一个类可以包含多个覆盖组
一个覆盖组必须被实例化后才可以用来收集数据。如果忘记实例化覆盖组,在运行时不会打印出没有句柄的错误信息,但是覆盖率报告里将没有这个覆盖组的任何踪迹。因此,C选项是错误的。
- 一个类可以包含多个句柄
- 覆盖组一次定义后便可以多次进行实例化
- 覆盖组可以定义在类里,也可以定义在程序或模块层次上