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

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

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

3天內不再提示

在SpinalHDL中如何像軟件調用方法那樣優雅地例化端口

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-06-13 10:01 ? 次閱讀

在編寫Verilog代碼時最痛苦的事情便是例化模塊時端口的連接,這時候的你我便成了連線工程師,本節就在SpinalHDL中如何像軟件調用方法那樣優雅地例化端口進行探討。

前言

習慣了寫Verilog的小伙伴們在做大型工程時是否有遇到過連續數天時間化身“連線工程師”去例化模塊、為端口賦值連接的場景(關鍵是這些工作量老板他也不認)。盡管在SystemVerilog中提供了Interface接口的概念,但是從事FPGA的小伙伴都清楚無論是Xilinx的Vivado還是Intel Quartus雖然支持SystemVerilog但遠沒有做到像軟件代碼編輯器那般做到自動聯想與提示。最近分析一個Intel的大型源碼工程其中用到了大量的SystemVerilog中的interface及struct,但自動關聯提示做的真是一團糟,導致閱讀體驗真是差的一匹…… 本文以一個簡單的加法器的例子來看如何在SpinalHDL中如何避免成為連線工程師。 加法器端口列表如下所示:
端口名 方向 位寬 說明
valid_in input 1 輸入有效標志
data1 input 8 輸入數據
data2 input 8 輸入數據
sum output 8
sum_valid output 1 和有效標志

初階

剛開始接觸SpinalHDL時這個加法器我們可能會這么來寫:


class add(dataWidth:Int) extends Component{  val validIn=in Bool()  val data1=in UInt(dataWidth bits)  val data2=in UInt(dataWidth bits)  val sum=out UInt(dataWidth bits)  val sumValid=out Bool()  sum:=RegNextWhen(data1+data2,validIn)  sumValid:=RegNext(validIn,False)}

這里針對端口的實現形式和我們在Verilog中的方式基本相同。那么當我們在例化這個模塊時,我們可能會這么來寫:


class addInst(dataWidth:Int) extends Component {  val io=new Bundle{    val validIn_0=in Bool()    val data1_0=in UInt(dataWidth bits)    val data2_0=in UInt(dataWidth bits)    val sum_0=out UInt(dataWidth bits)    val sumValid_0=out Bool()
    val validIn_1=in Bool()    val data1_1=in UInt(dataWidth bits)    val data2_1=in UInt(dataWidth bits)    val sum_1=out UInt(dataWidth bits)    val sumValid_1=out Bool()  }  val add0=new add(dataWidth)  val add1=new add(dataWidth)  add0.validIn<>io.validIn_0  add0.data1<>io.data1_0  add0.data2<>io.data2_0  add0.sum<>io.sum_0  add0.sumValid<>io.sumValid_0    add1.validIn<>io.validIn_1  add1.data1<>io.data1_1  add1.data2<>io.data2_1  add1.sum<>io.sum_1  add1.sumValid<>io.sumValid_1}

這里例化了兩個加法器,可以看到,這里如同我們寫Verilog代碼般一根根連線,當有眾多模塊需要去例化時還是蠻痛苦的。

中階

在SystemVerilog中提供了Interface的概念用于封裝接口,在SpinalHDL中,我們可以借助軟件面向對象的思想把接口給抽象出來:


case class sumPort(dataWidth:Int=8) extends Bundle with IMasterSlave{  case class dataPort(dataWidth:Int=8) extends Bundle{    val data1=UInt(dataWidth bits)    val data2=UInt(dataWidth bits)  }  val dataIn=Flow(dataPort(dataWidth))  val sum=Flow(UInt(dataWidth bits))
  override def asMaster(): Unit = {    master(dataIn)    slave(sum)  }}

這里我們將加法器的端口抽象成sumPort端口。其中包含兩個Flow類型:dataIn、sum。并聲明當作為master端口時dataIn為master、sum為slave。這樣,我們的加法器便可以這么來寫:


case class add2(dataWidth:Int=8)extends Component{  val io=new Bundle{    val sumport=slave(sumPort(dataWidth))  }  io.sumport.sum.payload:=RegNextWhen(io.sumport.dataIn.data1+io.sumport.dataIn.data2,io.sumport.dataIn.valid)  io.sumport.sum.valid:=RegNext(io.sumport.dataIn.valid,False)}

而我們在例化時,便可以簡潔地例化:


