iverilog/ivtest/ivltests/assign_op_oob.v

45 lines
954 B
Coq
Raw Normal View History

// Check that the assignment operator is supported for out-of-bounds indices.
// The write should be skipped, but side effects of the right-hand side
// expression should still get evaluated.
module test;
// Check that wider than 32 works
logic [39:0] a[1:0];
integer i;
logic [39:0] j = 0;
function logic [39:0] f;
j++;
return j;
endfunction
initial begin
a[0] = 23;
a[1] = 42;
// Immediate out-of-bounds indices
a[-1] += f();
a[2] += f();
a['hx] += f();
// Variable out-of-bounds indices
i = -1;
a[i] += f();
i = 2;
a[i] += f();
i = 'hx;
a[i] += f();
// Check that the in-bounds elements do not get affected by out-of-bounds
// updates. Check that the left-hand side of the operator assignment gets
// evaluated.
if (a[0] == 23 && a[1] == 42 && j == 6) begin
$display("PASSED");
end else begin
$display("FAILED");
end
end
endmodule