constraint_mode
Gün 3: Rastgele Üretim ve Kısıtlamalar | Çalışma zamanında kısıtlamaları açma/kapatma
Kaynak Kod
// =============================================================================
// GUN 3 - Konu 6: Calisma Zamaninda Kisitlamalari Acma/Kapatma (constraint_mode)
// =============================================================================
class FlexPacket;
rand bit [15:0] address;
rand bit [31:0] data;
rand bit [2:0] burst_len;
rand bit write_en;
rand bit [1:0] resp;
// Adres araligi kisitlamasi
constraint c_addr_low {
address inside {[16'h0000:16'h00FF]};
}
constraint c_addr_high {
address inside {[16'hFF00:16'hFFFF]};
}
// Veri kisitlamasi
constraint c_data_nonzero {
data != 0;
}
// Burst kisitlamasi
constraint c_burst_aligned {
(burst_len > 0) -> (address[1:0] == 2'b00); // Hizali
}
// Yazma/okuma kisitlamasi
constraint c_write_mode {
write_en == 1;
}
constraint c_read_mode {
write_en == 0;
data == 0;
}
// Hata yaniti kisitlamasi
constraint c_no_error {
resp == 0; // OKAY
}
constraint c_force_error {
resp inside {2'b10, 2'b11}; // SLVERR veya DECERR
}
function new();
// Baslangicta cakisan kisitlamalari kapat
c_addr_high.constraint_mode(0);
c_read_mode.constraint_mode(0);
c_force_error.constraint_mode(0);
endfunction
function void display();
$display(" Addr=0x%04h | Data=0x%08h | Burst=%0d | W/R=%s | Resp=%0b",
address, data, burst_len, write_en ? "WRITE" : "READ", resp);
endfunction
endclass
module constraint_mode_ornek;
initial begin
FlexPacket pkt;
$display("=== constraint_mode Kullanimi ===\n");
pkt = new();
// --- Senaryo 1: Dusuk adres, yazma ---
$display("--- Senaryo 1: Dusuk Adres Yazma ---");
repeat (3) begin
assert(pkt.randomize()) else $fatal(1, "Hata!");
pkt.display();
end
// --- Senaryo 2: Yuksek adres bolgesine gec ---
$display("\n--- Senaryo 2: Yuksek Adres Bolgesi ---");
pkt.c_addr_low.constraint_mode(0); // Dusuk adresi kapat
pkt.c_addr_high.constraint_mode(1); // Yuksek adresi ac
repeat (3) begin
assert(pkt.randomize()) else $fatal(1, "Hata!");
pkt.display();
end
// --- Senaryo 3: Okuma modu ---
$display("\n--- Senaryo 3: Okuma Modu ---");
pkt.c_write_mode.constraint_mode(0); // Yazma kapat
pkt.c_read_mode.constraint_mode(1); // Okuma ac
repeat (3) begin
assert(pkt.randomize()) else $fatal(1, "Hata!");
pkt.display();
end
// --- Senaryo 4: Hata enjeksiyonu ---
$display("\n--- Senaryo 4: Hata Yaniti ---");
pkt.c_read_mode.constraint_mode(0);
pkt.c_write_mode.constraint_mode(1);
pkt.c_no_error.constraint_mode(0); // Normal yaniti kapat
pkt.c_force_error.constraint_mode(1); // Hata yanitini ac
repeat (3) begin
assert(pkt.randomize()) else $fatal(1, "Hata!");
pkt.display();
end
// --- Senaryo 5: Tum kisitlamalari kapat (tam rastgele) ---
$display("\n--- Senaryo 5: Serbest (Tum constraint kapali) ---");
pkt.constraint_mode(0); // TUM kisitlamalari kapat
repeat (3) begin
assert(pkt.randomize()) else $fatal(1, "Hata!");
pkt.display();
end
// --- Durumu sorgula ---
$display("\n--- Constraint Durumlari ---");
pkt.constraint_mode(1); // Hepsini ac
pkt.c_addr_high.constraint_mode(0);
pkt.c_read_mode.constraint_mode(0);
pkt.c_force_error.constraint_mode(0);
$display(" c_addr_low = %0d", pkt.c_addr_low.constraint_mode());
$display(" c_addr_high = %0d", pkt.c_addr_high.constraint_mode());
$display(" c_write_mode = %0d", pkt.c_write_mode.constraint_mode());
$display(" c_read_mode = %0d", pkt.c_read_mode.constraint_mode());
$display("\n=== constraint_mode Sonu ===");
$finish;
end
endmodule