mirror of
https://github.com/verilator/verilator.git
synced 2025-01-07 15:17:36 +00:00
191 lines
5.8 KiB
Verilog
191 lines
5.8 KiB
Verilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed into the Public Domain, for any use,
|
|
// without warranty, 2014 by Wilson Snyder.
|
|
|
|
`define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv)); fail='1; end while(0)
|
|
`define checkf(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%f exp=%f\n", `__FILE__,`__LINE__, (gotv), (expv)); fail='1; end while(0)
|
|
`ifdef VERILATOR
|
|
`define c(v,vs) ($c(vs)) // Don't constify a value
|
|
`else
|
|
`define c(v,vs) (v)
|
|
`endif
|
|
|
|
module t (/*AUTOARG*/
|
|
// Outputs
|
|
ow4_u
|
|
);
|
|
|
|
bit fail;
|
|
|
|
reg signed [3:0] w4_s;
|
|
reg signed [4:0] w5_s;
|
|
reg [2:0] w3_u;
|
|
reg [3:0] w4_u;
|
|
reg [4:0] w5_u;
|
|
reg [5:0] w6_u;
|
|
reg [15:0] w16a_u;
|
|
reg [15:0] w16_u;
|
|
reg [31:0] w32_u;
|
|
real r;
|
|
|
|
reg signed [4:0] bug754_a;
|
|
|
|
integer i;
|
|
|
|
//verilator lint_off WIDTH
|
|
wire a = (5'b0 == (5'sb11111 >>> 3'd7));
|
|
wire b = (5'sb11111 == (5'sb11111 >>> 3'd7));
|
|
wire c = (1'b0+(5'sb11111 >>> 3'd7));
|
|
wire d = (1'sb0+(5'sb11111 >>> 3'd7));
|
|
wire e = (5'b0 == (5'sb11111 / 5'sd3));
|
|
wire f = (5'sb0 == (5'sb11111 / 5'sd3));
|
|
wire g = (5'b01010 == (5'b11111 / 5'sd3));
|
|
initial begin
|
|
// verilator lint_off STMTDLY
|
|
#1;
|
|
`ifdef VCS // I-2014.03
|
|
`checkh({a, b, c, d, e, f, g}, 7'b1101111);
|
|
`else
|
|
`checkh({a, b, c, d, e, f, g}, 7'b1101011);
|
|
`endif
|
|
|
|
//======================================================================
|
|
|
|
if ((-1 >>> 3) != -1) $stop; // Decimals are signed
|
|
|
|
i = 3'sb111 >>> 3;
|
|
`checkh(i, -1);
|
|
i = -1 >>> 3;
|
|
`checkh(i, -1);
|
|
|
|
bug754_a = -1;
|
|
w4_u = |0 != (bug754_a >>> 3'd7);
|
|
`checkh(w4_u, 4'b0);
|
|
|
|
// Sanity check: -1>>7 == -1
|
|
w5_u = (5'sb11111 >>> 3'd7);
|
|
`checkh(w5_u, 5'b11111);
|
|
|
|
// bug756
|
|
w4_u = (5'b0 == (5'sb11111 >>> 3'd7));
|
|
`checkh(w4_u, 4'b0001);
|
|
w4_u = ((5'b0 == (5'sb11111 >>> 3'd7))); // Exp 0 Vlt 0
|
|
`checkh(w4_u, 4'b0001);
|
|
w4_u = ((5'b01111 == (5'sb11111 / 5'sd2))); // Strength-reduces to >>>
|
|
`ifdef VCS // I-2014.03
|
|
`checkh(w4_u, 4'b0000); // Wrong, gets 5'b0==..., unsigned does not propagate
|
|
`else
|
|
`checkh(w4_u, 4'b0001); // NC-Verilog, Modelsim, XSim, ...
|
|
`endif
|
|
|
|
// Does == sign propagate from lhs to rhs? Yes, but not in VCS
|
|
w4_u = ((5'b01010 == (5'sb11111 / 5'sd3))); // Exp 0 Vlt 0 // Must be signed result (-1/3) to make this result zero
|
|
`ifdef VCS // I-2014.03
|
|
`checkh(w4_u, 4'b0000); // Wrong, gets 5'b0==..., unsigned does not propagate
|
|
// Somewhat questionable, as spec says division signed depends on only LHS and RHS, however differs from others
|
|
`else
|
|
`checkh(w4_u, 4'b0001); // NC-Verilog, Modelsim, XSim, ...
|
|
`endif
|
|
|
|
w4_u = (1'b0+(5'sb11111 >>> 3'd7)); // Exp 00000 Vlt 000000 Actually the signedness of result does NOT matter
|
|
`checkh(w4_u, 4'b0000);
|
|
|
|
w4_u = (5'sb0 == (5'sb11111 / 5'sd3)); // Must be signed result (-1/3) to make this result zero
|
|
`checkh(w4_u, 4'b0001);
|
|
// Does == width propagate from lhs to rhs? Yes
|
|
w4_u = (3'b100==(3'b111 << 2));
|
|
`checkh(w4_u, 4'b0001);
|
|
w4_u = (4'b100==(3'b111 << 2));
|
|
`checkh(w4_u, 4'b0000);
|
|
w4_u = (4'b1100==(3'b111 << 2));
|
|
`checkh(w4_u, 4'b0001);
|
|
|
|
// Does >>> sign propagate from input same as for +? Yes
|
|
w4_u = (1'b0+(5'sb11111 >>> 3'd7));
|
|
`checkh(w4_u, 4'b0000);
|
|
w4_u = (1'sb0+(5'sb11111 >>> 3'd7));
|
|
`checkh(w4_u, 4'b1111);
|
|
|
|
// Does << width propagate from input same as for +? Yes
|
|
w4_u = (3'b0+(3'b111 << 2));
|
|
`checkh(w4_u, 4'b1100); // width 4 =='s LHS
|
|
w4_u = (4'b0+(3'b111 << 2));
|
|
`checkh(w4_u, 4'b1100);
|
|
|
|
w4_u = (5'sb11111 == (5'sb11111 >>> 3'd7)); // WHAT? Signedness does propagate across ==?????
|
|
`checkh(w4_u, 4'b0001);
|
|
w4_u = ((5'b0 == (5'sb11111 >>> 3'd7)));
|
|
`checkh(w4_u, 4'b0001);
|
|
|
|
// bug756
|
|
w5_s = -1;
|
|
w3_u = 7;
|
|
w4_u = |0 != (w5_s >>> w3_u);
|
|
`checkh(w4_u, 4'b0000);
|
|
|
|
// bug763
|
|
w3_u = 2;
|
|
w4_u = (w3_u >> 2'b11) >> 1;
|
|
`checkh(w4_u, 4'b0000);
|
|
|
|
// bug766
|
|
w16a_u = 16'h1234;
|
|
w16_u = (w16a_u >> 16) >>> 32'h7ffffff1;
|
|
`checkh(w16_u, 16'h0000);
|
|
|
|
// bug768
|
|
w4_s = 4'sd4;
|
|
w4_u = $signed(5'd1 > w4_s-w4_s);
|
|
`checkh(w4_u, 4'b1111);
|
|
w4_s = `c(4,"4"); // Eval at runtime
|
|
w4_u = $signed(5'd1 > w4_s-w4_s);
|
|
`checkh(w4_u, 4'b1111);
|
|
|
|
// bug772
|
|
w4_s = w4_u << 1 <<< 0/0;
|
|
`ifndef VERILATOR // In v4 can't check value as not 4-state
|
|
`checkh(w4_s, 4'bxxxx);
|
|
`endif
|
|
|
|
// bug773
|
|
w5_u = `c(31, 31);
|
|
w5_s = w5_u >> ((w5_u ? 1 : 2) << w5_u);
|
|
`checkh(w5_s, 5'b0);
|
|
|
|
// bug774
|
|
w4_u = `c(4, 5);
|
|
w6_u = `c(6, 35);
|
|
w4_u = 64'd0 | (w4_u << w6_u);
|
|
`checkh(w4_u, 0);
|
|
|
|
// bug776
|
|
w4_u = `c(4, 1);
|
|
w4_u = (w4_u >> w4_u) ^~ (w4_u >> w4_u);
|
|
`checkh(w4_u, 4'b1111);
|
|
|
|
// bug828
|
|
// verilator lint_off WIDTH
|
|
w32_u = 32'(signed'({4'b0001,5'b10000}) << 3);
|
|
`checkh(w32_u, 32'h0000_0180);
|
|
w32_u = 32'(signed'({4'b0011,5'b10000}) << 3);
|
|
`checkh(w32_u, 32'h0000_0380);
|
|
w32_u = signed'(32'({4'b0001,5'b10000}) << 3);
|
|
`checkh(w32_u, 32'h0000_0180);
|
|
w32_u = signed'(32'({4'b0011,5'b10000}) << 3);
|
|
`checkh(w32_u, 32'h0000_0380);
|
|
// verilator lint_on WIDTH
|
|
w32_u = 32'(signed'({4'b0011,5'b10000})) << 3; // Check no width warning
|
|
`checkh(w32_u, 32'h0000_0380);
|
|
|
|
if (fail) $stop;
|
|
$write("*-* All Finished *-*\n");
|
|
$finish;
|
|
end
|
|
|
|
// bug775
|
|
output [3:0] ow4_u; // Must be consumed
|
|
assign ow4_u = ((0/0) ? 1 : 2) % 0;
|
|
|
|
endmodule
|