芯片IC设计(一)--调度器(SP调度)

         调度器在IC设计中是非常基础且重要的存在,主要解决当多个不同访问源同时发起对目标进行访问时出现拥塞问题。举个生活中的例子,在火车站当中,需要有调度室充分发挥其作用对进站列车进行调度进站,试想一下如果没有调度室会发生怎样的情况?火车进/出战发生混乱,增加事故发生的风险!那么在芯片设计中也是如此,当多个源头同时对目标进行访问,如果没有一个好的调度器,在数据传输过程中,数据流的方向会出现不可预料的错误,导致设计超出自己的预期,基于此,本系列将陆续介绍在芯片设计中,最常见且常用的调度器!

        在讲解调度器之前,先给大家推荐一章博客,详细讲解各种调度器的原理,大家有时间可移步学习(小编在最开始也详细研读了该篇文章,受益匪浅)。

·【网络拥塞管理和避免(队列调度算法FIFO/SP/RR/WRR/DRR/MDRR/WDRR/WFQ)】 - 知乎 (zhihu.com)

        本文主要讲解最基础的调度器---SP绝对优先级调度器,顾名思义SP优先级调度器主要处理有明确优先级的访问源。什么意思呢?还是以上述火车调度室为例,如果火车站规定始发站为北京的列车可以以最高优先级进站,始发站为成都的列车以第二优先级进站。这里需要说明一点的是,当两列车在不同时刻进站,则不会出现拥塞现象,直接进站即可。但如果两列车同时需要申请进站,那么此时会优先调度始发地为北京的火车优先进站,当北京的火车进站后,再调度成都的火车进站,以此实现优先级调度。

        那么在芯片设计当中怎么实现SP优先级调度呢?网上给出了很多代码,均能实现其SP优先级调度功能,那么本文主要分享一下两种主要的实现方法以及对应的优缺点。

        1、当访问源个数不多的情况下,可以使用if...else if...else条件语句或使用case语句进行实现,该方式较为简单,verilog代码如下:

//以四个访问源为例,且绝对优先级为req0 > req1 > req2 > req3
always@(*)begin
    if(req0 == 1'b1)
        sp_grant = 4'b0001;
    else if(req1 == 1'b1)
        sp_grant = 4'b0010;
    else if(req2 == 1'b1)
        sp_grant = 4'b0100;
    else if(req3 == 1'b1)
        sp_grant = 4'b1000;
    else
        sp_grant = 4'b0000;
end

//case实现
always@(*)begin
    case(1'b1)
        req0 : sp_grant = 4'b0001;
        req1 : sp_grant = 4'b0010;
        req2 : sp_grant = 4'b0100;
        req3 : sp_grant = 4'b1000;        
    default: sp_grant = 4'b0000;
    endcase
end

        该方法主要应用于参与调度的请求源数量不多情况下,如果请求源头过多导致if-else的级数多大,综合路径过长,时序收敛较困难。

2、第二种方式的思想主要是找首1,如果将优先级较高的请求源放在LSB端,那么就可以使用verilog表示为:

sp_grant = sp_req &(~(sp_req - 1))

         该方法可应用于多请求源访问时的场景,作为优先级调度,直接找出从右往左的第一个1即可得到调度结果。

        本篇只是调度器的引子,后续会陆续推出RR、WRR调度专项,欢迎大家一起探讨

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值