Forum Discussion

VGovi7's avatar
VGovi7
Icon for New Contributor rankNew Contributor
6 years ago

Reducing timing for critical path, Adding pipeline registers not working.

Hello,

I'm trying to optimize a part of my design to meet my timing goal (150 MHz ~6.66ns path) but one register is not being read as a register on my timing analysis and I don't know why. In the timing analyzer it shows the register cell as a logical cell in the middle of the path, however, since it is a register, it should be at the end of the path.

My design has 2-stages (i.e. pipelined), at least it is supposed to be but the analyzer is not reading the variable as a register.

Here is the code snippet in question:

always_ff @(posedge clk) begin
	if (rst) begin
		for (int i = 0; i < 6; i++)
			read_mux_out_reg[i] <= 0;
	end
	else begin
		for (int i = 0; i < 6; i++)
			read_mux_out_reg[i] <= read_mux_out[i];
	end
end

Here is the critical path shown in timing analyzer:

Is there something I need to be doing in the timing analyzer for this to work? Any help is greatly appreciated, I've been stuck on this for a while and I've tried a bunch of things to synthesize a register but none of the I tried change the result of the timing analyzer.

Thank you~

1 Reply

  • VGovi7's avatar
    VGovi7
    Icon for New Contributor rankNew Contributor

    Well, I figured out my problem. It is because there was a lot of mux concatenation from my arrays to the output (This is because I read combinationaly). I simply added another pipeline stage to compensate and now I am meeting my timing requirements.