/// Solution to LSU EE 4702-1 Spring 2001 Homework 1

module priority_encoder_1_b(grant,found_out,request,found_in);
   output grant, found_out;
   input  request, found_in;

   wire   request, found_in;
   reg    grant, found_out;

   always @( request or found_in ) begin
      found_out =  found_in | request;
      grant     = !found_in & request;
   end
   
endmodule 

module priority_encoder_1_es(grant,found_out,request,found_in);
   output grant, found_out;
   input  request, found_in;

   wire   grant, found_out;
   wire   request, found_in;

   or o1(found_out, found_in, request);
   and a1(grant, not_found_in, request);
   not n1(not_found_in, found_in);

endmodule

module priority_encoder_1_is(grant, found_out, request, found_in);
   input request, found_in;
   output grant, found_out;

   wire   found_out = found_in | request;
   wire   grant     = !found_in & request;

endmodule

module test_pe(done, okay_b, okay_is, okay_es);
   output done, okay_b, okay_is, okay_es;

   reg    done, okay_b, okay_is, okay_es;
   reg    request, found_in;
   wire   grant_b, found_out_b;
   wire   grant_is, found_out_is;
   wire   grant_es, found_out_es;
   
   priority_encoder_1_b peb(grant_b,found_out_b,request,found_in);
   priority_encoder_1_es pees(grant_es,found_out_es,request,found_in);
   priority_encoder_1_is peis(grant_is,found_out_is,request,found_in);

   reg [1:0]  answers [0:3];
   integer    i;

   initial begin

      done    = 0;
      okay_b  = 1;  okay_es = 1;  okay_is = 1;

      answers[2'b00] = 2'b00;
      answers[2'b01] = 2'b01;
      answers[2'b10] = 2'b11;
      answers[2'b11] = 2'b01;

      for(i=0; i<4; i=i+1) begin

         {request, found_in } = i;

         #1;

         if( {grant_b,found_out_b}   !== answers[i] ) okay_b  = 0; 
         if( {grant_is,found_out_is} !== answers[i] ) okay_is = 0; 
         if( {grant_es,found_out_es} !== answers[i] ) okay_es = 0; 

      end // for (i=0; i<4; i=i+1)

      done = 1;
      
   end // initial begin

endmodule // test_pe