mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-08-28 16:53:45 +02:00
By adding ivtest to the iverilog source tree, it is easier to keep the regression test synchronized with the source that is being tested. This should be especially helpful for PRs that add a new feature, and have a matching ivtest PR with the regression test for that feature.
114 lines
2.8 KiB
Verilog
114 lines
2.8 KiB
Verilog
// Check behaviour with out-of-range and undefined array indices
|
|
// on LHS of procedural continuous (reg) assignment.
|
|
|
|
`ifdef __ICARUS__
|
|
`define SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
|
|
`endif
|
|
|
|
module top;
|
|
|
|
reg [1:0] array1[2:1];
|
|
reg [1:0] array2[1:0];
|
|
|
|
reg [1:0] var1;
|
|
|
|
`ifndef VLOG95
|
|
real array3[2:1];
|
|
real array4[1:0];
|
|
|
|
real var2;
|
|
`endif
|
|
|
|
reg failed;
|
|
|
|
initial begin
|
|
failed = 0;
|
|
|
|
array1[1] = 2'd0;
|
|
array1[2] = 2'd0;
|
|
|
|
array2[0] = 2'd0;
|
|
array2[1] = 2'd0;
|
|
|
|
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
|
|
assign array1[0] = 2'd1;
|
|
#1 $display("array = %h %h", array1[2], array1[1]);
|
|
if ((array1[1] !== 2'd0) || (array1[2] !== 2'd0)) failed = 1;
|
|
deassign array1[0];
|
|
`endif
|
|
|
|
assign array1[1] = 2'd1;
|
|
#1 $display("array = %h %h", array1[2], array1[1]);
|
|
if ((array1[1] !== 2'd1) || (array1[2] !== 2'd0)) failed = 1;
|
|
deassign array1[1];
|
|
|
|
assign array1[2] = var1;
|
|
var1 = 2'd1;
|
|
#1 $display("array = %h %h", array1[2], array1[1]);
|
|
if ((array1[1] !== 2'd0) || (array1[2] !== 2'd1)) failed = 1;
|
|
var1 = 2'd2;
|
|
#1 $display("array = %h %h", array1[2], array1[1]);
|
|
if ((array1[1] !== 2'd0) || (array1[2] !== 2'd2)) failed = 1;
|
|
deassign array1[2];
|
|
|
|
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
|
|
assign array1[3] = var1;
|
|
#1 $display("array = %h %h", array1[2], array1[1]);
|
|
if ((array1[1] !== 2'd0) || (array1[2] !== 2'd0)) failed = 1;
|
|
deassign array1[3];
|
|
|
|
assign array2['bx] = 2'd1;
|
|
#1 $display("array = %h %h", array2[1], array2[0]);
|
|
if ((array2[0] !== 2'd0) || (array2[1] !== 2'd0)) failed = 1;
|
|
deassign array2['bx];
|
|
`endif
|
|
|
|
`ifndef VLOG95
|
|
array3[1] = 0.0;
|
|
array3[2] = 0.0;
|
|
|
|
array4[0] = 0.0;
|
|
array4[1] = 0.0;
|
|
|
|
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
|
|
assign array3[0] = 1.0;
|
|
#1 $display("array = %0g %0g", array3[2], array3[1]);
|
|
if ((array3[1] != 0.0) || (array3[2] != 0.0)) failed = 1;
|
|
deassign array3[0];
|
|
`endif
|
|
|
|
assign array3[1] = 1.0;
|
|
#1 $display("array = %0g %0g", array3[2], array3[1]);
|
|
if ((array3[1] != 1.0) || (array3[2] != 0.0)) failed = 1;
|
|
deassign array3[1];
|
|
|
|
assign array3[2] = var2;
|
|
var2 = 1.0;
|
|
#1 $display("array = %0g %0g", array3[2], array3[1]);
|
|
if ((array3[1] != 0.0) || (array3[2] != 1.0)) failed = 1;
|
|
var2 = 2.0;
|
|
#1 $display("array = %0g %0g", array3[2], array3[1]);
|
|
if ((array3[1] != 0.0) || (array3[2] != 2.0)) failed = 1;
|
|
deassign array3[2];
|
|
|
|
`ifdef SUPPORT_CONST_OUT_OF_RANGE_IN_IVTEST
|
|
assign array3[3] = var2;
|
|
#1 $display("array = %0g %0g", array3[2], array3[1]);
|
|
if ((array3[1] != 0.0) || (array3[2] != 0.0)) failed = 1;
|
|
deassign array3[3];
|
|
|
|
assign array4['bx] = 1.0;
|
|
#1 $display("array = %0g %0g", array4[1], array4[0]);
|
|
if ((array4[0] != 0.0) || (array4[1] != 0.0)) failed = 1;
|
|
deassign array4['bx];
|
|
`endif
|
|
`endif
|
|
|
|
if (failed)
|
|
$display("FAILED");
|
|
else
|
|
$display("PASSED");
|
|
end
|
|
|
|
endmodule
|