iverilog/docs/randomize.md

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() returns 1 on success (null / unknown class type → 0)
  • Assigns random 0/1 bits to all rand and randc integral (bit/logic/reg packed) instance properties
  • Non-rand properties are unchanged
  • randc is treated like rand for 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 randc cyclic behavior
  • Randomizing non-integral properties (reals, strings, class handles, arrays)
  • std::randomize procedural 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.