在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在SpinalHDL里在頂層一鍵優化Stream/Flow代碼生成

Spinal FPGA ? 來源:Spinal FPGA ? 2023-12-14 09:05 ? 次閱讀

在SpinalHDL里在頂層一鍵優化代碼中Stream/Flow代碼生成的payload,fragment。

難看的代碼

來看一段代碼:

importspinal.core._
importspinal.lib._
caseclassDataPort() extendsBundle{
val data0=UInt(8bits)
val data1=UInt(8bits)
}

caseclassDemo() extendsComponent{
val io=newBundle{
val sink=slave(Stream(Fragment(DataPort())))
val source=master(Stream(Fragment(DataPort())))
}
noIoPrefix()
io.source<

很簡單的功能,一個Stream接口Pipeline打拍。在生成RTL代碼時會看到下面這種有點兒“不太舒服”的結構命名:

 wiresink_s2mPipe_payload_last;
wire[7:0] sink_s2mPipe_payload_fragment_data0;
wire[7:0] sink_s2mPipe_payload_fragment_data1;
regsink_rValidN;
regsink_rData_last;
reg[7:0] sink_rData_fragment_data0;
reg[7:0] sink_rData_fragment_data1;
wiresink_s2mPipe_m2sPipe_valid;
wiresink_s2mPipe_m2sPipe_ready;
wiresink_s2mPipe_m2sPipe_payload_last;
wire[7:0] sink_s2mPipe_m2sPipe_payload_fragment_data0;
wire[7:0] sink_s2mPipe_m2sPipe_payload_fragment_data1;

雖然說不怎么看生成的代碼,但有時候別人看這里信號命名中間夾雜了一堆_payload_fragment_的信號還是略覺有點兒啰嗦。

尤其在用一些Axi/AxiLite總線時,當使用cloneOf時,會發現大量的信號名中間夾著一些paylaod字段,略覺不雅~

雖然這是Stream類的定義所導致,但如果去修改設計中的每一處總歸還是比較麻煩的~

StreamRenameUtil

這里提供一個DIY的工具StreamRenameUtil,用于在設計的頂層一鍵讓這種場景下的代碼生成稍微優雅一些:

object StreamRenameUtil {
def apply(topLevel:Component) = {
Rename(topLevel,true)
}

def Rename(toplevel:Component,isCurrentComponentBoolean={
//current component process
if(!isCurrentComponent){
toplevel.dslBody.foreachStatements{
casebt:BaseType ifbt.parent.isInstanceOf[Stream[_]] => streamRename( bt.parent.asInstanceOf[Stream[_]])
casebt:BaseType ifbt.parent.isInstanceOf[Flow[_]] => flowRename( bt.parent.asInstanceOf[Flow[_]])
case_ =>
}
}else{
toplevel.dslBody.foreachStatements{
casebt:BaseType ifbt.parent.isInstanceOf[Stream[_]] => toplevel.addPrePopTask(()=>{streamRename( bt.parent.asInstanceOf[Stream[_]])})
casebt:BaseType ifbt.parent.isInstanceOf[Flow[_]] => toplevel.addPrePopTask(()=>{flowRename( bt.parent.asInstanceOf[Flow[_]])})
case_ =>
}
}

for(child<-toplevel.children){
??????Rename(child,false)
????}
????true
??}

??def streamRename(streamPort:Stream[_])={
????streamPort.flatten.foreach((bt)=>{
val signalName=bt.getName()
if(signalName.contains("fragment")){
bt.setName(signalName.replace("_payload_fragment_","_"))
}else{
bt.setName(signalName.replace("_payload_","_"))
}
})
}

def flowRename(flowPort:Flow[_])={
flowPort.flatten.foreach((bt)=>{
val signalName=bt.getName()
if(signalName.contains("fragment")){
bt.setName(signalName.replace("_payload_fragment_","_"))
}else{
bt.setName(signalName.replace("_payload_","_"))
}
})
}

}

使用時僅需在頂層調用該方法,其會遍歷設計中各模塊的Stream、Flow類變量定義統一做修改:

caseclassDemo() extendsComponent{
val io=newBundle{
val sink=slave(Stream(Fragment(DataPort())))
val source=master(Stream(Fragment(DataPort())))
}
noIoPrefix()
io.source<

最終代碼生成會優雅一些:

 wiresink_s2mPipe_valid;
regsink_s2mPipe_ready;
wiresink_s2mPipe_last;
wire[7:0] sink_s2mPipe_data0;
wire[7:0] sink_s2mPipe_data1;
regsink_rValidN;
regsink_rData_last;
reg[7:0] sink_rData_fragment_data0;
reg[7:0] sink_rData_fragment_data1;
wiresink_s2mPipe_m2sPipe_valid;
wiresink_s2mPipe_m2sPipe_ready;
wiresink_s2mPipe_m2sPipe_last;
wire[7:0] sink_s2mPipe_m2sPipe_data0;
wire[7:0] sink_s2mPipe_m2sPipe_data1;
regsink_s2mPipe_rValid;
regsink_s2mPipe_rData_last;
reg[7:0] sink_s2mPipe_rData_fragment_data0;
reg[7:0] sink_s2mPipe_rData_fragment_data1;
wirewhen_Stream_l369;

這里的sink_s2mPipe_rData_fragment_data0、sink_s2mPipe_rData_fragment_data1為在打拍時生命的Fragment類型,非Stream類型,如果你實在看不慣也可以依樣畫葫蘆添加一個對Fragment類型的Rename~

審核編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • HDL
    HDL
    +關注

    關注

    8

    文章

    330

    瀏覽量

    47852
  • RTL
    RTL
    +關注

    關注

    1

    文章

    388

    瀏覽量

    60739
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70315
  • Stream
    +關注

    關注

    0

    文章

    21

    瀏覽量

    8105

原文標題:逼死強迫癥—優化Stream/Flow代碼生成

文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    如何一鍵生成mybatisplus

    Mybatis代碼生成器相信大家用過,本篇博客我們來介紹如何一鍵生成mybatisplus 的相關Entity、Mapper、Mapper XML、Service、Controller
    的頭像 發表于 09-25 14:23 ?971次閱讀
    如何<b class='flag-5'>一鍵</b><b class='flag-5'>生成</b>mybatisplus

    SpinalHDLswitch方法有何用處呢

    ,當我們需要根據tkeep信號來計算這拍有多少有效數據時這里的代碼會是什么樣子……這種代碼寫的手有點兒累(又沒啥技術含量)……SpinalHDL
    發表于 06-22 14:25

    SpinalHDL實現優雅的添加待跟蹤波形信號

    SpinalHDL,我們樣可以實現優雅的添加待跟蹤波形信號。姿勢一在Verilog代碼,我
    發表于 06-22 14:37

    個小的example來對比SpinalHDL Lib庫的強大

    SpinalHDL的世界,它基于core提供了豐富的Lib庫,包含了StreamFlow、Fragment、State Machine
    發表于 06-22 14:44

    SpinalHDL的設計中集成現有RTL設計(IP)的渠道——BlackBox

    我們SpinalHDL的設計中提供了集成現有RTL設計(IP)的渠道——BlackBox。BlackBox顧名思義,SpinalHDL將待集成的RTL設計當作個黑盒對待,不關心內部
    發表于 06-22 14:59

    SpinalHDL中關于casez的使用

    SpinalHDL中的switch之前的文章中曾提到過SpinalHDL中switch的使用:通常情況下,switch對應著我們日常Verilog代碼中的case。像下面的
    發表于 07-06 10:59

    以slaveFactory庫為例看看如何一鍵生成整個設計的寄存器文檔

    在做邏輯實現及后期調試維護維護文檔中的寄存器列表和真實設計中的唯性往往是件令人“痛苦”的事情(個字,懶)。
    發表于 07-08 16:05

    分享SpinalHDLapply的有趣用法

    個例子,SpinalHDL的example關于UDP設計的代碼看到了這么
    發表于 07-19 15:08

    SpinalHDL中的代碼組織結構如何實現Component參數化設計呢

    方式:some.where.else.theSignal.pull()在生成RTL代碼時,會講該信號聲明個端口鏈接偷穿到我們這級的Component。Component參數化設計與
    發表于 07-21 14:20

    SpinalHDL將功能封裝抽象成庫函數供Stream總線接口快速調用

    io_dataIn 做拍總線握手延遲即可但現在需要在輸出io_dataIn* 之前插入拍數據先輸出。insertHeaderSpinalHDL
    發表于 07-21 14:31

    如何在SpinalHDL啟動個仿真

    前言安裝完成Verilator、GtkWave后,我們即可在IDEA通過SpinalHDL提供的仿真接口來對我們的設計進行仿真。Spinal
    發表于 07-26 16:59

    SpinalHDL有沒有什么好的方式實現個接口位寬轉換呢

    下午微信群有個小伙伴問了這么道題:將個為UInt(128 bits)的Stream接口連接到個UInt(32 bits)的Strea
    發表于 07-27 14:52

    SpinalHDL中常用的Stream總線

    在于SpinalHDL中,Stream/Flow這種類型映射生成Verilog
    發表于 01-31 16:38

    SpinalHDL時鐘域中的定制與命名

    SpinalHDL時鐘域中時鐘的定制與命名。 相較于Verilog,SpinalHDL
    的頭像 發表于 03-22 10:14 ?2338次閱讀

    淺析Stream的隱式轉換

    StreamFlow電路描述經常用到的對象。
    的頭像 發表于 05-15 17:36 ?689次閱讀
    淺析<b class='flag-5'>Stream</b><b class='flag-5'>里</b>的隱式轉換
    主站蜘蛛池模板: 亚洲www色| xxxx日本69xxxxx| 亚洲国产精品久久久久婷婷软件 | 91网站在线看 | 欧美污网站 | 色视频免费国产观看 | 免费人成在线观看网站品爱网日本 | 久草狼人 | 中国农村一级片 | 欧美精品久久天天躁 | 国产一区二区影院 | 国产精品视频一区国模私拍 | 日本日b视频 | 午夜一区二区在线观看 | 555夜色555亚洲夜色 | 你懂的在线免费视频 | 亚洲你懂的 | 边摸边吃奶边做视频叫床韩剧 | 色综合久久中文综合网 | 天天看天天爽天天摸天天添 | 天天干天天操天天玩 | 欧美三级视频在线 | 三级毛片免费观看 | 啪啪亚洲 | 亚洲人成电影综合网站色 | 欧美高清milf在线播放 | 天天舔日日干 | 五月天婷婷在线观看 | 欧美怡红院免费全部视频 | 大尺度在线播放 | 深夜视频免费看 | 狠狠色视频 | 欧美日韩一日韩一线不卡 | 红怡院欧洲 | 日韩高清特级特黄毛片 | www五月婷婷| 色黄视频 | 全国男人天堂网 | 国产欧美日韩haodiaose | 成人午夜大片免费视频77777 | 日日做日日摸夜夜爽 |