errata/586: case signedness testcases

From: Steven Sharp (sharp@cadence.com)
Date: Wed Jun 30 2004 - 11:10:00 PDT

  • Next message: Shalom.Bresticker@freescale.com: "Re: errata/282: signing"

    The following reply was made to PR errata/586; it has been noted by GNATS.

    From: Steven Sharp <sharp@cadence.com>
    To: etf-bugs@boyd.com
    Cc:
    Subject: errata/586: case signedness testcases
    Date: Wed, 30 Jun 2004 14:06:31 -0400 (EDT)

     --Sounder_of_Swine_756_000
     Content-Type: TEXT/plain; charset=us-ascii
     Content-MD5: lpdsz/XVPtlgN8/axXicrw==
     
     Shalom suggests that these testcases are not too long to attach to the
     erratum, so I will do so. The versions I am attaching here are slightly
     different from the ones I mailed out to individuals earlier. They contain
     an additional if-then-else formulation that is supposed to match the case.
     There was also a bug in the originals I was given, and the original author
     fixed it in a different way than I did.
     
     Steven Sharp
     sharp@cadence.com
     
     --Sounder_of_Swine_756_000
     Content-Type: TEXT/plain; name="case_approaches.v"; charset=us-ascii; x-unix-mode=0664
     Content-Description: case_approaches.v
     Content-MD5: Z2dFNwhxhJziAxlkUdJCbQ==
     
     //ABW: assumption is that first approach is valid
     //other approaches are emulated by if-else-if sequences
     
     `define signed4 reg signed [3:0]
     `define unsigned4 reg [3:0]
     `define signed8 reg signed [7:0]
     `define unsigned8 reg [7:0]
     
     module case_approaches;
       
     //-----------------------------------------------------------------------------
       
       task test1;
         `signed4 rs4_1;
         `signed8 rs8_1, rs8_2;
       begin
         $display("Test 1 - all expressions are signed:");
         //when all expressions are signed - there is no difference
         //valid result is item1 in all approaches
         
         rs4_1 = 4'sb1000;
         rs8_1 = 8'sb11111000;
         rs8_2 = 8'sb00001000;
         #1;
         case(rs4_1)
           rs8_1 : $display("item1 - valid");
           rs8_2 : $display("item2");
           default : $display("default");
         endcase
     
         begin : first
           `signed8 temp;
           temp = 1 ? rs4_1 : temp;
           if (temp === rs8_1)
             $display("item1 - valid");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default");
         end
         
         begin : second
           `signed8 temp;
           temp = rs4_1;
           if (temp === rs8_1)
             $display("item1 - valid");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default");
         end
         
         begin : third
           `signed8 temp;
           temp = rs4_1;
           if (temp === rs8_1)
             $display("item1 - valid");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default");
         end
         
         begin : fourth
           `signed8 temp;
           `signed8 temp1;
           `signed8 temp2;
           temp = rs4_1;
           temp1 = rs8_1;
           if (temp === temp1)
             $display("item1 - valid");
           else begin
             temp2 = rs8_2;
             if (temp === temp2)
               $display("item2");
             else
               $display("default");
           end
         end
         
       end
       endtask
     
     //-----------------------------------------------------------------------------
     
       task test2;
         `signed4 rs4_1;
         `signed8 rs8_1;
         `unsigned8 ru8_2;
       begin
         $display("Test 2 - case item expressions influence case expression:");
         //now one of the items is unsigned - if first approach is valid then all
         //expressions will get unsigned which means that 4'sb1000 will be 8'b00001000
         //effectively and item2 will print out
         //for other approaches item1 is valid result
     
         rs4_1 = 4'sb1000;
         rs8_1 = 8'sb11111000;
         ru8_2 = 8'b00001000;
         #1;
         case(rs4_1)
           rs8_1 : $display("item1");
           ru8_2 : $display("item2 - valid");
           default : $display("default");
         endcase
         
         begin : first
           `unsigned8 temp;
           temp = 1 ? rs4_1 : temp;
           if (temp === rs8_1)
             $display("item1");
           else if (temp === ru8_2)
             $display("item2 - valid");
           else
             $display("default");
         end
     
         begin : second
           `unsigned8 temp;
           temp = rs4_1;
           if (temp === rs8_1)
             $display("item1 - valid");
           else if (temp === ru8_2)
             $display("item2");
           else
             $display("default");
         end
         
         begin : third
           `signed8 temp;
           temp = rs4_1;
           if (temp === rs8_1)
             $display("item1 - valid");
           else if (temp === ru8_2)
             $display("item2");
           else
             $display("default");
         end
         
         begin : fourth
           `signed8 temp;
           `signed8 temp1;
           `unsigned8 temp2;
           temp = rs4_1;
           temp1 = rs8_1;
           if (temp === temp1)
             $display("item1 - valid");
           else begin
             temp2 = ru8_2;
             if (temp === temp2)
               $display("item2");
             else
               $display("default");
           end
         end
         
       end
       endtask
       
     //-----------------------------------------------------------------------------
     
       task test3;
         `signed8 rs8_1;
         `signed4 rs4_1;
         `unsigned8 ru8_2;
       begin
         $display("Test 3 - case item expression influence each other:");
         //now one of the item is unsigned which makes difference for the other item
         //this test shows difference between second and third approach
     
         rs8_1 = 8'sb00001000;
         rs4_1 = 4'sb1000;
         ru8_2 = 8'b00001000;
         #1;
         case(rs8_1)
           rs4_1 : $display("item1 - valid");
           ru8_2 : $display("item2"); //would match if order was different
           default : $display("default");
         endcase
     
         begin : first
           `unsigned8 temp;
           temp = 1 ? rs8_1 : temp;
           if (temp === rs4_1)
             $display("item1 - valid");
           else if (temp === ru8_2)
             $display("item2"); //would match if order was different
           else
             $display("default");
         end
         
         begin : second
           `unsigned8 temp;
           temp = rs8_1;
           if (temp === rs4_1)
             $display("item1 - valid");
           else if (temp === ru8_2)
             $display("item2"); //would match if order was different
           else
             $display("default");
         end
         
         begin : third
           `signed8 temp;
           temp = rs8_1;
           if (temp === rs4_1)
             $display("item1");
           else if (temp === ru8_2)
             $display("item2 - valid");
           else
             $display("default");
         end
         
         begin : fourth
           `signed8 temp;
           `signed8 temp1;
           `unsigned8 temp2;
           temp = rs8_1;
           temp1 = rs4_1;
           if (temp === temp1)
             $display("item1");
           else begin
             temp2 = ru8_2;
             if (temp === temp2)
               $display("item2 - valid");
             else
               $display("default");
           end
         end
         
       end
       endtask
       
     //-----------------------------------------------------------------------------
     
       task test4;
         `unsigned8 ru8_1;
         `signed4 rs4_1;
         `signed8 rs8_2;
       begin
         $display("Test 4 - case expression influences case item expressions:");
         //now case expression is unsigned which makes difference for case item
         //this test shows difference between third and fourth approach
     
         ru8_1 = 8'b11111000;
         rs4_1 = 4'sb1000;
         rs8_2 = 8'sb00001000;
         #1;
         case(ru8_1)
           rs4_1 : $display("item1");
           rs8_2 : $display("item2");
           default : $display("default - valid");
         endcase
         
         begin : first
           `unsigned8 temp;
           temp = 1 ? ru8_1 : temp;
           if (temp === rs4_1)
             $display("item1");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default - valid");
         end
     
         begin : second
           `unsigned8 temp;
           temp = ru8_1;
           if (temp === rs4_1)
             $display("item1");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default - valid");
         end
         
         begin : third
           `unsigned8 temp;
           temp = ru8_1;
           if (temp === rs4_1)
             $display("item1");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default - valid");
         end
         
         begin : fourth
           `unsigned8 temp;
           `signed8 temp1;
           `signed8 temp2;
           temp = ru8_1;
           temp1 = rs4_1;
           if (temp === temp1)
             $display("item1 - valid");
           else begin
             temp2 = rs8_2;
             if (temp === temp2)
               $display("item2");
             else
               $display("default");
           end
         end
         
       end
       endtask
       
     //-----------------------------------------------------------------------------
     
       initial begin
         test1;
         test2;
         test3;
         test4;
       end
       
       //this block is only to make it more unlikely that compiler will know the
       //values of variables in advance and treat them as constants - delays between
       //value preparations and case constructs are for the same reason
       initial begin
         #10;
         test1.rs4_1 = 0;
         test1.rs8_1 = 0;
         test1.rs8_2 = 0;
         test2.rs4_1 = 0;
         test2.rs8_1 = 0;
         test2.ru8_2 = 0;
         test3.rs8_1 = 0;
         test3.rs4_1 = 0;
         test3.ru8_2 = 0;
         test4.ru8_1 = 0;
         test4.rs4_1 = 0;
         test4.rs8_2 = 0;
         #10;
         test1.rs4_1 = 1;
         test1.rs8_1 = 1;
         test1.rs8_2 = 1;
         test2.rs4_1 = 1;
         test2.rs8_1 = 1;
         test2.ru8_2 = 1;
         test3.rs8_1 = 1;
         test3.rs4_1 = 1;
         test3.ru8_2 = 1;
         test4.ru8_1 = 1;
         test4.rs4_1 = 1;
         test4.rs8_2 = 1;
       end
       
     endmodule
     
     --Sounder_of_Swine_756_000
     Content-Type: TEXT/plain; name="case_approaches2.v"; charset=us-ascii; x-unix-mode=0664
     Content-Description: case_approaches2.v
     Content-MD5: g15FWqcbTSAuhUI8E8WfSQ==
     
     //ABW: assumption is that first approach is valid
     //other approaches are emulated by if-else-if sequences
     //this is second test that uses expressions instead of constants
     
     `define signed4 reg signed [3:0]
     `define unsigned4 reg [3:0]
     `define signed8 reg signed [7:0]
     `define unsigned8 reg [7:0]
     
     module case_approaches;
       `signed4 rs4_1; initial rs4_1 = 4'sb1000;
       `signed8 rs8_0; initial rs8_0 = 8'sb0;
     
     `define signed_expr (rs4_1 + rs8_0)
     //when computed as signed it gives 8'sb11111000
     //when computed as unsigned it gives 8'b00001000
       
     //-----------------------------------------------------------------------------
       
       task test1;
         `signed8 rs8_1, rs8_2;
       begin
         $display("Test 1 - all expressions are signed:");
         //when all expressions are signed - there is no difference
         //valid result is item1 in all approaches
         
         rs8_1 = 8'sb11111000;
         rs8_2 = 8'sb00001000;
         #1;
         case(`signed_expr)
           rs8_1 : $display("item1 - valid");
           rs8_2 : $display("item2");
           default : $display("default");
         endcase
         
         begin : first
           `signed8 temp;
           temp = 1 ? `signed_expr : temp;
           if (temp === rs8_1)
             $display("item1 - valid");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default");
         end
     
         begin : second
           `signed8 temp;
           temp = `signed_expr;
           if (temp === rs8_1)
             $display("item1 - valid");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default");
         end
         
         begin : third
           `signed8 temp;
           temp = `signed_expr;
           if (temp === rs8_1)
             $display("item1 - valid");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default");
         end
         
         begin : fourth
           `signed8 temp;
           `signed8 temp1;
           `signed8 temp2;
           temp = `signed_expr;
           temp1 = rs8_1;
           if (temp === temp1)
             $display("item1 - valid");
           else begin
             temp2 = rs8_2;
             if (temp === temp2)
               $display("item2");
             else
               $display("default");
           end
         end
         
       end
       endtask
     
     //-----------------------------------------------------------------------------
     
       task test2;
         `signed8 rs8_1;
         `unsigned8 ru8_2;
       begin
         $display("Test 2 - case item expressions influence case expression:");
         //now one of the items is unsigned - if first approach is valid then all
         //expressions will get unsigned which means that `signed_expr will be 8'b00001000
         //effectively and item2 will print out
         //for other approaches item1 is valid result
     
         rs8_1 = 8'sb11111000;
         ru8_2 = 8'b00001000;
         #1;
         case(`signed_expr)
           rs8_1 : $display("item1");
           ru8_2 : $display("item2 - valid");
           default : $display("default");
         endcase
         
         begin : first
           `unsigned8 temp;
           temp = 1 ? `signed_expr : temp;
           if (temp === rs8_1)
             $display("item1");
           else if (temp === ru8_2)
             $display("item2 - valid");
           else
             $display("default");
         end
     
         begin : second
           `unsigned8 temp;
           temp = `signed_expr;
           if (temp === rs8_1)
             $display("item1 - valid");
           else if (temp === ru8_2)
             $display("item2");
           else
             $display("default");
         end
         
         begin : third
           `signed8 temp;
           temp = `signed_expr;
           if (temp === rs8_1)
             $display("item1 - valid");
           else if (temp === ru8_2)
             $display("item2");
           else
             $display("default");
         end
         
         begin : fourth
           `signed8 temp;
           `signed8 temp1;
           `unsigned8 temp2;
           temp = `signed_expr;
           temp1 = rs8_1;
           if (temp === temp1)
             $display("item1 - valid");
           else begin
             temp2 = ru8_2;
             if (temp === temp2)
               $display("item2");
             else
               $display("default");
           end
         end
         
       end
       endtask
       
     //-----------------------------------------------------------------------------
     
       task test3;
         `signed8 rs8_1;
         `unsigned8 ru8_2;
       begin
         $display("Test 3 - case item expression influence each other:");
         //now one of the item is unsigned which makes difference for the other item
         //this test shows difference between second and third approach
     
         rs8_1 = 8'sb00001000;
         ru8_2 = 8'b00001000;
         #1;
         case(rs8_1)
           `signed_expr : $display("item1 - valid");
           ru8_2 : $display("item2"); //would match if order was different
           default : $display("default");
         endcase
         
         begin : first
           `unsigned8 temp;
           temp = 1 ? rs8_1 : temp;
           if (temp === `signed_expr)
             $display("item1 - valid");
           else if (temp === ru8_2)
             $display("item2"); //would match if order was different
           else
             $display("default");
         end
     
         begin : second
           `unsigned8 temp;
           temp = rs8_1;
           if (temp === `signed_expr)
             $display("item1 - valid");
           else if (temp === ru8_2)
             $display("item2"); //would match if order was different
           else
             $display("default");
         end
         
         begin : third
           `signed8 temp;
           temp = rs8_1;
           if (temp === `signed_expr)
             $display("item1");
           else if (temp === ru8_2)
             $display("item2 - valid");
           else
             $display("default");
         end
         
         begin : fourth
           `signed8 temp;
           `signed8 temp1;
           `unsigned8 temp2;
           temp = rs8_1;
           temp1 = `signed_expr;
           if (temp === temp1)
             $display("item1");
           else begin
             temp2 = ru8_2;
             if (temp === temp2)
               $display("item2 - valid");
             else
               $display("default");
           end
         end
         
       end
       endtask
       
     //-----------------------------------------------------------------------------
     
       task test4;
         `unsigned8 ru8_1;
         `signed8 rs8_2;
       begin
         $display("Test 4 - case expression influences case item expressions:");
         //now case expression is unsigned which makes difference for case item
         //this test shows difference between third and fourth approach
     
         ru8_1 = 8'b11111000;
         rs8_2 = 8'sb00001000;
         #1;
         case(ru8_1)
           `signed_expr : $display("item1");
           rs8_2 : $display("item2");
           default : $display("default - valid");
         endcase
         
         begin : first
           `unsigned8 temp;
           temp = 1 ? ru8_1 : temp;
           if (temp === `signed_expr)
             $display("item1");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default - valid");
         end
     
         begin : second
           `unsigned8 temp;
           temp = ru8_1;
           if (temp === `signed_expr)
             $display("item1");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default - valid");
         end
         
         begin : third
           `unsigned8 temp;
           temp = ru8_1;
           if (temp === `signed_expr)
             $display("item1");
           else if (temp === rs8_2)
             $display("item2");
           else
             $display("default - valid");
         end
         
         begin : fourth
           `unsigned8 temp;
           `signed8 temp1;
           `signed8 temp2;
           temp = ru8_1;
           temp1 = `signed_expr;
           if (temp === temp1)
             $display("item1 - valid");
           else begin
             temp2 = rs8_2;
             if (temp === temp2)
               $display("item2");
             else
               $display("default");
           end
         end
         
       end
       endtask
       
     //-----------------------------------------------------------------------------
     
       initial begin
         test1;
         test2;
         test3;
         test4;
       end
       
       //this block is only to make it more unlikely that compiler will know the
       //values of variables in advance and treat them as constants - delays between
       //value preparations and case constructs are for the same reason
       initial begin
         #10;
         test1.rs8_1 = 0;
         test1.rs8_2 = 0;
         test2.rs8_1 = 0;
         test2.ru8_2 = 0;
         test3.rs8_1 = 0;
         test3.ru8_2 = 0;
         test4.ru8_1 = 0;
         test4.rs8_2 = 0;
         #10;
         test1.rs8_1 = 1;
         test1.rs8_2 = 1;
         test2.rs8_1 = 1;
         test2.ru8_2 = 1;
         test3.rs8_1 = 1;
         test3.ru8_2 = 1;
         test4.ru8_1 = 1;
         test4.rs8_2 = 1;
       end
       
     endmodule
     
     --Sounder_of_Swine_756_000--
     



    This archive was generated by hypermail 2.1.4 : Wed Jun 30 2004 - 11:10:37 PDT and
    sponsored by Boyd Technology, Inc.