class addInst1(dataWidth:Int) extends Component{  val io=new Bundle{    val sumport0=slave(sumPort(dataWidth))    val sumport1=slave(sumPort(dataWidth))  }  val addInst_0=add2(dataWidth)  val addInst_1=add2(dataWidth)  io.sumport0<>addInst_0.io.sumport  io.sumport1<>addInst_1.io.sumport}

如此我們便能簡潔地例化加法器。雖然這里地做法思想和SystemVerilog中地思想基本一致,但好處是我們能夠在IDEA中像閱讀軟件代碼那般快速地跳轉和定位,相較于廠商工具中那樣分析工程地痛苦實在是好太多。

高階

在中階例,我們采用了類似SystemVerilog中Interface及struct概念,但可以發現,我們這里依舊存在連線行為。一個模塊例化一次要連線一次,要例化N次還是要……

在軟件代碼中,調用一個方法或者模塊往往一行代碼了事:聲明調用函數并將參數放在括號列表里。那么在這里,我們能否像軟件調用那樣一行代碼搞定呢?

可以的!由于SpinalHDL是基于Scala的,因此我們可以將端口列表當成參數列表來傳遞。這里我們先為我們的加法器定義一個伴生對象:


object add2{  def apply(dataWidth: Int,port Unit = {    val addInst=new add2(dataWidth)    addInst.io.sumport<>port  }}

這里我們為加法器add2定義了一個伴生對象(伴生對象聲明為object,名字與類名相同)。并在其中定義了一個apply方法,傳入兩個參數:位寬dataWidth及端口port,并在apply實現中完成模塊例化及端口連接(一次連線,終身使用)。隨后我們在例化時便可以像軟件調用方法那樣例化模塊了:


class addInst1(dataWidth:Int) extends Component{  val io=new Bundle{    val sumport0=slave(sumPort(dataWidth))    val sumport1=slave(sumPort(dataWidth))  }  add2(dataWidth,io.sumport0)  add2(dataWidth,io.sumport0)}

一行代碼搞定一個模塊的一次例化和端口連接!

審核編輯 :李倩


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

    關注

    6

    文章

    183

    瀏覽量

    30639
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70312
  • 編輯器
    +關注

    關注

    1

    文章

    818

    瀏覽量

    31823

原文標題:SpinalHDL—像軟件調用方法般例化模塊

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    cyusb3014插入usb2.0接口后,軟件調用cyapi.lib的哪些函數完成初始、讀寫操作?

    cyusb3014,插入usb2.0接口后,軟件調用cyapi.lib的哪些函數完成初始、讀寫操作?
    發表于 05-29 07:14

    研發排查問題的利器:一款方法調用棧跟蹤工具

    作者:京東物流 郭忠強 導語 本文從日常值班問題排查痛點出發,分析方法復用的調用鏈路和上下文業務邏輯,通過思考分析,借助棧幀開發了一個方法調用棧的鏈式跟蹤工具,便于展示一次請求的
    的頭像 發表于 05-06 17:24 ?2250次閱讀
    研發排查問題的利器:一款<b class='flag-5'>方法</b><b class='flag-5'>調用</b>棧跟蹤工具

    stm32的pcrop安全系數高不高,是否會普通flash讀保護那樣被人家破解?

    問題1,stm32的pcrop安全系數高不高,是否會普通flash讀保護那樣被人家破解?能否起到代碼保護作用不被解密 2,哪些stm32型號具備pcrop功能?希望具體一點。
    發表于 03-13 06:09

    Linux下安裝軟件有哪些方法

    Linux下安裝軟件,可以有哪些方法? 首先是最簡單的,使用軟件包管理工具。 如果是ubuntu或者debian系統,可以使用apt;如果是紅帽或者centos,可以使用yum。 所
    的頭像 發表于 02-08 09:41 ?549次閱讀

    ShiMetaOS | 怎樣調用ShiMeta信息發布軟件快速打造數字標牌產品

    發布軟件無縫集成于ShiMetaOS系統,無需額外授權即可使用,極大地降低了使用成本,為用戶提供了一款高性價比的解決方案。二、怎樣調用ShiMetaOS的信息發
    的頭像 發表于 02-05 17:10 ?525次閱讀
    ShiMetaOS  | 怎樣<b class='flag-5'>調用</b>ShiMeta信息發布<b class='flag-5'>軟件</b>快速打造數字標牌產品

    請問ADS1256能ADS1271那樣級聯嗎?

    項目要做多了同步采集,ADS1256的精度較ADS1271高,所以,選用ADS1256,請問:ADS1256能ADS1271那樣級聯嗎?
    發表于 12-24 07:32

    Verilog說明

