Döngüsel Kısıtlamalar
Gün 3: Rastgele Üretim ve Kısıtlamalar | foreach ile dizi kısıtlamaları, unique, matris kısıtlamaları
Kaynak Kod
// =============================================================================
// GUN 3 - Konu 4: Dongusel Kisitlamalar (Iterative Constraints - foreach)
// =============================================================================
class ArrayPacket;
rand bit [7:0] payload []; // Dinamik dizi
rand int length;
rand bit [3:0] header [4]; // Sabit boyutlu dizi
// Dizi boyutu kisitlamasi
constraint c_length {
length inside {[4:16]};
payload.size() == length;
}
// foreach ile eleman kisitlamalari
constraint c_payload {
foreach (payload[i]) {
payload[i] inside {[8'h01:8'hFE]}; // 0x00 ve 0xFF haric
if (i > 0)
payload[i] != payload[i-1]; // Ardisik elemanlar farkli
}
}
// Header: artan sira
constraint c_header_ordered {
foreach (header[i]) {
if (i > 0)
header[i] > header[i-1]; // Kesin artan
}
header[0] >= 1;
}
function void display();
$display(" Length=%0d", length);
$write(" Header: ");
foreach (header[i]) $write("%0d ", header[i]);
$display();
$write(" Payload: ");
foreach (payload[i]) $write("%02h ", payload[i]);
$display();
endfunction
endclass
class UniqueArray;
rand int data [8];
// Tum elemanlar benzersiz olmali
constraint c_unique {
unique {data};
foreach (data[i])
data[i] inside {[1:100]};
}
function void display();
$write(" Unique data: ");
foreach (data[i]) $write("%0d ", data[i]);
$display();
endfunction
endclass
class Matrix;
rand bit [3:0] grid [4][4];
// Her satir toplami 20'den kucuk
constraint c_row_sum {
foreach (grid[i]) {
grid[i].sum() < 20;
}
}
// Kosegen elemanlari sifir olmasin
constraint c_diagonal {
foreach (grid[i]) {
grid[i][i] > 0;
}
}
function void display();
$display(" 4x4 Matris:");
foreach (grid[i]) begin
$write(" [");
foreach (grid[i][j])
$write("%2d ", grid[i][j]);
$display("] toplam=%0d", grid[i].sum());
end
endfunction
endclass
module iterative_constraints;
initial begin
ArrayPacket apkt;
UniqueArray uarr;
Matrix mat;
$display("=== Dongusel Kisitlamalar (foreach) ===\n");
// --- Dizi kisitlamalari ---
$display("--- ArrayPacket ---");
apkt = new();
repeat (3) begin
assert(apkt.randomize()) else $fatal(1, "Randomize hata!");
apkt.display();
$display();
end
// --- Benzersiz elemanlar ---
$display("--- UniqueArray ---");
uarr = new();
repeat (3) begin
assert(uarr.randomize()) else $fatal(1, "Randomize hata!");
uarr.display();
end
// --- Matris kisitlamalari ---
$display("\n--- Matrix ---");
mat = new();
repeat (2) begin
assert(mat.randomize()) else $fatal(1, "Randomize hata!");
mat.display();
$display();
end
$display("=== Dongusel Kisitlamalar Sonu ===");
$finish;
end
endmodule