rand ve randc
Gün 3: Rastgele Üretim ve Kısıtlamalar | Rastgele değişkenler: rand (rastgele) ve randc (döngüsel)
Kaynak Kod
// =============================================================================
// GUN 3 - Konu 1: Rastgele Test ve rand/randc Degiskenleri
// =============================================================================
class Packet;
// rand: Her randomize() cagrisinda rastgele deger uretir
rand bit [7:0] data;
rand bit [3:0] addr;
rand bit [1:0] burst_type;
// randc: Tum olasi degerleri tuketmeden tekrar etmez (cyclic random)
randc bit [2:0] priority; // 0-7 arasi, her biri bir kez, sonra tekrar
// Rastgele olmayan degiskenler
int id;
static int count = 0;
function new();
this.id = count++;
endfunction
function void display();
$display(" Paket #%0d: data=0x%02h, addr=0x%01h, burst=%0d, priority=%0d",
id, data, addr, burst_type, priority);
endfunction
endclass
module rand_ve_randc;
initial begin
Packet pkt;
$display("=== rand ve randc Degiskenleri ===\n");
pkt = new();
// --- rand: Her seferinde rastgele ---
$display("--- rand: 10 rastgele paket ---");
repeat (10) begin
if (!pkt.randomize())
$fatal(1, "Randomize basarisiz!");
pkt.display();
end
// --- randc: Dongusel rastgele ---
$display("\n--- randc: priority (0-7 dongusel) ---");
$display(" Ilk dongu (8 deger):");
repeat (8) begin
void'(pkt.randomize());
$display(" priority = %0d", pkt.priority);
end
$display(" Ikinci dongu (tekrar 8 deger, farkli sira):");
repeat (8) begin
void'(pkt.randomize());
$display(" priority = %0d", pkt.priority);
end
// --- std::randomize (sinif disinda) ---
$display("\n--- std::randomize (Bagimsiz) ---");
begin
int x, y;
repeat (5) begin
if (!std::randomize(x, y) with { x inside {[1:100]}; y < x; })
$fatal(1, "std::randomize basarisiz!");
$display(" x = %0d, y = %0d", x, y);
end
end
$display("\n=== rand ve randc Sonu ===");
$finish;
end
endmodule