目录

  1. 引言
  2. 流水线基本概念
  3. Verilog 流水线设计步骤
  4. 完整 Verilog 流水线示例
  5. 参考资料

引言

流水线(Pipeline)是一种提高系统吞吐量的设计方法,将数据处理过程分为多个阶段,每个阶段由独立的逻辑单元执行。Verilog 流水线广泛应用于 CPU 设计信号处理高性能计算 领域。本文将详细介绍 Verilog 流水线的设计方法,并提供完整示例。


流水线基本概念

流水线的基本原理是 将数据处理拆分为多个阶段,每个阶段独立进行计算。其主要特点包括:

  • 提高吞吐量:每个时钟周期处理一组数据,提高整体处理能力。
  • 延迟增加:由于数据需要经过多个阶段才能输出,单个数据的处理时间增加。
  • 需要流水线寄存器:在阶段之间添加 寄存器,确保数据同步传输。

常见的流水线结构如下(以 4 级流水线为例):

时钟周期:  | 1  | 2  | 3  | 4  | 5  | 6  | 7  |
-----------------------------------------------
阶段1 (F)  | A1 | A2 | A3 | A4 | A5 | A6 | A7 |
阶段2 (D)  |    | A1 | A2 | A3 | A4 | A5 | A6 |
阶段3 (E)  |    |    | A1 | A2 | A3 | A4 | A5 |
阶段4 (W)  |    |    |    | A1 | A2 | A3 | A4 |

其中,

  • F: Fetch(取指令)
  • D: Decode(解码)
  • E: Execute(执行)
  • W: Write Back(写回)

Verilog 流水线设计步骤

3.1 任务分解

流水线设计的第一步是 拆分计算任务。假设我们要实现一个 3 级流水线计算公式: Y=(A+B)×CY = (A + B) \times C

可以拆分为:

  1. 第一阶段(加法):计算 A + B
  2. 第二阶段(寄存器保存中间结果)
  3. 第三阶段(乘法):计算 (A + B) * C

3.2 设计流水线寄存器

在各个阶段之间添加 流水线寄存器,保证数据同步流动。

module pipeline (
    input clk,
    input rst,
    input [7:0] A,
    input [7:0] B,
    input [7:0] C,
    output reg [15:0] Y
);

    reg [7:0] sum;       // 第一阶段结果
    reg [7:0] sum_reg;   // 流水线寄存器
    reg [15:0] product;  // 第二阶段结果

    // 第一阶段:加法运算
    always @(posedge clk or posedge rst) begin
        if (rst)
            sum <= 0;
        else
            sum <= A + B;
    end

    // 第二阶段:存入流水线寄存器
    always @(posedge clk or posedge rst) begin
        if (rst)
            sum_reg <= 0;
        else
            sum_reg <= sum;
    end

    // 第三阶段:乘法运算
    always @(posedge clk or posedge rst) begin
        if (rst)
            product <= 0;
        else
            product <= sum_reg * C;
    end

    // 输出结果
    always @(posedge clk or posedge rst) begin
        if (rst)
            Y <= 0;
        else
            Y <= product;
    end

endmodule


3.3 数据前推和冒险处理

在流水线中,可能会出现 数据冒险(Data Hazard),即后续阶段需要的数据还未准备好。这种情况可以通过 数据前推(Forwarding)插入气泡(Stall) 解决。

数据前推示例(将 sum 直接前推到乘法阶段,避免等待):

always @(posedge clk or posedge rst) begin
    if (rst)
        product <= 0;
    else
        product <= (A + B) * C;  // 直接使用加法结果
end

但数据前推会增加 组合逻辑路径,可能影响时钟频率,因此需要权衡使用。


完整 Verilog 流水线示例

下面是一个 4 级流水线 CPU 计算示例,模拟一个简单的 ALU 操作。

module pipeline_cpu (
    input clk,
    input rst,
    input [7:0] opA,
    input [7:0] opB,
    input [1:0] opcode, // 00:加法, 01:减法, 10:乘法, 11:除法
    output reg [15:0] result
);

    reg [7:0] stage1_A, stage1_B;
    reg [1:0] stage1_opcode;

    reg [15:0] stage2_result;
    reg [15:0] stage3_result;

    // 第一阶段:读取操作数
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            stage1_A <= 0;
            stage1_B <= 0;
            stage1_opcode <= 0;
        end else begin
            stage1_A <= opA;
            stage1_B <= opB;
            stage1_opcode <= opcode;
        end
    end

    // 第二阶段:执行运算
    always @(posedge clk or posedge rst) begin
        if (rst)
            stage2_result <= 0;
        else begin
            case (stage1_opcode)
                2'b00: stage2_result <= stage1_A + stage1_B;
                2'b01: stage2_result <= stage1_A - stage1_B;
                2'b10: stage2_result <= stage1_A * stage1_B;
                2'b11: stage2_result <= stage1_A / stage1_B;
            endcase
        end
    end

    // 第三阶段:存储计算结果
    always @(posedge clk or posedge rst) begin
        if (rst)
            stage3_result <= 0;
        else
            stage3_result <= stage2_result;
    end

    // 输出最终结果
    always @(posedge clk or posedge rst) begin
        if (rst)
            result <= 0;
        else
            result <= stage3_result;
    end

endmodule


参考资料

  1. Computer Organization and Design – David A. Patterson
  2. Verilog Pipelining Techniques – ASIC World
  3. RISC-V Pipelining Explained