0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Pipeline中throwIt的用法

Spinal FPGA ? 來(lái)源:Spinal FPGA ? 2023-10-21 16:24 ? 次閱讀

編 者 按

字如其名,來(lái)看下Pipeline中throwIt的用法,是怎么個(gè)丟棄方式

API

在Stage中,關(guān)于throwIt提供了下面的API:

deb429c2-6fe9-11ee-939d-92fbcf53809c.png

函數(shù)中的動(dòng)作出現(xiàn)了兩個(gè)變量的使用:

internal.request.throws

internals.request.throwRoot 那么去到Pipeline里面看都哪里使用到了它。在看之前,先再來(lái)回顧下在SpinalHDL中pipeline的編程模型:

dec5b69c-6fe9-11ee-939d-92fbcf53809c.png

在Pipeline的模型里,Pipeline中的任何一級(jí)都是一個(gè)組合邏輯,如果它要驅(qū)動(dòng)下一級(jí)Pipeline,那么其可以通過(guò)Connection來(lái)和下一級(jí)建立連接關(guān)系,最后一級(jí)則沒(méi)有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í)有:

decf0e18-6fe9-11ee-939d-92fbcf53809c.png

這里對(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ù)來(lái)進(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為例,我們來(lái)看下其在里面會(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沒(méi)有ready信號(hào),那么throwHead是沒(méi)有任何作用的。

如果master具備ready信號(hào),如果此時(shí)m.ready信號(hào)為低電平,那么作為Slave的Stage其input.valid將會(huì)在下一拍變?yōu)榈碗娖健?/p>

Stage中的作用

在Stage中的作用比較簡(jiǎn)單,僅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立即生效。比如說(shuō)此時(shí)input.valid為高電平,ouput.ready也為高電平,throwsRoot將output.valid直接拉低避免當(dāng)前拍的數(shù)據(jù)傳輸?shù)较乱患?jí),從而實(shí)現(xiàn)立即丟掉。

Example

dedc698c-6fe9-11ee-939d-92fbcf53809c.png

在這個(gè)例子中,如果cond為true,則stage2會(huì)立即丟掉當(dāng)前傳輸至output端口的數(shù)據(jù)。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1464

    瀏覽量

    61670
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4256

    瀏覽量

    62223
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3058

    瀏覽量

    48571
  • Pipeline
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    9332

原文標(biāo)題:pipeline高端玩法(十)—throwIt

