This post is continuation to our previous post on blocking and non-blocking assignments. For better understanding of how the blocking and nonblocking assignments are scheduled in Verilog, please go through this post.
Q.1) What will be the output of following code?
module seq;reg clk, rst, d;
initial
begin
$monitor("%g clk = %b rst = %b d = %b", $time, clk, rst, d);
#1 clk = 0;
#10 rst = 0;
#5 d = 0;
#10 $finish;
end
endmodule
Answer) 0 clk = x rst = x d = x
1 clk = 0 rst = x d = x
11 clk = 0 rst = 0 d = x
16 clk = 0 rst = 0 d = 0
Q.2) What will be the output of following code?
module parallel;reg clk, rst, d;
initial
begin
$monitor("%g clk = %b rst = %b d = %b", $time, clk, rst, d);
fork
#1 clk = 0;
#10 rst = 0;
#5 d = 0;
join
#1 display("%t Terminating simulation", $time);
end
endmodule
(Note : fork-join block causes the statements to be evaluated in parallel, i.e. all at the same time.)
Answer) 0 clk = x rst = x d = x
1 clk = 0 rst = x d = x
5 clk = 0 rst = x d = 0
10 clk = 0 rst = 0 d = 0
11 Terminating simulation
Q.3) What will be the output of the following code ?
blocking nonblocking
always @(i1 or i2) always @(i1 or i2)
begin begin
i1 = 1; i1 = 1;
i2 = 2; i2 = 2;
#10; #10;
i1 = i2; i1 <= i2;
i2 = i1; i2 <= i1;
end end
(a) (b)
Answer) In the case of (a), i.e. blocking the values of i1 and i2 will be both '2', whereas in the case of (b) (nonblocking) the values of i1 and i2 will be '2' and '1' respectively.
Q.4) What will be the output of the following code ?
module tp;
reg i1;
initial
reg i1;
initial
$monitor("\$monitor: i1 = %b", i1);
initial
initial
begin
$strobe ("\$strobe : i1 = %b", i1);
i1 = 0;
i1 <= 1;
$display ("\$display: i1 = %b", i1);
#1 $finish;
$strobe ("\$strobe : i1 = %b", i1);
i1 = 0;
i1 <= 1;
$display ("\$display: i1 = %b", i1);
#1 $finish;
end
endmodule
endmodule
Answer) $display: i1 = 0
$monitor: i1 = 1
$strobe : i1 = 1
$monitor: i1 = 1
$strobe : i1 = 1
Q.5) What will be the output of the following code?
module tp;
reg i1, i2;
initial
begin
i1 = 0;
i2 = 1;
i1 <= i2;
i2 <= i1;
$monitor ("%0dns: \$monitor: i1=%b i2=%b", $stime, i1, i2);
$display ("%0dns: \$display: i1=%b i2=%b", $stime, i1, i2);
$strobe ("%0dns: \$strobe : i1=%b i2=%b\n", $stime, i1, i2);
#0 $display ("%0dns: #0 : i1=%b i2=%b", $stime, i1, i2);
#1 $monitor ("%0dns: \$monitor: i1=%b i2=%b", $stime, i1, i2);
$display ("%0dns: \$display: i1=%b i2=%b", $stime, i1, i2);
$strobe ("%0dns: \$strobe : i1=%b i2=%b\n", $stime, i1, i2);
$display ("%0dns: #0 : i1=%b i2=%b", $stime, i1, i2);
#1 $finish;
end
endmodule
Answer) 0ns: $display: i1=0 i2=1
0ns: #0 : i1=0 i2=1
0ns: $monitor: i1=1 i2=0
0ns: $strobe : i1=1 i2=0
1ns: $display: i1=1 i2=0
1ns: #0 : i1=1 i2=0
1ns: $monitor: i1=1 i2=0
1ns: $strobe : i1=1 i2=0
In case of any doubt regarding the above solutions, feel free to leave a comment.
No comments:
Post a Comment