Latches Inferred
This blog is named after a frustrating warning message which is sometimes encountered during synthesis of Verilog code. This blog post explains what that warning means, why you may encounter it, and how to remedy the situation.
What is a Latch
A latch, like a flip-flop, is a kind of state-element in digital circuits. While a flip-flop captures the input and propagates it to the output upon clock edges, however, the latch captures the input at all times while the clock is high and only while the clock is high. This is known as its “transparent” state (since the input flows directly to the output; the output side of the latch can “see” the input). When the clock is low, the latch is in its “opaque” state (since the input does not propagate to output; the output side cannot “see” the input). During the opaque state, the output remains at whatever value was on the input of the latch at the time the clock went low. In this way it is similar to a negative-edge triggered flip-flop. The only difference between them is that the latch also propagates input to output at all other times when the clock is high, not just before a negative edge. Below is a waveform to help make the functionality of a latch more clear:
The schematic symbol for a latch is show below:
How to Code a Latch in Verilog
Below is some Verilog-1995 code which properly codes a latch:
module latch(output q, input d, input gate); reg q; wire d, gate; always @(gate, d) begin if(gate) q <= d; end endmodule
In this case, the clock would be connected to the gate. Below is a SystemVerilog implementation of a latch:
module latch(output logic q, input logic d, input logic gate); always_latch begin if(gate) q <= d; end endmodule
When the gate is a logic 1, the input propagates to the output. When the clock is low, it remains the same, by default. The simulator makes no changes to the variable if the gate is low and thus this is the behavior of the code when synthesized into an actual design.
How to Avoid Coding a Latch in Verilog
If you get a “latches inferred” warning, chances are, you probably don’t want it. Latch-based designs have certain advantages (they are smaller than flip-flops and can be used to create a faster design using a principle called time-borrowing), but are comparatively rare.
In order to avoid having latches in your design, you must follow one of the golden rules of combinational logic:
All combinational outputs must be assigned for every possible input pattern.
The implication this has for coding is:
Assign all combinational outputs for every possible control-flow path through an always block.
What this means is that whatever conditions exist which cause you to execute certain lines of code in your always block, all outputs must be specified in order to qualify as combinational logic. The latch code above violates this principle because if gate is a logic 0, q is left unspecified. As a result, the simulator leaves it equal to its current (i.e. past) value – which implies memory or state, not combinational logic.
For a more in-depth explanation of latches and this warning message, see: http://www.doulos.com/knowhow/fpga/latches/