编 者 按
字如其名,来看下pipeline中throwit的用法,是怎么个丢弃方式
api
在stage中,关于throwit提供了下面的api:
函数中的动作出现了两个变量的使用:
internal.request.throws
internals.request.throwroot 那么去到pipeline里面看都哪里使用到了它。在看之前,先再来回顾下在spinalhdl中pipeline的编程模型:
在pipeline的模型里,pipeline中的任何一级都是一个组合逻辑,如果它要驱动下一级pipeline,那么其可以通过connection来和下一级建立连接关系,最后一级则没有connection。而在connection中,则可以进行打拍。也即stage中负责功能实现,connection负责实现控制流水线级数,时序优化。
connection中的作用
在pipeline的build函数中,其定义了throwone:
var throwone = stage.internals.request.throws.nonempty generate orr(stage.internals.request.throws)
即如果internals.request.throws如果不为空,那么其中的所有条件取或后赋值给throwone.
而后,在处理stage间的连接关系时有:
这里对于驱动该级的connection,首先将throwone保留至clthrowone(l)中,随后在if判断中,会为clthrowonehit(l)声明为一个bool()对象。在常用的connection m2s、s2m中,alwascontainsslavetoken均为true,故此时throwone变量将会被赋值为null。
而对于:
if(throwone != null) c.m.throwit(throwone, root = false)
由于此时throwone重新被赋值为null,故并不会为驱动该stage的master调用throwit,也即throw并不会向前级传输。
最终会调用下面的函数来进行stage间的连接关系:
val area = l.on(m, s, clflush(l), clflushnext(l), clflushnexthit(l), clthrowone(l), clthrowonehit(l))
clthrowone(l)作为throwhead参数传入connection的on函数。以m2s为例,我们来看下其在里面会有哪些动作:
m.ready match { case null => s.valid := m.valid (s.payload, m.payload).zipped.foreach(_ := _) case r => { if (flush != null && flushpreserveinput) s.valid clearwhen(flush) if(throwhead != null) s.valid clearwhen(throwhead) when(r) { s.valid := m.valid } when(if (holdpayload) m.valid && r else r) { (s.payload, m.payload).zipped.foreach(_ := _) } }}
可以看到,如果驱动connection的master没有ready信号,那么throwhead是没有任何作用的。
如果master具备ready信号,如果此时m.ready信号为低电平,那么作为slave的stage其input.valid将会在下一拍变为低电平。
stage中的作用
在stage中的作用比较简单,仅internals.request.throwroot会起作用。在pipeline中的build函数中:
if(s.request.throwsroot.nonempty){ val dothrow = s.request.throwsroot.orr when(dothrow){ s.output.valid := false }}
如果throwsroot不为空,则其中任意一个条件满足是,stage中的output.valid会立即清零。
结合connection中throw的作用,throw会导致当前stage的input.valid在下一拍清空(input.valid为寄存器),而默认情况下stage的output.valid(wire)直接由input.valid驱动,故throwsroot的作用就是让stage的output.valid立即生效。比如说此时input.valid为高电平,ouput.ready也为高电平,throwsroot将output.valid直接拉低避免当前拍的数据传输到下一级,从而实现立即丢掉。
example
在这个例子中,如果cond为true,则stage2会立即丢掉当前传输至output端口的数据。
盘点2019年机器学习和人工智能行业的发展趋势
人工智能家居产品有哪些
陕西国网电力实现了基建战场多点开花圆满打赢了三年攻坚战
华为新机年底发布:麒麟980处理器+折叠屏
伺服电机JN13系列连接器的应用
Pipeline中throwIt的用法
维修信号分析仪N9010B电源损坏无法开机
经历八年的超融合技术的眼睛、应用场景和深度
害虫对农业的影响非常大,该问题该如何解决
超大尺寸4K/8K超高清显示时代伴随新技术革命提前到来
指纹触控技术的安全性能怎么样
什么是低代码
全球最快4G LTE-Advanced网络,峰值速率达300Mb/s
全新一代Jeep指南者将于11月18日广州车展国产正式亮相,预售价17万-22万元之间
MaxCompute在更新插入、直接加载、全量历史表中的数据转换实践
一种透传的以太网转wifi的方案介绍
四大趋势推动机器视觉应用发展和对行业未来的影响
深度解读汽车电动助力转向系统扭矩传感器技术
云计算存储虚拟化技术三个层次上的实现
基于MediaTek Genio350的智能烤箱方案