zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

verilog流水线设计代码_流水线cpu设计verilog

CPU代码 设计 流水线 Verilog
2023-06-13 09:13:00 时间

大家好,又见面了,我是你们的朋友全栈君

介绍

定义:流水线设计就是将组合逻辑分割,并在各级之间插入寄存器,暂存中间数据的方法。以面积换速度。

优点:每一部分延时降低——可用更快的时钟;大部分电路同时运算——提高数据吞吐率。 缺点:增加面积;流水线并不减小单个数据操作的时间,减小的是整个数据流的操作时间; (不懂)功耗增加,硬件复杂度增加,特别对于复杂逻辑如 cpu 的流水线而言,流水越深,发生需要 hold 流水线或 reset 流水线的情况时,时间损失越大。 所以使用流水线并非有利无害,大家需权衡考虑。

应用场景: 1)组合逻辑太长,比如(a+b)*c,那么在加法和乘法之间插入寄存器是比较稳妥的做法。 2)功能模块之间的流水线,用乒乓 buffer来交互数据。代价是增加了 memory 的数量,但是和获得的巨大性能提升相比,可以忽略不计。(详见乒乓设计)

(3 4不懂) 3) I/O 瓶颈,比如某个运算需要输入 8 个数据,而 memroy 只能同时提供 2 个数据,如果通过适当划分运算步骤,使用流水线反而会减少面积。 4)片内 sram 的读操作,因为 sram 的读操作本身就是两极流水线,除非下一步操作依赖读结果,否则使用流水线是自然而然的事情。

举例 8bit 流水线加法器 非流水线:

  input  [7:0] a;
  input  [7:0] b;
  output [8:0] c;
  assign c[8:0] = { 
   1'd0, a} + {1'd0, b};

两级流水线:第一级低 4bit,第二级高 4bit,所以第一个输出需要 2 个时钟周期有效,后面的数据都是 1 个周期之后有效。

  input          cin;
  input  [7:0]   cina;
  input  [7:0]   cinb;
  
  output [7:0]   sum;
  output         cout;
  
  reg            cout;
  reg            cout1; //插入的寄存器
  reg   [3 :0 ]  sum1 ; //插入的寄存器
  reg   [7 :0 ]  sum;
  reg   [3:0]    cina_reg;
  reg   [3:0]    cinb_reg;//插入的寄存器
  
  
  always @(posedge clk) //第一级流水
  begin
    { 
   cout1 , sum1} <= cina[3:0] + cinb [3:0] + cin ;
  end
  always @(posedge clk) //第一级同时要寄存高4位
  begin
    cina_reg <= cina[7:4];
    cinb_reg <= cinb[7:4];
  end
  
  always @(posedge clk) //第二级流水
  begin
    { 
   cout ,sum[7:0]} <= { 
   { 
   1'b0,cina_reg[3:0]} + {1'b0,cinb_reg[3:0]} + cout1 ,sum1[3:0]} ;
  end

参考资料 https://blog.csdn.net/times_poem/article/details/52033535

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170389.html原文链接:https://javaforall.cn