文章出處:【微信號(hào):Spinal FPGA,微信公眾號(hào):Spinal FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一覽pipeline中所出現(xiàn)的五個(gè)基本要素

    stageable、StageableKey是最整個(gè)pipeline的基本數(shù)據(jù)類型元素
    的頭像 發(fā)表于 08-12 11:24 ?903次閱讀
    一覽<b class='flag-5'>pipeline</b>中所出現(xiàn)的五個(gè)基本要素

    Stream模塊的基礎(chǔ)用法和進(jìn)階用法

    有用。在本教程,我們將介紹 Stream 模塊的基礎(chǔ)用法和進(jìn)階用法,并提供示例。 基礎(chǔ)用法 在本節(jié),我們將介紹 Stream 模塊的基礎(chǔ)
    的頭像 發(fā)表于 09-19 15:33 ?1080次閱讀

    Matlab的冒號(hào)的用法

    Matlab的冒號(hào)的用法
    發(fā)表于 03-11 22:22

    verilogHDL的{}用法

    verilogHDL的{}用法,求詳解。
    發(fā)表于 03-22 23:48

    求助,能否在一個(gè)pipeline添加多個(gè)音頻輸入流?

    能否在一個(gè)pipeline添加多個(gè)音頻輸入流[,例如httpstream flash_tone_stream,因?yàn)橐纛l的輸入方向有兩個(gè)?;蛘吣芊襁M(jìn)行pipeline的時(shí)間復(fù)用,覺(jué)得設(shè)置兩個(gè)播放的
    發(fā)表于 03-10 08:09

    Pipeline ADCs Come of Age

    Pipeline ADCs Come of Age Abstract: In the mid 1970s, a new data converter architecture
    發(fā)表于 04-16 16:21 ?1059次閱讀
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

    Pipeline ADCs Come of Age

    and mixed-signal community, called pipeline ADCs. The following article takes the knowledge of advantages and disadvantages of the pipeline
    發(fā)表于 04-25 10:22 ?1065次閱讀
    <b class='flag-5'>Pipeline</b> ADCs Come of Age

    OrCAD創(chuàng)建總線及用法詳解

    OrCAD創(chuàng)建總線及用法詳解,如何創(chuàng)建總線,菜單place->bus或者右側(cè)快捷按鈕
    發(fā)表于 12-02 10:18 ?2.6w次閱讀

    Simulink的Battery模塊用法概述

    如果進(jìn)行電池SOC的建模,常常會(huì)用到Simulink的Battery模塊,本期基于Matlab的help文件,會(huì)大家概述Battery模塊的用法。
    的頭像 發(fā)表于 06-28 15:00 ?5482次閱讀
    Simulink<b class='flag-5'>中</b>的Battery模塊<b class='flag-5'>用法</b>概述

    SpinalHDL里pipeline的設(shè)計(jì)思路

    如果你曾看過(guò)VexRSICV的設(shè)計(jì),對(duì)于從事邏輯設(shè)計(jì)的你會(huì)驚訝從未想過(guò)邏輯設(shè)計(jì)還能這么來(lái)做。針對(duì)VexRSICV所衍生出的pipeline Lib,該系列會(huì)對(duì)pipeline進(jìn)行一次梳理。誠(chéng)如之前一篇博客曾講,這是“勇者的游戲”。
    的頭像 發(fā)表于 08-16 15:11 ?878次閱讀
    SpinalHDL里<b class='flag-5'>pipeline</b>的設(shè)計(jì)思路

    扒一扒pipeline“spawn”的用法

    在Stage,關(guān)于spawn,定義了下面的兩個(gè)API
    的頭像 發(fā)表于 10-29 09:57 ?482次閱讀
    扒一扒<b class='flag-5'>pipeline</b><b class='flag-5'>中</b>“spawn”的<b class='flag-5'>用法</b>

    oraclesubstr函數(shù)用法

    在Oracle數(shù)據(jù)庫(kù),SUBSTR函數(shù)用于從字符串中提取子字符串。它的語(yǔ)法如下: SUBSTR(string, start_position, [length]) 其中,string是要從中提取子
    的頭像 發(fā)表于 12-05 16:57 ?1134次閱讀

    split在python用法

    split在python用法 split()是Python中一個(gè)非常常用的字符串函數(shù),它能夠根據(jù)指定的分隔符將一個(gè)字符串分割成多個(gè)子字符串,并返回一個(gè)包含這些子字符串的列表。本文將詳細(xì)介紹
    的頭像 發(fā)表于 12-25 15:12 ?1888次閱讀

    什么是pipeline?Go構(gòu)建流數(shù)據(jù)pipeline的技術(shù)

    本文介紹了在 Go 構(gòu)建流數(shù)據(jù)pipeline的技術(shù)。 處理此類pipeline的故障很棘手,因?yàn)?b class='flag-5'>pipeline
    的頭像 發(fā)表于 03-11 10:16 ?499次閱讀

    淺析SpinalHDLPipeline的復(fù)位定制

    之前有系列文章介紹了SpinalHDLPipeline的使用,最近在一個(gè)功能模塊真實(shí)的使用了這個(gè)lib。
    的頭像 發(fā)表于 03-17 17:31 ?928次閱讀
    淺析SpinalHDL<b class='flag-5'>中</b><b class='flag-5'>Pipeline</b><b class='flag-5'>中</b>的復(fù)位定制