    (或說是調用)。一個FPGA項目工程,其輸入、輸出端口命名通常在設計前期就已確定下來,
    的頭像 發表于 12-17 11:29 ?1977次閱讀
    Verilog<b class='flag-5'>例</b><b class='flag-5'>化</b>說明

    三相維也納電路,是否需要單項那樣加一個pfc芯片?

    本人接了一個項目,需要輸入端380-525vac輸入,但是輸出要達到600-800vdc,電流14-17a,想用三相維也納電路,但現在迷茫如何看電路pf值是否得到了矯正,需不需要單項那樣加一個pfc芯片,因為要實現軟啟動,過
    發表于 10-17 09:31

    ad端口的幾種類型

    Altium Designer(簡稱AD)等電子設計自動(EDA)軟件端口(Port)是設計原理圖時用于連接和表示信號流動的重要元素
    的頭像 發表于 09-29 10:11 ?4664次閱讀

    請問studio可以裸機一樣調用定時器中斷嗎?

    studio可以裸機一樣調用定時器中斷嗎?我調用后顯示出錯了,使用hal庫還需要添加什么嗎
    發表于 09-13 08:18

    鑒源實驗室·ISO 26262測試用的得出方法-等價類的生成和分析

    標準規范給出了單元、集成、系統測試各階段的建議測試使用方法,設計生成測試用的建議方法包括需求分析、等價類的生成和分析、邊界值分析、基于已有經驗和知識的錯誤推測等等,從本篇開始我們
    的頭像 發表于 07-30 15:37 ?881次閱讀
    鑒源實驗室·ISO 26262<b class='flag-5'>中</b>測試用<b class='flag-5'>例</b>的得出<b class='flag-5'>方法</b>-等價類的生成和分析

    求助各位關于Verilog當中模塊端口與引腳 的問題

    初學者。我刷HDLbits的時候做到了這道題 答案: 答案給的是定義了wire型的信號,并借這個來進行端口連接。而我的疑問在于: 1.模塊化時,如果采用按名字的方式進行
    發表于 07-15 20:38

    python訓練出的模型怎么調用

    Python,訓練出的模型可以通過多種方式進行調用。 1. 模型保存與加載 Python,訓練好的模型需要被保存,以便在其他程序或會
    的頭像 發表于 07-11 10:15 ?3233次閱讀

    每次調用espconn_send之前,重新設置遠程IP和端口的目的是什么?

    我們初始期間設置remote_ip并remote_port一次,則在每次重復調用此函數之前,remote_ip和remote_port永遠不會更改。即使發送方從第三個網絡節點到同
    發表于 07-11 07:25

    動態追溯方法:徹底革新軟件測試

    動態追溯方法為解決軟件開發追溯的挑戰提供了創新的解決方案。通過自動和動態地鏈接需求和測試用,使測試過程顯著提高效率和精確度。該方法減少了
    的頭像 發表于 07-05 17:40 ?642次閱讀
    動態追溯<b class='flag-5'>方法</b>:徹底革新<b class='flag-5'>軟件</b>測試
    主站蜘蛛池模板: 欧美一区二区三区视频在线观看 | 免费国产成高清人在线视频 | 777国产精品永久免费观看 | 一区二区三区久久 | 依依成人精品无v国产 | 欧美一级免费看 | 精品国产免费久久久久久婷婷 | 国产资源在线播放 | 天天舔天天色 | 免费啪啪小视频 | 34pao强力打造免费永久视频 | 黑人40厘米全进去xxxx猛交 | 性欧美精品xxxx | 狠狠色婷婷丁香综合久久韩国 | 十三以下岁女子毛片免费播放 | 男人的天堂色偷偷之色偷偷 | 美女张开腿让男人桶爽 | 狠狠色网站| 荡女妇边被c边呻吟久久 | www.四虎影院在线观看 | 91夜夜人人揉人人捏人人添 | 日韩久久精品视频 | 欧美xxxx性高清 | 欧美婷婷 | 一区二区在线观看高清 | 成人在色线视频在线观看免费大全 | 午夜视频在线 | 特黄特色 | 55夜色66夜色国产精品站 | 天堂8在线天堂资源在线 | 四虎影永久在线观看精品 | 国产综合精品久久亚洲 | 免费人成网站线观看合集 | 国产在线视频你懂的 | 99久热只有精品视频免费观看17 | 日本写真高清视频免费网站网 | 一区二区三区亚洲视频 | 性夜影院爽黄a免费视频 | 99精品久久99久久久久久 | 免费人成黄页在线观看日本 | 手机看片日本 |