In reply to ben@SystemVerilog.us:
Another cut at the use of the function with more debug features.
Still an issue.
function bit mask_validation(bit [7:0]mask);
bit a_one_occurred = 0;
bit zero_after_one = 0;
bit fail=0;
$display("Mask in call before loop %8b, fail= %d",mask, fail);
foreach(mask[i]) begin // Mask is 01110010::b=00011010
$display("i= %d", i);
case({a_one_occurred, zero_after_one})
2'b00: if(mask[i]) a_one_occurred=1'b1;
//2'b01: if(mask[i]) a_one_occurred=1'b1;
2'b10: if(mask[i]==1'b0) zero_after_one=1'b1;
2'b11: if(mask[i]) fail=1'b1; // mask[i]==1'b0; // must be 0
endcase
end
$display("Mask in call %8b, fail= %d",mask, fail);
$display("a_one_occurred %d, zero_after_one %d", a_one_occurred, zero_after_one);
return fail;
endfunction
constraint nonzero_b{b != 8'b00000000;}
constraint nonzero_mask{mask!=8'b00000000;}
constraint valid_maskF{mask_validation(mask) == 1;}
// In above constraint we need a ==0, but that causes "No solutions exist"
// The ==1 shows the displays for 1 randomize cal
/* # Mask in call before loop 11001111, fail= 0
# i= 7
# i= 6
# i= 5
# i= 4
# i= 3
# i= 2
# i= 1
# i= 0
# Mask in call 11001111, fail= 1
# a_one_occurred 1, zero_after_one 1
# Mask is 11001111::b=11010000 */