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