編 者 按
字如其名,來看下Pipeline中throwIt的用法,是怎么個(gè)丟棄方式
API
在Stage中,關(guān)于throwIt提供了下面的API:
函數(shù)中的動(dòng)作出現(xiàn)了兩個(gè)變量的使用:
internal.request.throws
internals.request.throwRoot 那么去到Pipeline里面看都哪里使用到了它。在看之前,先再來回顧下在SpinalHDL中pipeline的編程模型:
在Pipeline的模型里,Pipeline中的任何一級(jí)都是一個(gè)組合邏輯,如果它要驅(qū)動(dòng)下一級(jí)Pipeline,那么其可以通過Connection來和下一級(jí)建立連接關(guān)系,最后一級(jí)則沒有Connection。而在Connection中,則可以進(jìn)行打拍。也即Stage中負(fù)責(zé)功能實(shí)現(xiàn),Connection負(fù)責(zé)實(shí)現(xiàn)控制流水線級(jí)數(shù),時(shí)序優(yōu)化。
Connection中的作用
在Pipeline的build函數(shù)中,其定義了throwOne:
var throwOne = stage.internals.request.throws.nonEmpty generate orR(stage.internals.request.throws)
即如果internals.request.throws如果不為空,那么其中的所有條件取或后賦值給throwOne.
而后,在處理Stage間的連接關(guān)系時(shí)有:
這里對(duì)于驅(qū)動(dòng)該級(jí)的Connection,首先將throwOne保留至clThrowOne(l)中,隨后在if判斷中,會(huì)為clThrowOneHit(l)聲明為一個(gè)Bool()對(duì)象。在常用的Connection M2S、S2M中,alwasContainsSlaveToken均為true,故此時(shí)throwOne變量將會(huì)被賦值為null。
而對(duì)于:
if(throwOne != null) c.m.throwIt(throwOne, root = false)
由于此時(shí)throwOne重新被賦值為null,故并不會(huì)為驅(qū)動(dòng)該Stage的Master調(diào)用throwIt,也即throw并不會(huì)向前級(jí)傳輸。
最終會(huì)調(diào)用下面的函數(shù)來進(jìn)行Stage間的連接關(guān)系:
valarea = l.on(m, s, clFlush(l), clFlushNext(l), clFlushNextHit(l), clThrowOne(l), clThrowOneHit(l))
clThrowOne(l)作為throwHead參數(shù)傳入Connection的on函數(shù)。以M2S為例,我們來看下其在里面會(huì)有哪些動(dòng)作:
m.ready match { casenull=> s.valid := m.valid (s.payload, m.payload).zipped.foreach(_ := _) caser => { 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 elser) { (s.payload, m.payload).zipped.foreach(_ := _) } } }
可以看到,如果驅(qū)動(dòng)Connection的Master沒有ready信號(hào),那么throwHead是沒有任何作用的。
如果master具備ready信號(hào),如果此時(shí)m.ready信號(hào)為低電平,那么作為Slave的Stage其input.valid將會(huì)在下一拍變?yōu)榈碗娖健?/p>
Stage中的作用
在Stage中的作用比較簡單,僅internals.request.throwRoot會(huì)起作用。在Pipeline中的build函數(shù)中:
if(s.request.throwsRoot.nonEmpty){ val doThrow = s.request.throwsRoot.orR when(doThrow){ s.output.valid := False } }
如果throwsRoot不為空,則其中任意一個(gè)條件滿足是,Stage中的output.valid會(huì)立即清零。
結(jié)合Connection中throw的作用,throw會(huì)導(dǎo)致當(dāng)前Stage的input.valid在下一拍清空(input.valid為寄存器),而默認(rèn)情況下stage的output.valid(Wire)直接由input.valid驅(qū)動(dòng),故throwsRoot的作用就是讓Stage的output.valid立即生效。比如說此時(shí)input.valid為高電平,ouput.ready也為高電平,throwsRoot將output.valid直接拉低避免當(dāng)前拍的數(shù)據(jù)傳輸?shù)较乱患?jí),從而實(shí)現(xiàn)立即丟掉。
Example
在這個(gè)例子中,如果cond為true,則stage2會(huì)立即丟掉當(dāng)前傳輸至output端口的數(shù)據(jù)。
審核編輯:湯梓紅
-
API
+關(guān)注
關(guān)注
2文章
1499瀏覽量
61964 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62573 -
模型
+關(guān)注
關(guān)注
1文章
3226瀏覽量
48809 -
Pipeline
+關(guān)注
關(guān)注
0文章
28瀏覽量
9361
原文標(biāo)題:pipeline高端玩法(十)—throwIt
文章出處:【微信號(hào):Spinal FPGA,微信公眾號(hào):Spinal FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論