In reply to qkuang:
A key part of this problem is the diagonals have different lengths. You need to guard
module top;
parameter N = 8;
class queen_board;
rand bit queen_b[N][N];
constraint c {
foreach(queen_b[i]) {
queen_b[i].sum() with (int'(item)) == 1; // row
queen_b.sum(b) with (int'(queen_b[b.index][i])) == 1; // col
// descending diagonals
queen_b.sum(b) with (i+b.index<N? int'(queen_b[b.index][i+b.index]) : 0) <= 1;
queen_b.sum(b) with (i+b.index<N? int'(queen_b[i+b.index][b.index]) : 0) <= 1;
// ascending diagonals
queen_b.sum(b) with (i+b.index<N? int'(queen_b[N-1-i-b.index][N-1-b.index]) : 0) <= 1;
queen_b.sum(b) with (i+b.index<N? int'(queen_b[N-1-b.index][N-1-i-b.index]) : 0) <= 1;
}
}
endclass
queen_board qb = new;
initial repeat(5) begin
assert(qb.randomize());
foreach(qb.queen_b[i]) $display("%p",qb.queen_b[i]);
$display;
end
endmodule