To break the long paths which violates the STA timing, pipeline registers are added in between such that they meet the required timing. Below is the Verilog HDL implementation of a simple module which can be used to insert the pipeline registers in a generic design,
//-------------------------------------------------------------------------------------------------------------
// Description
// GENERIC Pipeline Module.
// Setting PIPELINE_STAGE = 0 Makes the Module behave as simple wire logic
//---------------------------------------------------------------------------------------------------------------------
//Module Declaration
module generic_pipeline#(
parameter WIDTH = 1,
parameter PIPELINE_STAGE = 1
)(
input i_clk,
input i_rst_n,
input i_en,
input [WIDTH-1:0] i_din,
output [WIDTH-1:0] o_dout
);
//Declarations
reg [(PIPELINE_STAGE+1)*WIDTH-1:0] pipeline;
//Main Body of Code
//The lower WIDTH bits of the pipeline are the input bits
assign pipeline[0+:WIDTH] = i_din;
//If depth/stages is greater than 0, we create a series of PIPELINE_STAGE register
//words, each WIDTH bits wide. Data moves through this pipeline one step
//per clock cycle when enable is high
generate
if(PIPELINE_STAGE>0)
begin:generate_pipeline
always @(posedge i_clk or negedge i_rst_n)
if(!i_rst_n)
pipeline[WIDTH+:(PIPELINE_STAGE*WIDTH)] <= '0;
else
pipeline[WIDTH+:(PIPELINE_STAGE*WIDTH)] <= i_en ? pipeline[0+:(PIPELINE_STAGE*WIDTH)]: pipeline[WIDTH+:(PIPELINE_STAGE*WIDTH)];
end:generate_pipeline
endgenerate
//The output is the last stage of the pipeline
assign o_dout = pipeline[PIPELINE_STAGE*WIDTH+:WIDTH];
endmodule //generic pipeline
Yosys Synthesis Diagram:
Thanks !!
0 Comments:
Post a Comment