Google+ VLSI QnA: Interview Questions on Blocking and Nonblocking Assignments

Friday 23 May 2014

Interview Questions on Blocking and Nonblocking Assignments

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 
                      $monitor("\$monitor: i1 = %b", i1);
                initial 
                begin
                       $strobe ("\$strobe : i1 = %b", i1);
                       i1 = 0;
                       i1 <= 1;
                       $display ("\$display: i1 = %b", i1);
                      #1 $finish;
                end
         endmodule

Answer) $display: i1 = 0
              $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