女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

在SpinalHDL中如何優雅地例化端口?

FPGA之家 ? 來源:Spinal FPGA ? 作者:Spinal FPGA ? 2021-06-16 17:19 ? 次閱讀

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

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

valid_ininput1輸入有效標志

data1input8輸入數據

data2input8輸入數據

sumoutput8和

sum_validoutput1和有效標志

初階

剛開始接觸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)}

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

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

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

責任編輯:haq

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

    關注

    69

    文章

    5117

    瀏覽量

    88906
  • Verilog
    +關注

    關注

    28

    文章

    1365

    瀏覽量

    111765

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    推薦!如何優雅地擺好PCB絲印?

    很多畫PCB的人,會認為絲印不影響電路的性能,所以,對絲印并不重視。但是,對于一個專業的硬件工程師來說,必須重視這些細節。 下面介紹如何優雅地弄好PCB絲印。 1 擺放的位置 一般來說,電阻、電容
    發表于 04-08 14:59

    Verilog說明

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

    如何設置內網IP的端口映射到公網

    現代網絡環境端口映射(Port Mapping)是一項非常實用的技術,它允許用戶將內網設備的服務端口映射到公網,使外網用戶可以訪問內網
    的頭像 發表于 11-14 14:23 ?1720次閱讀

    內部端口和外部端口怎么填

    計算機網絡端口(Port)是用來區分不同服務或應用程序的數據傳輸通道。每個端口號都是一個16位的數字,范圍從0到65535。端口號被分
    的頭像 發表于 10-17 10:58 ?2460次閱讀

    外部端口和內部端口是什么意思

    計算機網絡和網絡安全領域,"外部端口"和"內部端口"這兩個術語通常用來描述網絡通信中的端口配置和訪問控制。 外部端口(External P
    的頭像 發表于 10-17 10:50 ?2367次閱讀

    控制端口和數據端口怎么區別

    計算機網絡端口是用來區分不同服務的邏輯概念。每個端口都有一個唯一的編號,范圍從0到65535。端口可以分為控制
    的頭像 發表于 10-17 10:40 ?1172次閱讀

    ad端口的幾種類型

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

    adc器件各端口的位置是什么

    端口的功能和位置同類型ADC可能會有所相似。以下是一些常見的ADC端口及其功能的概述: 1. 模擬輸入端口(Analog Input P
    的頭像 發表于 09-29 10:07 ?1361次閱讀

    以太網端口和千兆端口的區別

    以太網端口和千兆端口多個方面存在顯著的區別,這些區別主要體現在速度、應用范圍、技術規格以及網絡性能等方面。
    的頭像 發表于 08-07 15:42 ?2205次閱讀

    如何優雅OpenMV上使用LVGL

    LVGL適配到OpenMV工程menuconfig配置LVGL配置SDK的openmv工程的基礎上進行修改,添加LVGLV8的packages包,使用scons
    的頭像 發表于 07-31 08:36 ?1660次閱讀
    如何<b class='flag-5'>優雅</b>的<b class='flag-5'>在</b>OpenMV上使用LVGL

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

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

    路由器端口轉發怎么設置

    路由器端口轉發設置是網絡配置的一個重要環節,它允許外部設備通過特定的端口訪問內網的設備或服務。 路由器端口轉發的基本概念 1.1 什么是
    的頭像 發表于 07-09 11:33 ?1.1w次閱讀

    PLC輸入端口和輸出端口的工作原理

    工業自動領域中,PLC(Programmable Logic Controller,可編程邏輯控制器)因其高度的可靠性、靈活性和強大的功能而備受青睞。PLC系統通過其輸入端口接收外部信號,經過
    的頭像 發表于 06-19 14:11 ?4767次閱讀

    機器視覺檢測技術工業自動的應用

    隨著科技的飛速發展,工業自動已成為現代工業生產的核心動力。在這個背景下,機器視覺檢測技術作為工業自動的關鍵技術之一,以其高精度、高效率、高可靠性的優勢,工業自動
    的頭像 發表于 06-07 12:06 ?1203次閱讀

    PID控制器工業自動的應用

    于各種工業自動系統。本文將詳細介紹PID控制器的工作原理、參數調整及其工業自動的應用,旨在為讀者提供對PID控制器
    的頭像 發表于 06-05 16:24 ?2732次閱讀