SV刷题Day 10

292 阅读4分钟

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


image.png 这里需要注意:a是默认为缺省,b指定了为6,c也是默认缺省,d通过指定赋值为8. 所以a=1,b=6,c=3,d=8。 观察下面的代码。请问最后输出的结果是什么?

  1. 观察下面的代码。请问最后输出的结果是什么?
event e1,e2;
initial begin
    $display("第一条语句");
    -> e1;
    @e2;
    $display("第二条语句");
end
initial begin
    $display("第三条语句");
    -> e2;
    @e1;
    $display("第四条语句");
end

其结果输出:

第一条语句
第三条语句
第二条语句

当运行代码的时候,第一个初始化块启动,触发e1事件,然后阻塞在另一个事件上。第二个初始化块启动,触发e2事件(唤醒第一个块),然后则阻塞在第一个事件上。但是,因为第一个事件是一个零宽度的脉冲,所以第二个线程会因为错过第一个事件而被锁住。     因此,输出结果是:
第一条语句
第三条语句
第二条语句

  • 类的成员: 一个类的功能应该尽可能简单,不应该承担过多的责任,也不应该承担不符合它的职责。类作为载体,不会将成员变量直接暴露给外部,通过public,protected,local关键词来设置成员变量方法的外部权限访问。
    默认类型是public,子类和外部均可以访问成员
    protected:只有该类和子类可以访问成员,外部是无法访问的
    local:只有该类可以访问,子类外部都不行访问
  1. System Verilog包含了多种数据类型,以下选项正确的是:
A. reg [4:0] a;  a4比特无符号数。
B. int b;    b32比特无符号数。
C. integer c;  c是64比特有符号数。
D. byte d;   d可以取的最大值是127

本题答案选D,reg [4:0] a;  a是5比特无符号数。
int b;    b是32比特有符号数。
integer c;  c是32比特有符号数。和int的区别是:int是双状态类型,integer是四状态类型。
byte d; d是8比特有符号整数。最大值取127;即是 0111_1111

image.png

SV中字符串的特点

  • 单个字符是byte类型
  • 字符串使用动态存储方式
  • 函数toupper的作用是返回一个所有字符大写的字符串

image.png

  • a = 8'b1中a的值是0000_0001
  • b='b1中的b的值是0000_0001
  • c='1中c的值是1111_1111
  1. 对于systemverilog静态变量和动态变量 ,描述不正确的是
A. 动态变量在程序执行的时候在其定义作用范围创建生成
B. 静态变量在被创建后保持数值, 在整个程序执行过程中都存在
C. 声明成自动的变量在每次进入调用的时候进行初始化
D. 默认情况下,task中生成的变量为automatic (该项错误)
  • 默认情况下,task中生成的变量为static,只有将program等声明为automatic才会变量默认为automatic

image.png

  • 在接口中定义时钟块,可以添加多个时钟块且在不同时钟块中信号被输入输出方向可以不同,对于不同时钟,是input还是output关系互不影响。

image.png

  • 第一个枚举常量init的值默认是0
  • 第二个枚举常量指定为2,后续的枚举常量自动加一,并不影响前面的枚举常量
  1. 对某些数据类型,你可能希望既可以把它作为一个整体来访问,也可以把它分解成更小的单元。例如,有一个32比特的寄存器,有时候希望把它看成四个8比特的数据,有时候则希望把它看成单个的无符号数据。System Verilog的合并数组就可以实现这个功能。下面选项 中关于System Verilog中合并数组错误的是()?、
A. 与非合并数组不同的是,它的存放方式是连续的比特合集,中间没有任何闲置的空间
B. 合并数组大小定义的格式必须是[msb:lsb]
C. 任何数组类型都可以合并,包括动态数组、队列和关联数组
D. 如果需要等待数组中的变化,可以使用合并数组,也可以使用非合并数组

本题答案选D,如果需要等待数组中的变化,则必须使用合并数组
当测试平台需要通过存储器数据的变化来唤醒时,会想到使用@操作符。
@操作符只能用于标量或者合并数组。故D错误。

  • 任何数组类型都可以合并,包括动态数组、队列和关联数组