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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在SpinalHDL中如何優(yōu)雅地例化端口?

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

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

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

valid_ininput1輸入有效標(biāo)志

data1input8輸入數(shù)據(jù)

data2input8輸入數(shù)據(jù)

sumoutput8和

sum_validoutput1和有效標(biāo)志

初階

剛開始接觸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,F(xiàn)alse)}

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

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代碼般一根根連線,當(dāng)有眾多模塊需要去例化時還是蠻痛苦的。

中階

在SystemVerilog中提供了Interface的概念用于封裝接口,在SpinalHDL中,我們可以借助軟件面向?qū)ο蟮乃枷氚呀涌诮o抽象出來:

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。并聲明當(dāng)作為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,F(xiàn)alse)}

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

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中像閱讀軟件代碼那般快速地跳轉(zhuǎn)和定位,相較于廠商工具中那樣分析工程地痛苦實在是好太多。

高階

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

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

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

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

這里我們?yōu)榧臃ㄆ鱝dd2定義了一個伴生對象(伴生對象聲明為object,名字與類名相同)。并在其中定義了一個apply方法,傳入兩個參數(shù):位寬dataWidth及端口port,并在apply實現(xiàn)中完成模塊例化及端口連接(一次連線,終身使用)。隨后我們在例化時便可以像軟件調(diào)用方法那樣例化模塊了:

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)}

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

原文標(biāo)題:SpinalHDL—像軟件調(diào)用方法般例化模塊

文章出處:【微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    4944

    瀏覽量

    87491
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110100

原文標(biāo)題:SpinalHDL—像軟件調(diào)用方法般例化模塊

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

收藏 人收藏

    評論

    相關(guān)推薦

    Verilog說明

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

    內(nèi)部端口和外部端口怎么填

    計算機(jī)網(wǎng)絡(luò)端口(Port)是用來區(qū)分不同服務(wù)或應(yīng)用程序的數(shù)據(jù)傳輸通道。每個端口號都是一個16位的數(shù)字,范圍從0到65535。端口號被分
    的頭像 發(fā)表于 10-17 10:58 ?665次閱讀

    外部端口和內(nèi)部端口是什么意思

    計算機(jī)網(wǎng)絡(luò)和網(wǎng)絡(luò)安全領(lǐng)域,"外部端口"和"內(nèi)部端口"這兩個術(shù)語通常用來描述網(wǎng)絡(luò)通信中的端口配置和訪問控制。 外部端口(External P
    的頭像 發(fā)表于 10-17 10:50 ?783次閱讀

    控制端口和數(shù)據(jù)端口怎么區(qū)別

    計算機(jī)網(wǎng)絡(luò)端口是用來區(qū)分不同服務(wù)的邏輯概念。每個端口都有一個唯一的編號,范圍從0到65535。端口可以分為控制
    的頭像 發(fā)表于 10-17 10:40 ?433次閱讀

    ad端口的幾種類型

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

    求助各位關(guān)于Verilog當(dāng)中模塊端口與引腳 的問題

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

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

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

    嵌入式設(shè)計擴(kuò)展串行端口的入門知識

    大多數(shù)嵌入式系統(tǒng)都至少提供兩個串口。然而,有些系統(tǒng)需要更多。因此,這需要以某種方式擴(kuò)展串行端口的數(shù)量。設(shè)計人員可用的一些選擇包括 USB 到串行端口、I2C 到串行端口、地址/數(shù)據(jù)總線到串行
    發(fā)表于 05-03 09:30 ?256次閱讀
    <b class='flag-5'>在</b>嵌入式設(shè)計<b class='flag-5'>中</b>擴(kuò)展串行<b class='flag-5'>端口</b>的入門知識

    淺析SpinalHDLPipeline的復(fù)位定制

    之前有系列文章介紹了SpinalHDLPipeline的使用,最近在一個功能模塊真實的使用了這個lib。
    的頭像 發(fā)表于 03-17 17:31 ?1048次閱讀
    淺析<b class='flag-5'>SpinalHDL</b><b class='flag-5'>中</b>Pipeline<b class='flag-5'>中</b>的復(fù)位定制

    verilog端口類型有哪三種

    Verilog 端口類型有三種:輸入端口(input)、輸出端口(output)和雙向端口
    的頭像 發(fā)表于 02-23 10:28 ?2107次閱讀

    verilog雙向端口的使用

    輸出信號。本文將詳細(xì)介紹Verilog雙向端口的使用,并提供示例說明其實際應(yīng)用的作用。 第一部分:雙向端口的定義和語法 Verilog
    的頭像 發(fā)表于 02-23 10:18 ?1411次閱讀

    優(yōu)雅停機(jī)是什么?SpringBoot+Nacos+k8s實現(xiàn)優(yōu)雅停機(jī)

    優(yōu)雅停機(jī)是什么?網(wǎng)上說的優(yōu)雅下線、無損下線,都是一個意思。
    的頭像 發(fā)表于 02-20 10:00 ?2064次閱讀
    <b class='flag-5'>優(yōu)雅</b>停機(jī)是什么?SpringBoot+Nacos+k8s實現(xiàn)<b class='flag-5'>優(yōu)雅</b>停機(jī)

    #2024,立Flag了嘛? #win平臺搭建SpinalHDL開發(fā)環(huán)境

    ,這個一步需要勾選紅框的這一項; 對應(yīng)的IDEA的插件安裝Scala和SBT: Scala插件安裝: SBT插件安裝 2.2、JDK安裝 直接到JDK官網(wǎng)下載安裝包下載即可: JDK的安裝沒有
    發(fā)表于 01-21 10:52

    請問如何使用BLE藍(lán)牙串行端口上打印數(shù)據(jù)?

    讓我學(xué)習(xí)? 以 Ce218137_ble_Proximity_RTOS 為,我可以成功連接并查看 CySmart 的值變化。 但是我想要的是將它們打印串行端口中,然后從調(diào)諧器
    發(fā)表于 01-18 08:37

    #2024,立Flag了嘛? # 開年之疑問重重

    選擇SpinalHDL、chisel還是verilog HDL作為開發(fā)語言,上周FPGA大佬跟幾個IC設(shè)計公司的同學(xué)吃飯后,聊了一下發(fā)現(xiàn)對應(yīng)的行業(yè)標(biāo)桿的公司導(dǎo)入了spinalHDL作為開發(fā)語言
    發(fā)表于 01-13 09:18
    主站蜘蛛池模板: 日本一视频一区视频二区| www亚洲成人| 一级做受毛片免费大片| 日韩特级| 91色在线播放| 91福利国产在线观看网站| 国产99在线播放免费| 欧美一区二区三区在线| 新版天堂资源中文在线| 欧美小网站| 天堂在线观看视频| 国产高清成人mv在线观看| 国产不卡毛片| 婷婷五月五| 成年ssswww中国女人| 在线视频免费播放| 四虎永久在线日韩精品观看| 成年大片免费视频播放手机不卡| yezhulu在线永久网址yellow | 亚洲综合一区二区三区| 色aaa| 亚洲vv| 日本不卡一区在线| 毛片你懂的| 国产精品久久久亚洲第一牛牛| 伊人久久成人成综合网222| 国产网站免费看| 日韩欧美高清色码| 色吧久久| 奇米99| 亚洲啊v| 小视频国产| 超h 高h 污肉男男| 国产乱码精品一区二区三 | 啪啪黄色| 免费看黄资源大全高清| 一级毛片一级毛片一级级毛片| 国产成人亚洲日本精品| 91大神视频在线播放| 日本网站免费| 天天操夜夜操狠狠操|