Control flow

progn

The progn form, as in Lisp, collects several other forms together as a unit. It is mainly used in constructs like if where an arm must be made from a single form.

@

The @ form is specific to Verilisp.

Chip logic often needs to be “sensitised” by changes in a specific set of wires or values: a classic example is for synchronous components whose behaviours only happen on clock edges. The @ form guards a body of forms with a sensitivity list of wires whose changes control when the body is executed.

;; whenever the CLK line changes
(@ clk
   (setf a (* a b 2)))

;;; when the CLK line transitions to positive
(@ (posedge clk)
   (setf a (* a b 2)))

;; when one of several conditions happens
(@ ((posedge clk) opcode)
   (setf a (* a b 2)))

In this code the body of the @ will be executed whenever there is a positive (rising) edge on the clk pin. The sensitivity list can contain several pins, making the block sensitive to changes in any of them.

As shown above, sensitivities can be expressed in three ways:

  • As a single variable for the wires

  • As a single edge trigger expression (see below)

  • As a list of variables and/or edge triggers

posedge and negedge

These two operators can only appear in sensitivity lists. They set the @ block to be sensitive to positive (rising) or negative (falling) edges respectively on a wire.