Tests: Check dist bucket draw is per-element in foreach (#8023)
This commit is contained in:
parent
7e116ca601
commit
a3e7f5103d
|
|
@ -6,10 +6,19 @@
|
||||||
|
|
||||||
// Test that dist constraints nested inside if / -> inside foreach produce
|
// Test that dist constraints nested inside if / -> inside foreach produce
|
||||||
// values only within the declared distribution and cover all buckets.
|
// values only within the declared distribution and cover all buckets.
|
||||||
|
//
|
||||||
|
// The bucket draw must also be made PER ELEMENT, not once per solve and then
|
||||||
|
// shared by every element. Counting buckets across all solves cannot tell those
|
||||||
|
// apart: a single hoisted draw still hits both buckets over 100 solves, it just
|
||||||
|
// never mixes them inside one solve. So each block also counts solves in which
|
||||||
|
// at least one element landed in each bucket. With dist {0 := 3, [1:4] := 1}
|
||||||
|
// over 4 elements a per-element draw mixes in about 86 of 100 solves, whereas a
|
||||||
|
// hoisted draw can never mix and gives exactly 0.
|
||||||
|
|
||||||
// verilog_format: off
|
// verilog_format: off
|
||||||
`define stop $stop
|
`define stop $stop
|
||||||
`define checkd(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%0d exp=%0d\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
|
`define checkd(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%0d exp=%0d\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
|
||||||
|
`define check_mixed(what,gotv) do if ((gotv) == 0) begin $write("%%Error: %s:%0d: dist inside foreach+%s: bucket draw is not per-element, no solve mixed buckets\n", `__FILE__,`__LINE__, what); `stop; end while(0);
|
||||||
// verilog_format: on
|
// verilog_format: on
|
||||||
|
|
||||||
// foreach (a[i]) if (gate) a[i] dist {...}
|
// foreach (a[i]) if (gate) a[i] dist {...}
|
||||||
|
|
@ -64,10 +73,14 @@ module t;
|
||||||
begin
|
begin
|
||||||
static ClsIf obj = new();
|
static ClsIf obj = new();
|
||||||
int seen_zero, seen_nonzero;
|
int seen_zero, seen_nonzero;
|
||||||
|
int this_zero, this_nonzero, mixed;
|
||||||
obj.gate = 1'b1;
|
obj.gate = 1'b1;
|
||||||
seen_zero = 0;
|
seen_zero = 0;
|
||||||
seen_nonzero = 0;
|
seen_nonzero = 0;
|
||||||
|
mixed = 0;
|
||||||
repeat (100) begin
|
repeat (100) begin
|
||||||
|
this_zero = 0;
|
||||||
|
this_nonzero = 0;
|
||||||
`checkd(obj.randomize(), 1)
|
`checkd(obj.randomize(), 1)
|
||||||
foreach (obj.a[i]) begin
|
foreach (obj.a[i]) begin
|
||||||
if (obj.a[i] > 4) begin
|
if (obj.a[i] > 4) begin
|
||||||
|
|
@ -75,9 +88,16 @@ module t;
|
||||||
obj.a[i]);
|
obj.a[i]);
|
||||||
$stop;
|
$stop;
|
||||||
end
|
end
|
||||||
if (obj.a[i] == 0) seen_zero++;
|
if (obj.a[i] == 0) begin
|
||||||
else seen_nonzero++;
|
seen_zero++;
|
||||||
|
this_zero++;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
seen_nonzero++;
|
||||||
|
this_nonzero++;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
if (this_zero > 0 && this_nonzero > 0) mixed++;
|
||||||
end
|
end
|
||||||
if (seen_zero == 0 || seen_nonzero == 0) begin
|
if (seen_zero == 0 || seen_nonzero == 0) begin
|
||||||
$write(
|
$write(
|
||||||
|
|
@ -85,16 +105,21 @@ module t;
|
||||||
`__FILE__, `__LINE__, seen_zero, seen_nonzero);
|
`__FILE__, `__LINE__, seen_zero, seen_nonzero);
|
||||||
$stop;
|
$stop;
|
||||||
end
|
end
|
||||||
|
`check_mixed("if", mixed)
|
||||||
end
|
end
|
||||||
|
|
||||||
// Test -> (implication) form
|
// Test -> (implication) form
|
||||||
begin
|
begin
|
||||||
static ClsImpl obj = new();
|
static ClsImpl obj = new();
|
||||||
int seen_zero, seen_nonzero;
|
int seen_zero, seen_nonzero;
|
||||||
|
int this_zero, this_nonzero, mixed;
|
||||||
obj.gate = 1'b1;
|
obj.gate = 1'b1;
|
||||||
seen_zero = 0;
|
seen_zero = 0;
|
||||||
seen_nonzero = 0;
|
seen_nonzero = 0;
|
||||||
|
mixed = 0;
|
||||||
repeat (100) begin
|
repeat (100) begin
|
||||||
|
this_zero = 0;
|
||||||
|
this_nonzero = 0;
|
||||||
`checkd(obj.randomize(), 1)
|
`checkd(obj.randomize(), 1)
|
||||||
foreach (obj.a[i]) begin
|
foreach (obj.a[i]) begin
|
||||||
if (obj.a[i] > 4) begin
|
if (obj.a[i] > 4) begin
|
||||||
|
|
@ -102,9 +127,16 @@ module t;
|
||||||
obj.a[i]);
|
obj.a[i]);
|
||||||
$stop;
|
$stop;
|
||||||
end
|
end
|
||||||
if (obj.a[i] == 0) seen_zero++;
|
if (obj.a[i] == 0) begin
|
||||||
else seen_nonzero++;
|
seen_zero++;
|
||||||
|
this_zero++;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
seen_nonzero++;
|
||||||
|
this_nonzero++;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
if (this_zero > 0 && this_nonzero > 0) mixed++;
|
||||||
end
|
end
|
||||||
if (seen_zero == 0 || seen_nonzero == 0) begin
|
if (seen_zero == 0 || seen_nonzero == 0) begin
|
||||||
$write(
|
$write(
|
||||||
|
|
@ -112,17 +144,22 @@ module t;
|
||||||
`__FILE__, `__LINE__, seen_zero, seen_nonzero);
|
`__FILE__, `__LINE__, seen_zero, seen_nonzero);
|
||||||
$stop;
|
$stop;
|
||||||
end
|
end
|
||||||
|
`check_mixed("->", mixed)
|
||||||
end
|
end
|
||||||
|
|
||||||
// Test doubly-nested -> (chained implication) form
|
// Test doubly-nested -> (chained implication) form
|
||||||
begin
|
begin
|
||||||
static ClsImplChained obj = new();
|
static ClsImplChained obj = new();
|
||||||
int seen_zero, seen_nonzero;
|
int seen_zero, seen_nonzero;
|
||||||
|
int this_zero, this_nonzero, mixed;
|
||||||
obj.gateA = 1'b1;
|
obj.gateA = 1'b1;
|
||||||
obj.gateB = 1'b1;
|
obj.gateB = 1'b1;
|
||||||
seen_zero = 0;
|
seen_zero = 0;
|
||||||
seen_nonzero = 0;
|
seen_nonzero = 0;
|
||||||
|
mixed = 0;
|
||||||
repeat (100) begin
|
repeat (100) begin
|
||||||
|
this_zero = 0;
|
||||||
|
this_nonzero = 0;
|
||||||
`checkd(obj.randomize(), 1)
|
`checkd(obj.randomize(), 1)
|
||||||
foreach (obj.a[i]) begin
|
foreach (obj.a[i]) begin
|
||||||
if (obj.a[i] > 4) begin
|
if (obj.a[i] > 4) begin
|
||||||
|
|
@ -130,9 +167,16 @@ module t;
|
||||||
obj.a[i]);
|
obj.a[i]);
|
||||||
$stop;
|
$stop;
|
||||||
end
|
end
|
||||||
if (obj.a[i] == 0) seen_zero++;
|
if (obj.a[i] == 0) begin
|
||||||
else seen_nonzero++;
|
seen_zero++;
|
||||||
|
this_zero++;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
seen_nonzero++;
|
||||||
|
this_nonzero++;
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
if (this_zero > 0 && this_nonzero > 0) mixed++;
|
||||||
end
|
end
|
||||||
if (seen_zero == 0 || seen_nonzero == 0) begin
|
if (seen_zero == 0 || seen_nonzero == 0) begin
|
||||||
$write(
|
$write(
|
||||||
|
|
@ -140,6 +184,7 @@ module t;
|
||||||
`__FILE__, `__LINE__, seen_zero, seen_nonzero);
|
`__FILE__, `__LINE__, seen_zero, seen_nonzero);
|
||||||
$stop;
|
$stop;
|
||||||
end
|
end
|
||||||
|
`check_mixed("->->", mixed)
|
||||||
end
|
end
|
||||||
|
|
||||||
$write("*-* All Finished *-*\n");
|
$write("*-* All Finished *-*\n");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue