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

Popular posts from this blog

托福 TPO词汇题汇总

浮点数

缓存