HOME       UP       PREV       NEXT (3/3: Behavioural RTL)  

2b/3: Pure RTL : unordered synchronous register transfers.

Two coding styles (it does not matter whether these transfers are each in their own always statement or share over whole clock domain):
      always @(posedge clk)  a <= b ? c + d;
      always @(posedge clk)  b <= c - d;
      always @(posedge clk)  c <= 22-c;
// or 
      always @(posedge clk) begin 
        a <= b ? c + d;
        b <= c - d;
        c <= 22-c;

In System Verilog we would use always_ff in the above cases.

Typical example (illustrating pure RT forms):

    module CTR16( 
      input mainclk, 
      input din,
      output o);
      reg [3:0] count, oldcount;
      always @(posedge mainclk) begin
          count <= count + 1;
          if (din) oldcount <= count; // Is `if' pure ?

     // Note ^ is exclusive-or operator
     assign o = count[3] ^ count[1];


Registers are assigned in clock domains (one shown called `mainclk'). Each register is assigned in exactly one clock domain. RTL synthesis does not generate special hardware for clock domain crossing (described later).

In a stricter form of this pure RTL, we cannot use `if', so when we want a register to sometime retain its current value we must assign this explicitly, leading to forms like this:

   oldcount <= (din) ? count : oldcount;

10: (C) 2012-17, DJ Greaves, University of Cambridge, Computer Laboratory.   TAPE MISSING ICON