iverilog/ivtest/ivltests/pr2986528.v

50 lines
1.2 KiB
Verilog

// Icarus has a number of places where it can calculate %.
module top;
parameter out0 = 64'shF333333333333392 % 3'sd3;
reg passed;
wire signed [63:0] in;
wire signed [2:0] const_w0;
reg signed [63:0] out1;
wire signed [63:0] out2;
reg signed [63:0] out3;
assign in = 64'hF333333333333392;
assign const_w0 = 3'sd3;
always @* begin
out1 = (in % const_w0);
end
assign out2 = (in % const_w0);
initial begin
passed = 1'b1;
#1;
$display("Testing %0d %% %0d.", in, const_w0);
// Check the parameter result.
if (out0 !== -2) begin
$display("Failed: constant %%, expected -2, got %0d.", out0);
passed = 1'b0;
end
// Check the always result.
if (out1 !== -2) begin
$display("Failed: procedural %%, expected -2, got %0d.", out1);
passed = 1'b0;
end
// Check the CA result.
if (out2 !== -2) begin
$display("Failed: CA %%, expected -2, got %0d.", out2);
passed = 1'b0;
end
// Check a compile time constant result.
out3 = 64'shF333333333333392 % 3'sd3;
if (out3 !== -2) begin
$display("Failed: CA %%, expected -2, got %0d.", out3);
passed = 1'b0;
end
if (passed) $display("PASSED");
$finish;
end
endmodule