0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈IC反压机制设计思路

CHANBAEK 来源:数字电路IC 作者:lookoutwl 2023-09-11 17:09 次阅读

反压机制指的是在输出(或者输入)端连接的模块不能接收数据(或者没有输入数据),此时自己的模块的运行状态需要暂停运行。

反压机制适用于所有拥有握手协议的模块,且强烈建议使用反压机制用于自己模块设计。

反压机制在公众号最开始也有写过,但是过去了很长时间,对设计有了新的理解,这篇文章会细述一对一、多对一、一对多、多对多之间反压机制的细节和设计。

以下具体示例可以参见我的GitHub:back-pressure-mechanism

git@github.com:lookout1992/back-pressure-mechanism.git

一、一对一

一对一反压是反压机制中的基础,也是最常见的结构。

图片

如上图,如果模块内部由一个寄存器组成,那模块的输出信号din.ready和dout.valid就可以如下设计:

logic switch_en;
assign switch_en = !dout.valid | dout.ready;


logic r_valid;
always @ (posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        r_valid <= 'd0;
    end
    else if(switch_en)begin
        r_valid <= din.valid;
    end
end
assign dout.valid = r_valid;
assign din.ready  = switch_en

增加switch_en信号,代表输出端没有准备好输出数据 ,或者是连接输出端的模块已经 准备好接收数据。

总结一句话就是模块(寄存器)的数据可以流动起来。因此switch_en也是输出口i_ready的赋值信号。

关于valid(或者没有显示的data计算部分),只有在switch_en有效时,可以向下传递。

如果图中模块中由多级一对一的寄存器组成,那么最优的设计思路是像上面设计一样,一级级拼接起来,也是最复杂的。(而不是原始公众号文章中,用一个switch_en控制所有的流水使能)

在实际设计中,有可能会在时序和资源之间平衡,需要把流水线拆开,分时复用运算逻辑。因此会出现一笔输入,但是有两笔输出,且运算时需要使用两次输入数据(即不允许输入寄存器更新太快)。这个时候需要添加新的使能(或者counter)等用于额外的判断条件

以上具体示例可以参见我的GitHub:back-pressure-mechanism/one2one

二、多对一

多对一反压是处理一对一之外最常见的结构,多用于多个输入数据运算输出一个信号。

图片

处理这种结构,主要思路是 所有输入有效 ,对于switch2_en 和 switch3_en见上面一对一反压设计,主要描述switch1_en和输入输出之间的关系:

// din0 和din1 相遇前各自一组寄存器。
logic r_reg_din0_valid;
logic w_reg_din0_ready;
logic r_reg_din1_valid;
logic w_reg_din1_ready;


logic switch1_en;


logic w_reg_din_valid;


logic r_reg_dout_valid;


always@(posedge clk or negedge rst_n)begin  
   if(!rst_n)begin  
      r_reg_dout_valid <= 'd0;
   end  
   else if(switch1_en)begin
      r_reg_dout_valid<= w_reg_din_valid;
   end  
end 


assign switch1_en = !dout.valid | dout.ready;


assign w_reg_din0_ready = r_reg_din1_valid & switch_en;
assign w_reg_din1_ready = r_reg_din0_valid & switch_en;


assign w_reg_din_valid = r_reg_din0_valid & r_reg_din1_valid;

以上具体示例可以参见GitHub:back-pressure-mechanism/more2one

三、一对多

以一输入、二输出为例:

图片

输入的ready和输出的valid将会取决于所有输出端口是否 准备好 。

logic switch_en;
logic r_din_valid;


assign switch_en = (!dout0.valid | dout0.ready)&
                   (!dout1.valid | dout1.ready);


assign din.ready = switch_en;


always@(posedge clk or negedge rst_n)begin  
   if(!rst_n)begin  
      r_din_valid<= 'd0;
   end  
   else if(switch_en)begin
      r_din_valid<= din.valid;
   end  
end 


assign dout0.valid = r_din_valid & dout1.ready;
assign dout1.valid = r_din_valid & dout0.ready;

四、多对多

多对多的反压设计可以看做多对一和一对多反压的集合。

五、总结

反压设计的目的是模块可以在输入或者输出没有准备好是可以自动停止运算,好的反压机制的作用是可以在运算因为输入或者输出的原因停止和启动时减少其中的空档期。

六、快速迭代

如果在设计中时间紧张,要求快速迭代出一版可以使用的反压机制代码,那么就不能再按照上面的设计思路扣细活。

可以直接以模块输出端的valid&ready作为全部寄存器的switch_en,这就会造成一个问题在停止时,所有运算都将停止,这会在启动时有流水中会有一些空挡(气泡)。

图片

使用switch_en信号给所有输入信号ready赋值,中间所有寄存器也都由switch_en控制或者由输入信号的valid&ready控制。

logic switch_en = !dout.valid | dout.ready


assign din.ready = switch_en;


logic          r_din_valid;
logic          r_din_valid_d1;
logic          r_din_valid_d2;
logic [DW-1:0] r_din_data;
always @ (posedge clk or negedge rst_n) begin
   if(!rst_n) begin
      r_din_data <= 'd0;
   end
   else if(din.valid & din.ready) begin
      r_din_data <= din.data;
   end
end
...


always @ (posedge clk or negedge rst_n) begin
   if(!rst_n) begin
      r_din_valid    <= 'd0;
      r_din_valid_d1 <= 'd0;
      r_din_valid_d2 <= 'd0;
   end
   else if(switch_en) begin
      r_din_valid    <= din.valid;
      r_din_valid_d1 <= r_din_valid;
      r_din_valid_d2 <= r_din_valid_d1;
   end
end


assign dout.valid = r_din_valid_d2;
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2485

    浏览量

    46538
  • IC
    IC
    +关注

    关注

    35

    文章

    5544

    浏览量

    173222
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117745
  • GitHub
    +关注

    关注

    3

    文章

    457

    浏览量

    15924
收藏 人收藏

    评论

    相关推荐

    远程升级单片机的设计思路

    上周给大家分享了《 Bootloader程序安全机制设计 》,今天为大家分享一下远程升级单片机的设计思路
    发表于 09-05 10:34 585次阅读
    远程升级单片机的设计<b class='flag-5'>思路</b>

    浅谈公共机房样机制作及日常维护

    浅谈公共机房样机制作及日常维护随着电脑和网络的应用日益普及, 电脑在日常生活中扮演着越来越重要的角色,而学校的教育,无论是高校还是中小学,公共机房都是一个不可缺少的教学实践基础硬件设备。而如何高效
    发表于 10-10 15:04

    高手:谁能提供一个用单片机制作无线鼠标的思路

    高手:谁能提供一个用单片机制作无线鼠标的思路
    发表于 10-24 20:59

    基于HTTP间谍抓包插件分析有道翻译机制

    python实战:利用chrome抓包插件HTTP间谍分析有道翻译机制
    发表于 04-15 11:41

    请推荐激有源钳位的IC

    请TI工程师推激有源钳位的IC,主要应用在DC-DC电源上,因宽电压输入9-36V范围,若用正激有源钳位的话二次侧续流管会是比较难处理的问题,加之体积小,所以想用激有源钳位。早先的IC
    发表于 07-05 11:51

    浅析spark的压机制与推测机制的原理

    spark的压与推测机制
    发表于 10-30 06:22

    IC验证“UVM验证平台加入objection机制和virtual interface机制“(七)

    在上一节中,**《IC验证"UVM验证平台加入factory机制"(六)》**虽然输出了“main_phase is called”,但是“data is drived”并没有
    发表于 12-09 18:28

    浅谈PCI总线的中断机制

    PCI总线的中断机制PCI总线使用INTA#、INTB#、INTC#和INTD#信号向处理器发出中断请求。这些中断请求信号为低电平有效,并与处理器的中断控制器连接。在PCI体系结构中,这些...
    发表于 02-16 06:31

    济钢105000Nm3/h空压机防喘振控制设计及应用

    摘要:介绍了空压机的防喘振控制功能的设计与应用。防喘振控制是空压机整个控制系统中核心控制部分,控制复杂,精度高,本设计思路也适用于压缩机系统自动控制的设计与实
    发表于 01-19 21:22 19次下载

    浅谈大型空压机系统的维护保养

    本文主要论述了空压机系统在运行过程中的常见故障以及维护保养的措施,从而减少故障率,提高系统效率。
    发表于 05-23 14:44 21次下载

    5L空压机增产节能改造

    本文简要分析了5L空压机改造前的使用状况、存在问题及原因,介绍了对其进行改造的思路、实施及改造后的使用效果。
    发表于 12-28 16:58 13次下载

    FPC传压机和快压机的层压工艺

    FPC传压机和快压机的层压工艺 一,快压:1.组合方式:单面压和双面压,一般常用单面压。2.所用辅材及其作用(1) 玻纤布﹕
    发表于 03-17 10:00 4655次阅读

    压机原理_液压机的作用

    本文首先介绍了液压机原理,其次介绍了液压机的特点,最后介绍了液压机的作用。
    发表于 04-28 10:33 6397次阅读

    浅谈四柱液压机常见故障

    今天鑫宏伟机械跟大家聊一聊四柱液压机比较常见的电路问题,希望在面对同样的问题时有相对的解决方案。
    发表于 03-25 11:51 1748次阅读

    [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套

    [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套
    发表于 12-05 10:21 11次下载
    [<b class='flag-5'>IC</b>]<b class='flag-5'>浅谈</b>嵌入式MCU软件开发之中断优先级与中断嵌套