Lint Summary in Cadence Genus: Detailed Explanation with RTL Examples

Lint summary

Lint summary
 Unconnected/logic driven clocks                                  0
 Sequential data pins driven by a clock signal                    0
 Sequential clock pins without clock waveform                     0
 Sequential clock pins with multiple clock waveforms              0
 Generated clocks without clock waveform                          0
 Generated clocks with incompatible options                       0
 Generated clocks with multi-master clock                         0
 Paths constrained with different clocks                          0
 Loop-breaking cells for combinational feedback                   0
 Nets with multiple drivers                                       0
 Timing exceptions with no effect                                 1
 Suspicious multi_cycle exceptions                                0
 Pins/ports with conflicting case constants                       0
 Inputs without clocked external delays                           0
 Outputs without clocked external delays                          0
 Inputs without external driver/transition                        0
 Outputs without external load                                    0
 Exceptions with invalid timing start-/endpoints                  0

                                                  Total:          1


1. Unconnected/logic driven clocks — 0
Meaning:
Clocks in your design should be driven by a dedicated clock source (like a PLL or oscillator) and connected properly. If a clock signal is not connected or driven by logic gates instead of a proper clock source, it can cause timing analysis issues.
Example:
wire clk;  
assign clk = a & b;  // Clock driven by logic (not recommended)

This is flagged because a clock should not be generated by combinational logic like AND gates.


2. Sequential data pins driven by a clock signal — 0
Meaning:
Input data pins to sequential elements (flip-flops) should not be driven directly by a clock signal. Data inputs should be valid data, not clocks.
Example:
always @(posedge clk) begin
  dff <= clk;  // wrong: data driven by clock signal itself
end

Here, the data input is connected to the clock, which is wrong.


3. Sequential clock pins without clock waveform — 0
Meaning:
Clock pins of sequential elements (like FFs) should have defined clock waveforms (timing info). If the timing tool doesn’t have waveform info, it cannot analyze timing properly.
Example:
If your constraints miss defining the clock waveform (like period, duty cycle), the tool flags this.


4. Sequential clock pins with multiple clock waveforms — 0
Meaning:
A single clock pin should have one clock waveform definition. Multiple conflicting clock waveforms can confuse timing analysis.
Example:
If you define the clock period twice with different values for the same clock, you get this warning.


5. Generated clocks without clock waveform — 0
Meaning:
Clocks generated inside the design (e.g., from clock dividers) must have timing waveforms defined for the tool.
Example:
If a clock divider generates a clock but no period or waveform is provided, this flag occurs.


6. Generated clocks with incompatible options — 0
Meaning:
Generated clocks might have conflicting properties (like phase, duty cycle) that don’t match the source clock.
Example:
If a generated clock is defined with a 50% duty cycle but source clock is 30%, or if phase shift definitions contradict.


7. Generated clocks with multi-master clock — 0
Meaning:
A generated clock should have a single master clock source. If multiple clocks try to drive the same generated clock net, it causes ambiguity.


8. Paths constrained with different clocks — 0
Meaning:
A timing path should be constrained with one clock domain. If different constraints specify different clocks on the same path, it’s a problem.


9. Loop-breaking cells for combinational feedback — 0
Meaning:
Combinational loops (feedback paths without registers) are illegal in synchronous design. Loop-breaking cells are inserted to avoid infinite loops during timing analysis.


10. Nets with multiple drivers — 0
Meaning:
A net (wire) should have only one driver. Multiple drivers cause conflicts and possible glitches.
Example:
assign a = b;  
assign a = c;  // two drivers for a

This causes multiple drivers.


11. Timing exceptions with no effect — 1
Meaning:
Timing exceptions (like false paths, multicycle paths) defined in constraints but not affecting any timing paths. This is a warning to clean up unnecessary constraints.
Example:
If you declare a false path between two signals but no path exists, it’s flagged.


12. Suspicious multi_cycle exceptions — 0
Meaning:
multi-cycle paths allow more than one clock cycle for data to propagate. Suspicious ones may be incorrectly defined or inconsistent.


13. Pins/ports with conflicting case constants — 0
Meaning:
Pins or ports defined with conflicting constant logic levels (e.g., input tied to 0 in one place and 1 in another) cause issues.


14. Inputs without clocked external delays — 0
Meaning:
External input delays specify timing for signals coming from outside the chip. Missing delays for inputs can reduce accuracy of timing analysis.


15. Outputs without clocked external delays — 0
Meaning:
Outputs should also have delays defined to model external load or environment.


