SV笔试题1

1.观察下面的代码。请问最后打印出来的值是(0,1,2)

initial begin
    for (int j=0;j<3;j++)
        fork
            automatic int k=j;
            $write(k);
        join_none
     #0 $display;
end

2.观察下面的代码。请问最后打印出来的值是(3,3,3)

program test;
    initial begin
        for (int j=0;j<3;j++)
            fork
                $write(j);
            join_none
        #0 $display("\n");
    end
endprogram

1、2放到一起讲了。详情可见绿皮书p.185

        在并发线程中,务必使用自动变量来保存数值。fork join_none本来在0时刻线程结束,由于#0阻塞线程,若j为静态存储,最后j=2将前两个$write函数中的j覆盖;若为动态存储,3个j有不同的空间,所以可保留各自的值。

3.观察如下的代码,请问在(60)ns,会输出“第四条语句”语句?

`timescale 1ns / 1ns
 
initial begin
    $display("第一条语句");
    #10 $display("第二条语句");
    fork 
        $display("第三条语句");
        #50 $display("第四条语句");
        #10 $display("第五条语句");
        begin
            #30 $display("第六条语句");
            #10 $display("第七条语句");
        end
    join
    $display("第八条语句");
    #80 $display("第九条语句");
end

解析如下 

      0ns时,输出“第一条语句”

    10ns时,输出“第二条语句”

    10ns时,输出“第三条语句”

    20ns时,输出“第五条语句”

    40ns时,输出“第六条语句”

    50ns时,输出“第七条语句”

    60ns时,输出“第四条语句”

    60ns时,输出“第八条语句”

  140ns时,输出“第九条语句”

4.执行以下操作后,队列a的值是{1,8}

int a[$] = {1,5};
initial begin
a.insert{1,1};
a = a[0:$-1];
a.push_back(8);
a = a[1:$];

先在1后面插入1,截去最后一个元素5,在最后添加一个元素8,截去第一个元素1。结果是{1,8}

5.System verilog常用于编写testbench。关于以下两个赋值语句(略去其他语句),分别代表的含义是:

语句一:

wire a,b,c;

initial

#10 a = b+c;
语句二:

wire a,b,c;

initial

a = #10 b+c;

        #10 a = b+c;

表示延迟10个时钟单位后,将10时刻的b+c的值赋予a。

        a = #10 b+c; 

表示延迟10个时钟单位后,将0时刻的b+c的值赋予a。对于这种延迟,b+c的值在执行分配时被存储,但是直到延迟期之后,该值才被分配给a,而不管b或c在该时间内是否发生了变化。

6.在system verilog中,执行以下的赋值语句,b、c的值分别为

logic signed [3:0]  a= -4'b0001;
logic [3:0] b;
logic signed [4:0] c;
...
assign b = unsigned'(a);
assign c = a;

        a声明为有符号变量,初始化为-1,则a的值是 1111(-1的补码)。使用unsigned'()做类型转化时,不改变数据的内容。所以b的值仍是 1111,但因为b是无符号数,所以b的十进制值等于 15

        在执行赋值操作时,当位数不足时,将数值赋予变量的低位,对于无符号数高位补0. 对于有符号数,高位补充符号位。c是有符号数,高位补符号位1,所以c的值是11111

详见:【考研计组】有符号数与无符号数之间的转换_住在阳光的心里的博客-CSDN博客_有符号数转无符号数

7.观察下面的代码,可以看出,输出的第一条语句是“producer:before put(1)”。请问,下面的代码输出的第六条语句是什么?

`timescale 1ns/1ns
program automatic bounded;
    mailbox mbx;
    initial begin
        mbx=new(1);
        fork 
            for(int i=1;i<4;i++) begin
                $display("producer:befor put(%0d)",i);
                mbx.put(i);
                $display("producer:after put(%0d)",i);
            end
            repeat(4) begin
                int j;
                #1ns mbx.get(j);
                $display("consumer:after get(%0d)",j);
            end
        join
    end
endprogram

         第一个put执行成功后,生产方线程试图执行put(2)但被阻塞。消费方线程被定时唤醒后,从信箱里取走信息1,这之后生产方才能把信息2放进信箱。

因此,定容信箱地输出:

    producer:before put(1)

    producer:after put(1)

    producer:before put(2)

    consumer:after get(1)

    producer:after put(2)

    producer:before put(3)

    consumer:after get(2)

    producer:after put(3)

    consumer:after get(3)

        因此,第六条输出的语句是 producer:before put(3)

8.以下关于 generate for语句,说法正确的是(D)

A.循环变量使用 integer声明

B.循环表达式的中的循环变量的值可以通过IO口传入的数据确定

C.如果需要复制的语句只有一行,则可以省略 begin...end关键字

D.必须是generate开始,endgenerate结束

        必须使用genvar申明一个正整数变量

        generate-if中的条件只能是静态变量,如 genvar,parameter 等,必须在整个程序运行期间保持不变。

        需要复制的语句必须写到begin_end语句里面,即便只有一句

9.求创建完成后 niu2.b的值:(100)

class niuniuww

logic static int a = 0 ;

logic int b = 0;

function new(aa = 10,bb=20)

a = a+aa;

b = bb+a+b;

endfunction

endclass

initial begin

niuniuww niu1 niu2;

niu1 = new(30);

niu2 = new(30,40);

end

        a为静态变量,只有一个,被这个类的所有实例共享,niu1实例化后,a为30,niu2实例化后,a为30+30=60,所以b为40+60+0=100。

10.请问j的结果最后是(2)

int j=1;

q[$]={0,1,2};

initial begin

    j=q[$];

end

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值