色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取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

    瀏覽量

    47818
  • RTL
    RTL
    +關注

    關注

    1

    文章

    388

    瀏覽量

    60663
  • 代碼
    +關注

    關注

    30

    文章

    4886

    瀏覽量

    70253
  • Stream
    +關注

    關注

    0

    文章

    21

    瀏覽量

    8099

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

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

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    如何一鍵生成mybatisplus

    Mybatis代碼生成器相信大家用過,本篇博客我們來介紹如何一鍵生成mybatisplus 的相關Entity、Mapper、Mapper XML、Service、Controller
    的頭像 發表于 09-25 14:23 ?957次閱讀
    如何<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庫,包含了Stream、Flow、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 ?2310次閱讀

    淺析Stream的隱式轉換

    Stream、Flow電路描述經常用到的對象。
    的頭像 發表于 05-15 17:36 ?672次閱讀
    淺析<b class='flag-5'>Stream</b><b class='flag-5'>里</b>的隱式轉換
    主站蜘蛛池模板: 亚洲AV无码一区二区三区乱子伦 | 精品粉嫩BBWBBZBBW | 99re久久热在线播放快 | 扒开腿狂躁女人GIF动态图 | 亚洲日韩视频免费观看 | 超级乱淫片午夜电影网99 | 亚洲精品无夜久久久久久久久 | 99精品国产免费观看视频 | 男人和女人全黄一级毛片 | 国产麻豆剧果冻传媒免费网站 | 二级毛片免费观看全程 | 欧洲video60| 夜夜澡人人爽人人喊_欧美 夜夜骑夜夜欢 | 在公交车上被JB草坏了被轮J了 | 丰满人妻妇伦又伦精品APP国产 | 久久99re6热在线播放 | 蝴蝶中文娱乐 | 91久久精一区二区三区大全 | 不良网站进入窗口软件下载免费 | 日本VA在线视频播放 | TUBE69CHINESE学生 TUBE19UP老师学生 | 国产午夜人做人免费视频中文 | 人人艹人人 | 中文字幕无线观看不卡网站 | 福利一区国产 | 亚洲 自拍 偷拍 另类综合图区 | av天堂网站avtt2017 | 久久永久视频 | 国内精品国内自产视频 | 日本免费一区二区三区最新vr | 热久久免费频精品99热 | 国产 日韩 欧美 高清 亚洲 | 秀婷程仪公欲息肉婷在线观看 | 亚洲精品久久久久久偷窥 | 色狐直播免费观看 | 范冰冰hdxxxx | 99久久免费精品 | 99久久精品费精品国产一区二 | 2021乱码精品公司 | 做a爱片的全过程 | 最新毛片网 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品