16. Inputs without external driver/transition — 0
Meaning:
Input pins must have driver and transition info defined to simulate realistic timing.


17. Outputs without external load — 0
Meaning:
Outputs should have defined load capacitance or equivalent for proper timing.


18. Exceptions with invalid timing start-/endpoints — 0
Meaning:
Timing exceptions (like false paths) must have valid start and end points in constraints. If invalid, they are ignored or flagged.


Code Snippets for each:
1. Unconnected/logic driven clocks
Verilog (bad clock driven by logic):
wire clk;
assign clk = a & b;  // Clock driven by logic - bad practice


2. Sequential data pins driven by a clock signal
Verilog (wrong data input driven by clock):
always @(posedge clk) begin
  q <= clk;  // data input driven by clock signal - incorrect
end


3. Sequential clock pins without clock waveform
SDC (missing waveform info):
create_clock -name clk -period 10 [get_ports clk]
// No waveform specified, causes issue in some tools

Correct with waveform:
create_clock -name clk -period 10 -waveform {0 5} [get_ports clk]


4. Sequential clock pins with multiple clock waveforms
SDC (conflicting clocks on same port):
create_clock -name clk -period 10 -waveform {0 5} [get_ports clk]
create_clock -name clk -period 8 -waveform {0 4} [get_ports clk]  # Conflicts


5. Generated clocks without clock waveform
SDC (missing waveform for generated clock):
create_generated_clock -name clk_div2 -source [get_ports clk] -divide_by 2 [get_pins clk_div2]
// Missing waveform option leads to warning

Correct:
create_generated_clock -name clk_div2 -source [get_ports clk] -divide_by 2 -waveform {0 10} [get_pins clk_div2]


6. Generated clocks with incompatible options
SDC (conflicting duty cycles):
create_clock -name clk -period 10 -waveform {0 4} [get_ports clk]  # 40% duty
create_generated_clock -name gen_clk -source [get_ports clk] -multiply_by 1 -divide_by 1 -waveform {0 5} [get_pins gen_clk]  # 50% duty -> conflict


7. Generated clocks with multi-master clock
SDC (generated clock driven by multiple clocks):
create_generated_clock -name gen_clk -source [get_ports clk1] [get_pins gen_clk]
create_generated_clock -name gen_clk -source [get_ports clk2] [get_pins gen_clk]  # Multi-master source


8. Paths constrained with different clocks
SDC (conflicting constraints on same path):
set_multicycle_path -setup 2 -from [get_clocks clk1] -to [get_clocks clk1]
set_multicycle_path -setup 1 -from [get_clocks clk2] -to [get_clocks clk1]  # Conflicts on same path


9. Loop-breaking cells for combinational feedback
Verilog (combinational loop example):
wire a;
assign a = ~a;  // Combinational feedback loop, illegal

Loop-breaking cell (special flip-flop or latch inserted manually or by tool) is required to break this.


10. Nets with multiple drivers
Verilog (multiple drivers):
wire a;
assign a = b;
assign a = c;  // Multiple drivers on wire 'a' - illegal


11. Timing exceptions with no effect
SDC (false path that doesn't exist):
set_false_path -from [get_ports non_existing_port] -to [get_ports another_port]

Since the path doesn't exist, this has no effect.


12. Suspicious multi_cycle exceptions
SDC (multi-cycle path with unusual constraints):
set_multicycle_path -setup 0 -from [get_clocks clk] -to [get_clocks clk]
-setup 0 is suspicious because multi-cycle should be >=1.

13. Pins/ports with conflicting case constants
Verilog (conflicting constants):
wire in;
assign in = 1'b0;  // Port tied to zero here
// Elsewhere assigned 1'b1 causing conflict


14. Inputs without clocked external delays
SDC (missing input delay):
# No input delay specified for input port 'data_in'
// Add with:
set_input_delay -clock clk 5 [get_ports data_in]


15. Outputs without clocked external delays
SDC (missing output delay):
# No output delay specified for output port 'data_out'
// Add with:
set_output_delay -clock clk 3 [get_ports data_out]


16. Inputs without external driver/transition
SDC (missing transition on inputs):
# No transition specified on input ports
set_driving_cell -lib_cell INV_X1 [get_ports data_in]
set_input_transition 1.0 [get_ports data_in]


17. Outputs without external load
SDC (missing output load):
# No load specified on output ports
set_load 10 [get_ports data_out]


18. Exceptions with invalid timing start-/endpoints
SDC (invalid false path endpoints):
set_false_path -from [get_ports invalid_port] -to [get_ports data_out]  # invalid startpoint

Search This Blog