1.7 KiB
1.7 KiB
Unconstrained randomize() / rand (Tier A #6, first slice)
Status: partial — unconstrained integral rand/randc only; no constraint solver.
Supported in this slice
class pkt;
rand bit [7:0] a;
rand bit [3:0] b;
bit [7:0] c; // non-rand left alone
function new(); c = 8'h11; endfunction
endclass
pkt p = new;
bit ok = p.randomize(); // returns 1; assigns random values to a,b
obj.randomize()returns1on success (null / unknown class type →0)- Assigns random 0/1 bits to all
randandrandcintegral (bit/logic/regpacked) instance properties - Non-rand properties are unchanged
randcis treated likerandfor now (no cyclic guarantee)
Encoding
| Layer | Role |
|---|---|
| Parse | rand/randc already property qualifiers; constraint / randomize() with remain sorry |
| Elab | obj.randomize() → $ivl_randomize(obj) (expr or task) |
| Target API | ivl_type_prop_rand() exposes qualifiers to codegen |
| Codegen | %urandom <wid> + %store/prop/v per rand property |
| Runtime | %urandom fills vec4 with RNG bits (std::mt19937) |
Deferred (do not claim)
- Constraint blocks / solver
randomize() with { ... }rand_mode/constraint_mode- True
randccyclic behavior - Randomizing non-integral properties (reals, strings, class handles, arrays)
std::randomizeprocedural form / inline constraints
Example
examples/randomize/randomize_basic.sv — prints PASSED.
./install/bin/iverilog -g2012 -o /tmp/rand.vvp examples/randomize/randomize_basic.sv
./install/bin/vvp /tmp/rand.vvp
See also STATUS.md and ROADMAP.md.