iverilog/ivtest/ivltests/pr2138979d.v

254 lines
9.5 KiB
Coq
Raw Normal View History

module signed_logic_operators_bug();
reg sel;
reg [7:0] a, b;
reg [5:0] c;
wire [15:0] y_mux_uu, y_mux_us, y_mux_su, y_mux_ss;
wire y_eql_uu, y_eql_us, y_eql_su, y_eql_ss;
wire y_neq_uu, y_neq_us, y_neq_su, y_neq_ss;
wire [15:0] y_sgn_u, y_sgn_s;
wire [15:0] y_add_uu, y_add_us, y_add_su, y_add_ss;
wire [15:0] y_sub_uu, y_sub_us, y_sub_su, y_sub_ss;
wire [15:0] y_mul_uu, y_mul_us, y_mul_su, y_mul_ss;
wire y_ltn_uu, y_ltn_us, y_ltn_su, y_ltn_ss;
wire y_leq_uu, y_leq_us, y_leq_su, y_leq_ss;
wire [15:0] z_mux_uu, z_mux_us, z_mux_su, z_mux_ss;
wire z_eql_uu, z_eql_us, z_eql_su, z_eql_ss;
wire z_neq_uu, z_neq_us, z_neq_su, z_neq_ss;
wire [15:0] z_sgn_u, z_sgn_s;
wire [15:0] z_add_uu, z_add_us, z_add_su, z_add_ss;
wire [15:0] z_sub_uu, z_sub_us, z_sub_su, z_sub_ss;
wire [15:0] z_mul_uu, z_mul_us, z_mul_su, z_mul_ss;
wire z_ltn_uu, z_ltn_us, z_ltn_su, z_ltn_ss;
wire z_leq_uu, z_leq_us, z_leq_su, z_leq_ss;
integer i;
initial begin
for (i = 0; i < 100; i = i + 1) begin
// Example vector
sel = $random;
a = $random;
b = $random;
c = $random;
// Wait for results to be calculated
#1;
// Display results
$display("sel = %b", sel);
$display("a = %b", a);
$display("b = %b", b);
$display("c = %b", c);
$display("y_mux_uu = %b y_mux_us = %b y_mux_su = %b y_mux_ss = %b", y_mux_uu, y_mux_us, y_mux_su, y_mux_ss);
$display("z_mux_uu = %b z_mux_us = %b z_mux_su = %b z_mux_ss = %b", z_mux_uu, z_mux_us, z_mux_su, z_mux_ss);
$display("y_eql_uu = %b y_eql_us = %b y_eql_su = %b y_eql_ss = %b", y_eql_uu, y_eql_us, y_eql_su, y_eql_ss);
$display("z_eql_uu = %b z_eql_us = %b z_eql_su = %b z_eql_ss = %b", z_eql_uu, z_eql_us, z_eql_su, z_eql_ss);
$display("y_neq_uu = %b y_neq_us = %b y_neq_su = %b y_neq_ss = %b", y_neq_uu, y_neq_us, y_neq_su, y_neq_ss);
$display("z_neq_uu = %b z_neq_us = %b z_neq_su = %b z_neq_ss = %b", z_neq_uu, z_neq_us, z_neq_su, z_neq_ss);
$display("y_sgn_u = %b y_sgn_s = %b" , y_sgn_u, y_sgn_s);
$display("z_sgn_u = %b z_sgn_s = %b" , z_sgn_u, z_sgn_s);
$display("y_add_uu = %b y_add_us = %b y_add_su = %b y_add_ss = %b", y_add_uu, y_add_us, y_add_su, y_add_ss);
$display("z_add_uu = %b z_add_us = %b z_add_su = %b z_add_ss = %b", z_add_uu, z_add_us, z_add_su, z_add_ss);
$display("y_sub_uu = %b y_sub_us = %b y_sub_su = %b y_sub_ss = %b", y_sub_uu, y_sub_us, y_sub_su, y_sub_ss);
$display("z_sub_uu = %b z_sub_us = %b z_sub_su = %b z_sub_ss = %b", z_sub_uu, z_sub_us, z_sub_su, z_sub_ss);
$display("y_mul_uu = %b y_mul_us = %b y_mul_su = %b y_mul_ss = %b", y_mul_uu, y_mul_us, y_mul_su, y_mul_ss);
$display("z_mul_uu = %b z_mul_us = %b z_mul_su = %b z_mul_ss = %b", z_mul_uu, z_mul_us, z_mul_su, z_mul_ss);
$display("y_ltn_uu = %b y_ltn_us = %b y_ltn_su = %b y_ltn_ss = %b", y_ltn_uu, y_ltn_us, y_ltn_su, y_ltn_ss);
$display("z_ltn_uu = %b z_ltn_us = %b z_ltn_su = %b z_ltn_ss = %b", z_ltn_uu, z_ltn_us, z_ltn_su, z_ltn_ss);
$display("y_leq_uu = %b y_leq_us = %b y_leq_su = %b y_leq_ss = %b", y_leq_uu, y_leq_us, y_leq_su, y_leq_ss);
$display("z_leq_uu = %b z_leq_us = %b z_leq_su = %b z_leq_ss = %b", z_leq_uu, z_leq_us, z_leq_su, z_leq_ss);
end
// Finished
$finish(0);
end
// Manually sign extended operators
manually_extended_operators INST1(
sel,
a, b,
c,
y_mux_uu, y_mux_us, y_mux_su, y_mux_ss,
y_eql_uu, y_eql_us, y_eql_su, y_eql_ss,
y_neq_uu, y_neq_us, y_neq_su, y_neq_ss,
y_sgn_u, y_sgn_s,
y_add_uu, y_add_us, y_add_su, y_add_ss,
y_sub_uu, y_sub_us, y_sub_su, y_sub_ss,
y_mul_uu, y_mul_us, y_mul_su, y_mul_ss,
y_ltn_uu, y_ltn_us, y_ltn_su, y_ltn_ss,
y_leq_uu, y_leq_us, y_leq_su, y_leq_ss
);
// $signed() sign extended operators
signed_operators INST2(
sel,
a, b,
c,
z_mux_uu, z_mux_us, z_mux_su, z_mux_ss,
z_eql_uu, z_eql_us, z_eql_su, z_eql_ss,
z_neq_uu, z_neq_us, z_neq_su, z_neq_ss,
z_sgn_u, z_sgn_s,
z_add_uu, z_add_us, z_add_su, z_add_ss,
z_sub_uu, z_sub_us, z_sub_su, z_sub_ss,
z_mul_uu, z_mul_us, z_mul_su, z_mul_ss,
z_ltn_uu, z_ltn_us, z_ltn_su, z_ltn_ss,
z_leq_uu, z_leq_us, z_leq_su, z_leq_ss
);
endmodule
module signed_operators(
sel,
a, b,
c,
mux_uu, mux_us, mux_su, mux_ss,
eql_uu, eql_us, eql_su, eql_ss,
neq_uu, neq_us, neq_su, neq_ss,
sgn_u, sgn_s,
add_uu, add_us, add_su, add_ss,
sub_uu, sub_us, sub_su, sub_ss,
mul_uu, mul_us, mul_su, mul_ss,
ltn_uu, ltn_us, ltn_su, ltn_ss,
leq_uu, leq_us, leq_su, leq_ss
);
input sel;
input [7:0] a, b;
input [5:0] c;
output [15:0] mux_uu, mux_us, mux_su, mux_ss;
output eql_uu, eql_us, eql_su, eql_ss;
output neq_uu, neq_us, neq_su, neq_ss;
output [15:0] sgn_u, sgn_s;
output [15:0] add_uu, add_us, add_su, add_ss;
output [15:0] sub_uu, sub_us, sub_su, sub_ss;
output [15:0] mul_uu, mul_us, mul_su, mul_ss;
output ltn_uu, ltn_us, ltn_su, ltn_ss;
output leq_uu, leq_us, leq_su, leq_ss;
// Note that the operation is only consider signed if ALL data operands are signed
// - Therefore $signed(a) does NOT sign extend "a" in expression "X_su"
// - But "a" and "b" are both sign extended before the operation in expression "X_ss"
assign mux_uu = sel ? a : b ;
assign mux_us = sel ? a : $signed(b);
assign mux_su = sel ? $signed(a) : b ;
assign mux_ss = sel ? $signed(a) : $signed(b);
assign eql_uu = a == c ;
assign eql_us = a == $signed(c);
assign eql_su = $signed(a) == c ;
assign eql_ss = $signed(a) == $signed(c);
assign neq_uu = a != c ;
assign neq_us = a != $signed(c);
assign neq_su = $signed(a) != c ;
assign neq_ss = $signed(a) != $signed(c);
assign sgn_u = ~$unsigned(c) ;
assign sgn_s = ~$signed(c) ;
assign add_uu = a + c ;
assign add_us = a + $signed(c);
assign add_su = $signed(a) + c ;
assign add_ss = $signed(a) + $signed(c);
assign sub_uu = a - c ;
assign sub_us = a - $signed(c);
assign sub_su = $signed(a) - c ;
assign sub_ss = $signed(a) - $signed(c);
assign mul_uu = a * c ;
assign mul_us = a * $signed(c);
assign mul_su = $signed(a) * c ;
assign mul_ss = $signed(a) * $signed(c);
assign ltn_uu = a < c ;
assign ltn_us = a < $signed(c);
assign ltn_su = $signed(a) < c ;
assign ltn_ss = $signed(a) < $signed(c);
assign leq_uu = a <= c ;
assign leq_us = a <= $signed(c);
assign leq_su = $signed(a) <= c ;
assign leq_ss = $signed(a) <= $signed(c);
endmodule
module manually_extended_operators(
sel,
a, b,
c,
mux_uu, mux_us, mux_su, mux_ss,
eql_uu, eql_us, eql_su, eql_ss,
neq_uu, neq_us, neq_su, neq_ss,
sgn_u, sgn_s,
add_uu, add_us, add_su, add_ss,
sub_uu, sub_us, sub_su, sub_ss,
mul_uu, mul_us, mul_su, mul_ss,
ltn_uu, ltn_us, ltn_su, ltn_ss,
leq_uu, leq_us, leq_su, leq_ss
);
input sel;
input [7:0] a, b;
input [5:0] c;
output [15:0] mux_uu, mux_us, mux_su, mux_ss;
output eql_uu, eql_us, eql_su, eql_ss;
output neq_uu, neq_us, neq_su, neq_ss;
output [15:0] sgn_u, sgn_s;
output [15:0] add_uu, add_us, add_su, add_ss;
output [15:0] sub_uu, sub_us, sub_su, sub_ss;
output [15:0] mul_uu, mul_us, mul_su, mul_ss;
output ltn_uu, ltn_us, ltn_su, ltn_ss;
output leq_uu, leq_us, leq_su, leq_ss;
// Manually zero or sign extend operands before the operation.
// - Note the operands are zero extended in "X_uu", "X_us" and "X_su"
// - The operands are sign extended in "X_ss"
assign mux_uu = sel ? {{8{1'b0}}, a} : {{8{1'b0}}, b};
assign mux_us = sel ? {{8{1'b0}}, a} : {{8{1'b0}}, b};
assign mux_su = sel ? {{8{1'b0}}, a} : {{8{1'b0}}, b};
assign mux_ss = sel ? {{8{a[7]}}, a} : {{8{b[7]}}, b};
assign eql_uu = {a} == {{2{1'b0}}, c};
assign eql_us = {a} == {{2{1'b0}}, c};
assign eql_su = {a} == {{2{1'b0}}, c};
assign eql_ss = {a} == {{2{c[5]}}, c};
assign neq_uu = {a} != {{2{1'b0}}, c};
assign neq_us = {a} != {{2{1'b0}}, c};
assign neq_su = {a} != {{2{1'b0}}, c};
assign neq_ss = {a} != {{2{c[5]}}, c};
assign sgn_u = ~{{10{1'b0}}, c} ;
assign sgn_s = ~{{10{c[5]}}, c} ;
assign add_uu = {{8{1'b0}}, a} + {{10{1'b0}}, c};
assign add_us = {{8{1'b0}}, a} + {{10{1'b0}}, c};
assign add_su = {{8{1'b0}}, a} + {{10{1'b0}}, c};
assign add_ss = {{8{a[7]}}, a} + {{10{c[5]}}, c};
assign sub_uu = {{8{1'b0}}, a} - {{10{1'b0}}, c};
assign sub_us = {{8{1'b0}}, a} - {{10{1'b0}}, c};
assign sub_su = {{8{1'b0}}, a} - {{10{1'b0}}, c};
assign sub_ss = {{8{a[7]}}, a} - {{10{c[5]}}, c};
assign mul_uu = {{8{1'b0}}, a} * {{10{1'b0}}, c};
assign mul_us = {{8{1'b0}}, a} * {{10{1'b0}}, c};
assign mul_su = {{8{1'b0}}, a} * {{10{1'b0}}, c};
assign mul_ss = {{8{a[7]}}, a} * {{10{c[5]}}, c};
assign ltn_uu = {{8{1'b0}}, a} < {{10{1'b0}}, c};
assign ltn_us = {{8{1'b0}}, a} < {{10{1'b0}}, c};
assign ltn_su = {{8{1'b0}}, a} < {{10{1'b0}}, c};
assign ltn_ss = {c[5],{7{a[7]}}, a} < {a[7],{9{c[5]}}, c};
assign leq_uu = {{8{1'b0}}, a} <= {{10{1'b0}}, c};
assign leq_us = {{8{1'b0}}, a} <= {{10{1'b0}}, c};
assign leq_su = {{8{1'b0}}, a} <= {{10{1'b0}}, c};
assign leq_ss = {c[5],{7{a[7]}}, a} <= {a[7],{9{c[5]}}, c};
endmodule