》多路一出的场景
在spinalhdl代码中,streamarbiter提供了完善的多入一出的调度机制。里面可能应用的较多的是round robin调度。在之前的文章《你知道如何做多端口仲裁么》中详细讲述了round robin调度思想。然而还有一类应用场景就是针对一入多出的情况:
这其实也是之前微信群里面群友问的一个类似的场景。在一些应用里,来自上游的数据或者任务分发给多个kernel来进行执行处理(如多个报文解析模块)。针对每个任务,其具体的执行时间会有差异(比如在网络报文头解析中,不同层协议所需要的时钟周期数并不相同)。那么为了尽可能避免kernel空闲,显然如果采用简单的顺序分发至kernel1~kerneln会存在潜在的kernel空闲。比如(假定n=3):
task1——>kernel1;100 clock cycle
task2——>kernel2;50 clock cycle
task3——>kernel3;10 clock cycle
task4——>kernel1;10 clock cycle
显然,这里如果将task4分发至kernel1将会导致dispatcher的阻塞。那么针对这种场景,显然是下游kernel谁空闲将任务分发给谁更合适。 》streamfragmentroundrobindispatcher
不同于streamarbiter所针对的多入一出的谁有任务调度谁的rr调度,这里是一种一入多出的谁空闲任务给谁的rr调度,即dispatcher by round。如果你看过之前上面的文章,那么这里可以很容易做实现。考虑到真实的应用场景,这里仅针对stream fragment形式的调度实现:
相比于streamarbiter中采用多路输入信号的valid信号作为调度请求request相反,这里(line:19)采用多路输出端口的ready信号作为roundrobin的request请求,从而实现谁空闲把任务给谁。
如之前前文所说,round robin其实是一种优先级位置变化的最低优先级调度,故这里(line:19)通过mask_locked的循环左移来实现优先级排序。故这里在初始化时将mask_locked的最高位初始化为1。
这里采用mask_route来标识对应的端口仲裁结果。对于一帧fragment stream流,其首拍时由于仲裁结果还未锁定,故采用mask_arbited来充当仲裁标示,而在随后报文锁定后采用mask_locked来执行(确保一帧任务的调度不会被下游ready信号的变化所影响。如果下游端口能一帧完整报文之间不会拉低ready那么这里还可以进一步进行优化)。
对于多kernel处理结果需要保序输出的场景,这里提供了port_sel_oh信号来输出指示当前报文送至哪个端口。使用时可能需要再例化一个fifo作为保序结果存储,此时在例化该模块连接port_in端口时可能需要一个continuewhen将保序fifo的push.ready考虑进去。在port_in.firstfire时将port_sel_oh写入保序fifo。
世界领先的华为5G实验室突发火情
国产晶圆制造设备 未来三年有望超百亿
开发定制ASIC过程中的关键技巧
高通首款双模5G芯片即将发布,OPPO新机或将搭载
预计今年华为成5G智能手机销冠,市场份额预计将达27.3%
基于RR的多路分发调用
公共安全:AI功能智盒来保障
情人节必备工具——手机蓝牙灯
2021年的数字存储预测第二部分:磁记录的预测
科创板中微公司副总经理倪图强介绍、履历信息
华为P40 Pro迎来大幅优惠,价格下降300元
LED驱动器如何实现理想的驱动
JOLED获四家日企出资470亿日圆,对抗韩厂扩大OLED生产
哪款蓝牙耳机配置比较的高,高配置蓝牙耳机推荐
如何使用jscodeshift来自动修改公开的API接口
PCB布线电路板设计
基于低功耗单片机MSC1212实现绝热材料导热系数测定仪的设计
英飞凌针对车载通信推出经过认证并具备ESD防护性能的FlexRay收发器
蓝海华腾伺服产品家族又添新成员!
笔记本几大部件维修(上)