:Def: Pipelining
:Example:module very_simple_pipe
#( int w = 16 )
( output logic [w-1:0] x,
input uwire [w-1:0] a,
input uwire clk );
logic [w-1:0] r;
always_ff @( posedge clk ) r <= a;
always_ff @( posedge clk ) x <= r;
endmodule
:Example:module simple_pipe2
#( int w = 16, int nstages = 4 )
( output uwire [w-1:0] x,
input uwire [w-1:0] a,
input uwire clk );
logic [w-1:0] r[nstages];
always_ff @( posedge clk ) begin
r[0] <= a; for ( int i=1; i<nstages; i++ ) r[i] <= r[i-1];
end
assign x = r[nstages-1];
endmodule
:Example:module simple_pipe2_ba
#( int w = 16, int nstages = 4 )
( output uwire [w-1:0] x,
input uwire [w-1:0] a,
input uwire clk );
logic [w-1:0] r[nstages];
always_ff @( posedge clk ) begin
r[0] = a; for ( int i=1; i<nstages; i++ ) r[i] <= r[i-1];
end
assign x = r[nstages-1];
endmodule
:Example: module simple_pipe_avg
#( int w = 16, int nstages = 4 )
( output uwire [w-1:0] x,
output logic [w-1:0] avg,
input uwire [w-1:0] a,
input uwire clk );
logic [w-1:0] r[nstages];
assign r[0] = a;
always_ff @( posedge clk ) begin
for ( int i=1; i<nstages; i++ ) r[i] <= r[i-1];
end
assign x = r[nstages-1];
logic [w+$clog2(nstages):0] sum;
always_comb begin
sum = 0;
for ( int i=0; i<nstages; i++ ) sum += r[i];
avg = sum / nstages;
end
endmodule
:Example:module pipe_r_avg2
#( int w = 8, n_samples = 4 )
( output logic [w-1:0] r_avg,
input uwire [w-1:0] sample,
input uwire reset, clk );
logic [w-1:0] samples[n_samples];
parameter int wm = $clog2( n_samples );
parameter int ws = w + wm;
logic [ws-1:0] tot;
always_ff @( posedge clk ) begin
samples[0] <= sample;
for ( int i=1; i<n_samples; i++ ) samples[i] <= samples[i-1];
tot <= tot - samples[n_samples-1] + samples[0];
end
assign r_avg = tot / n_samples;
endmodule