在线观看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

    文章

    328

    瀏覽量

    47468
  • RTL
    RTL
    +關注

    關注

    1

    文章

    385

    瀏覽量

    59951
  • 代碼
    +關注

    關注

    30

    文章

    4827

    瀏覽量

    69055
  • Stream
    +關注

    關注

    0

    文章

    20

    瀏覽量

    8006

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

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

收藏 人收藏

    評論

    相關推薦

    如何一鍵生成mybatisplus

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

    淺析Stream的隱式轉換

    StreamFlow電路描述經常用到的對象。
    的頭像 發表于 05-15 17:36 ?518次閱讀
    淺析<b class='flag-5'>Stream</b><b class='flag-5'>里</b>的隱式轉換
    主站蜘蛛池模板: 给个网站可以在线观看你懂的 | 你懂的手机在线观看 | 在线a人片免费观看不卡 | 久久99久久精品免费思思6 | 欧美色操| 天天天干干干 | 亚洲羞羞裸色私人影院 | 日本污全彩肉肉无遮挡彩色 | 色婷婷六月丁香在线观看 | 老子影院午夜精品欧美视频 | 天天射天天草 | 天天拍夜夜添久久精品免费 | www.四虎影院在线观看 | 色多多视频在线观看播放 | 天天操天天干天搞天天射 | 狠狠色婷婷狠狠狠亚洲综合 | 亚洲综合成人网在线观看 | 中国女人a毛片免费全部播放 | 黄色的视频网站 | 国产大片黄在线看免费 | 日本色www | 日本黄视频在线播放 | 99r8这里精品热视频免费看 | 三级在线国产 | 国产无圣光高清一区二区 | 四虎国产精品永久地址51 | 亚洲第一区第二区 | 成年女人免费看一级人体片 | 一区二区三区网站在线免费线观看 | 在线观看国产三级 | 四虎音影 | 视频在线观看网站免费 | 你懂的手机在线观看 | 亚洲丁香 | 亚洲黄色小说网站 | 夜夜爽天天干 | 欧美性黄色 | 一卡二卡三卡四卡无卡在线 | 人人干在线 | 色香蕉在线观看网站 | 一级aaaaa毛片免费视频 |