verilog实现pipeline的理解
Verilog中的always语句块都是并行实现的,所以很容易实现流水线处理。
如以下伪代码处理8bit加法:
always a { 低四位相加 }
always b { 存储高四位的值}
always c {用高四位的值与低四位的进位值相加并与低四位的值串接}
在计算机执行这个代码的时候,第一次处理abc时,由于是并行处理,所以只有a和b能正确处理,而c则是输出的并不正确的结果,因为低四位的值还没计算好,还在并行计算中。
而第二次执行时,a和b已经是处理新数据,而c执行的是上一个时钟周期的值,因为b的值在并行处理中,并没有被刷新,而上一个时钟周期计算出的低四位的值也同样并未刷新,所以c可以正常处理结果,最终得出第一个加法结果。
而在第三个时钟周期中,c将得出第二个加法结果。从而每三个时钟周期就可以实现2次加法,比直接串行处理,先处理低四位后处理高四位,要快1.5倍。
下面的verilog代码实现了一个两级pipeline的fulladder,实现了上方伪代码的思路:
module pipeline_8bit_adder (enable,rst,a,b,cin,cout,sum);
input [7:0] a,b;
output reg[7:0] sum;
output reg cout;
input cin,rst,enable;
reg[3:0] temp_a;
reg[3:0] temp_b;
reg temp_cin;
reg[3:0]low_bit_sum;
reg[3:0]high_bit_sum;
always @(posedge enable or negedge rst) begin
if (~rst) begin
sum=0;
cout=0;
end
else begin
{temp_cin,low_bit_sum}<=a[3:0]+b[3:0]+cin;
temp_a <= a[7:4];
temp_b <= b[7:4];
end
end
always @( posedge enable or negedge rst) begin
if (~rst) begin
sum=0;
cout=0;
end
else begin
{cout,sum[7:4]}<=temp_a+temp_b+temp_cin;
{cout,high_bit_sum}<=temp_a+temp_b+temp_cin;
sum[3:0]<=low_bit_sum;
end
end
endmodule
testbench:
module tb_8_bitadder ();
reg [7:0] a,b;
output [7:0] sum;
output cout;
reg cin,rst,enable;
parameter delay=80;
pipeline_8bit_adder m1(enable,rst,a,b,cin,cout,sum);
initial begin
$dumpfile("dump.vcd");
$dumpvars;
end
initial begin
enable=0;
forever #10 enable = ~enable;
end
initial begin
#10 a=8'b0;b=8'b0;cin=1'b0; rst=1;
#20 a=1;b=1;
#20 a=20;b=20;cin=1;
#20 a=75;b=75;cin=1;
#20 a=128;b=128;cin=0;
#20 a=200;b=200;cin=0;
end
// initial begin
// clk=0;
// forever #10 clk = ~clk;
// end
initial begin
#200 $finish;
end
endmodule
Comments
Post a Comment