iverilog/ivtest/ivltests/undefined_shift.v

164 lines
4.0 KiB
Verilog

// Check that when the right hand operand of a shift operation
// contains 'x' or 'z' bits, the result is undefined.
module test;
reg pass;
reg signed [3:0] lhs;
reg [3:0] rhs;
reg [3:0] res;
wire [3:0] res1 = lhs << rhs;
wire [3:0] res2 = lhs >> rhs;
wire [3:0] res3 = lhs >>> rhs;
wire [3:0] res4 = lhs << 4'b000x;
wire [3:0] res5 = lhs >> 4'b00x0;
wire [3:0] res6 = lhs >>> 4'b0z00;
wire [3:0] res7 = 4'd1 << 4'b000x;
wire [3:0] res8 = 4'd1 >> 4'b00x0;
wire [3:0] res9 = 4'd1 >>> 4'b0z00;
wire [3:0] res10 = 4'd0 << rhs;
wire [3:0] res11 = 4'd0 >> rhs;
wire [3:0] res12 = 4'd0 >>> rhs;
initial begin
pass = 1'b1;
lhs = 4'd1;
if (res1 !== 4'bxxxx) begin
$display("FAILED test 1, expected 4'bxxxx, got 4'b%b", res1);
pass = 1'b0;
end
if (res2 !== 4'bxxxx) begin
$display("FAILED test 2, expected 4'bxxxx, got 4'b%b", res2);
pass = 1'b0;
end
if (res3 !== 4'bxxxx) begin
$display("FAILED test 3, expected 4'bxxxx, got 4'b%b", res3);
pass = 1'b0;
end
if (res4 !== 4'bxxxx) begin
$display("FAILED test 4, expected 4'bxxxx, got 4'b%b", res4);
pass = 1'b0;
end
if (res5 !== 4'bxxxx) begin
$display("FAILED test 5, expected 4'bxxxx, got 4'b%b", res5);
pass = 1'b0;
end
if (res6 !== 4'bxxxx) begin
$display("FAILED test 6, expected 4'bxxxx, got 4'b%b", res6);
pass = 1'b0;
end
if (res7 !== 4'bxxxx) begin
$display("FAILED test 7, expected 4'bxxxx, got 4'b%b", res7);
pass = 1'b0;
end
if (res8 !== 4'bxxxx) begin
$display("FAILED test 8, expected 4'bxxxx, got 4'b%b", res8);
pass = 1'b0;
end
if (res9 !== 4'bxxxx) begin
$display("FAILED test 9, expected 4'bxxxx, got 4'b%b", res9);
pass = 1'b0;
end
if (res10 !== 4'bxxxx) begin
$display("FAILED test 10, expected 4'bxxxx, got 4'b%b", res10);
pass = 1'b0;
end
if (res11 !== 4'bxxxx) begin
$display("FAILED test 11, expected 4'bxxxx, got 4'b%b", res11);
pass = 1'b0;
end
if (res12 !== 4'bxxxx) begin
$display("FAILED test 12, expected 4'bxxxx, got 4'b%b", res12);
pass = 1'b0;
end
res = lhs << rhs;
if (res !== 4'bxxxx) begin
$display("FAILED test 13, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = lhs >> rhs;
if (res !== 4'bxxxx) begin
$display("FAILED test 14, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = lhs >>> rhs;
if (res !== 4'bxxxx) begin
$display("FAILED test 15, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = lhs << 4'b000x;
if (res !== 4'bxxxx) begin
$display("FAILED test 16, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = lhs >> 4'b00x0;
if (res !== 4'bxxxx) begin
$display("FAILED test 17, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = lhs >>> 4'b0z00;
if (res !== 4'bxxxx) begin
$display("FAILED test 18, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = 4'd1 << 4'b000x;
if (res !== 4'bxxxx) begin
$display("FAILED test 19, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = 4'd1 >> 4'b00x0;
if (res !== 4'bxxxx) begin
$display("FAILED test 20, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = 4'd1 >>> 4'b0z00;
if (res !== 4'bxxxx) begin
$display("FAILED test 21, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = 4'd0 << rhs;
if (res !== 4'bxxxx) begin
$display("FAILED test 22, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = 4'd0 >> rhs;
if (res !== 4'bxxxx) begin
$display("FAILED test 23, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
res = 4'd0 >>> rhs;
if (res !== 4'bxxxx) begin
$display("FAILED test 24, expected 4'bxxxx, got 4'b%b", res);
pass = 1'b0;
end
if (pass) $display("PASSED");
end
endmodule