From: Steven Sharp (sharp@cadence.com)
Date: Wed Jun 30 2004 - 11:10:00 PDT
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.