78 lines
2.0 KiB
Systemverilog
78 lines
2.0 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain.
|
|
// SPDX-FileCopyrightText: 2026 PlanV GmbH
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
class Packet;
|
|
rand bit [7:0] addr;
|
|
rand bit [7:0] data;
|
|
|
|
constraint addr_range { addr < 127; }
|
|
constraint data_range { data > 10 && data < 200; }
|
|
|
|
function void check(bit [7:0] a, bit [7:0] d);
|
|
/* verilator lint_off WIDTHTRUNC */
|
|
if (!randomize() with { addr == a; data == d; }) begin
|
|
/* verilator lint_on WIDTHTRUNC */
|
|
$display("Randomization failed.");
|
|
end
|
|
endfunction
|
|
endclass
|
|
|
|
class TestConflict;
|
|
rand bit [7:0] x;
|
|
|
|
constraint c1 { x > 100; }
|
|
constraint c2 { x < 50; }
|
|
|
|
function bit try_randomize();
|
|
/* verilator lint_off WIDTHTRUNC */
|
|
return randomize();
|
|
/* verilator lint_on WIDTHTRUNC */
|
|
endfunction
|
|
endclass
|
|
|
|
module t_constraint_unsat;
|
|
initial begin
|
|
Packet pkt;
|
|
TestConflict tc;
|
|
|
|
pkt = new;
|
|
|
|
// Test 1: Valid randomization
|
|
$display("\n=== Test 1: Valid constraints ===");
|
|
pkt.check(50, 100);
|
|
|
|
// Test 2: addr out of range
|
|
$display("\n=== Test 2: addr out of range ===");
|
|
pkt.check(128, 18);
|
|
|
|
// Test 3: data out of range (too small)
|
|
$display("\n=== Test 3: data out of range (too small) ===");
|
|
pkt.check(100, 5);
|
|
|
|
// Test 4: data out of range (too large)
|
|
$display("\n=== Test 4: data out of range (too large) ===");
|
|
pkt.check(100, 250);
|
|
|
|
// Test 5: Both constraints violated
|
|
$display("\n=== Test 5: Both constraints violated ===");
|
|
pkt.check(200, 5);
|
|
|
|
// Test 6: Conflicting constraints
|
|
$display("\n=== Test 6: Conflicting constraints (x > 100 && x < 50) ===");
|
|
tc = new;
|
|
if (!tc.try_randomize()) begin
|
|
$display("Expected failure: conflicting constraints detected");
|
|
end
|
|
else begin
|
|
$display("ERROR: Should have failed with conflicting constraints");
|
|
$stop;
|
|
end
|
|
|
|
$write("*-* All Finished *-*\n");
|
|
$finish;
|
|
end
|
|
endmodule
|