systemverilog bonus

Verilog to SystemVerilog: A Quick Migration Map

A one-page mapping from Verilog constructs to their SystemVerilog equivalents, for use starting in Course 2.

Updated 2026-07-28

The core idea

SystemVerilog is a superset of Verilog: everything you wrote in Course 1 still compiles. SystemVerilog adds new constructs that make intent explicit and make verification scale. This page maps the handful you previewed in Lessons B.1-B.5 to what you already know from Verilog.

Types

Verilog SystemVerilog Why it changed
wire logic For a single-driver signal: one type instead of choosing wire vs. reg by assignment style.
reg logic Same replacement — logic covers both, so declaring a signal no longer requires knowing in advance whether it will be driven by assign or an always block.

logic cannot be driven by more than one continuous/procedural source at once, same rule as reg — it is a naming and clarity change for single-driver signals, not a new hardware behavior. wire has not gone away: a net that genuinely needs more than one driver (a shared bus, a tri-state line) still declares wire, so logic is the common default, not a full replacement for every net type.

Procedural blocks

Verilog SystemVerilog Why it changed
always @(*) always_comb States combinational intent explicitly; a tool can flag a block that looks combinational but is missing an assignment on some path.
always @(posedge clk) always_ff @(posedge clk) States clocked intent explicitly; a tool can flag a signal written outside a clocked block.

Verification additions (Course 2 territory)

Construct What it does
assert property (...) States a rule once; the simulator checks it automatically, every cycle, instead of a human checking it by hand.
interface Bundles related signals — like a small bus — so they connect and travel together as one named group.
enum Names FSM states directly instead of encoding them as raw bit patterns.

What did not change

  • Module ports, instantiation, and hierarchy work the same way.
  • Non-blocking (<=) vs. blocking (=) assignment discipline is unchanged.
  • The default-at-top latch-avoidance habit from Module 2 still applies inside always_comb.