TIL:
The default counter example uses a gated clock and posedge FF. The top-level timing reports look promising. Nevertheless I was elaborating on an alternative.
I changed the FF in the counter design to negedge, while keeping the gated clock, which is perfectly legal.
Always @ (negedge clk) begin // (posedge clk) begin
Unfort. the flow inserts ~ 8 delay cells into each soc->mprj line and the top level timing reports went crazy (10ns hold time violation, holy cow).
I removed the gated clock as well, still using negedge.
assign clk = wb_clk_i; //
There are no massive delay cell chains in the netlist but a huge hold time violation. Unfort. the reset coming from the soc is sensitive to the negedge, so I added a posedge FF in the reset tree.
reg reset_reg;
always @(posedge clk)
reset_reg <= reset;
Now everything looks fine, no hold time violations anymore, super relaxed, de-risked interface timing and no delay cells. IMHO, this is a reasonable alternative and well suited for medium and large designs (diagram see below).
Comments welcome, Cheers !
PS: It’s still worth looking into, why OL interprets the io timing delays wrongly (possibly) and adds a string of delay cells when a gated clock and negedge FFs are used.