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

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

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

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

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

FPGA之家 ? 來(lái)源:Spinal FPGA ? 作者:Spinal FPGA ? 2021-06-16 17:19 ? 次閱讀

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

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

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

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

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

sumoutput8和

sum_validoutput1和有效標(biāo)志

初階

剛開(kāi)始接觸SpinalHDL時(shí)這個(gè)加法器我們可能會(huì)這么來(lái)寫(xiě):

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

這里針對(duì)端口的實(shí)現(xiàn)形式和我們?cè)赩erilog中的方式基本相同。那么當(dāng)我們?cè)诶@個(gè)模塊時(shí),我們可能會(huì)這么來(lái)寫(xiě):

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}

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

中階

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

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端口。其中包含兩個(gè)Flow類型:dataIn、sum。并聲明當(dāng)作為master端口時(shí)dataIn為master、sum為slave。這樣,我們的加法器便可以這么來(lái)寫(xiě):

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

而我們?cè)诶瘯r(shí),便可以簡(jiǎn)潔地例化:

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}

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

高階

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

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

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

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

這里我們?yōu)榧臃ㄆ鱝dd2定義了一個(gè)伴生對(duì)象(伴生對(duì)象聲明為object,名字與類名相同)。并在其中定義了一個(gè)apply方法,傳入兩個(gè)參數(shù):位寬dataWidth及端口port,并在apply實(shí)現(xiàn)中完成模塊例化及端口連接(一次連線,終身使用)。隨后我們?cè)诶瘯r(shí)便可以像軟件調(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)}

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

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

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

責(zé)任編輯:haq

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

    關(guān)注

    69

    文章

    5124

    瀏覽量

    88973
  • Verilog
    +關(guān)注

    關(guān)注

    29

    文章

    1366

    瀏覽量

    111909

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    推薦!如何優(yōu)雅地?cái)[好PCB絲?。?/a>

    很多畫(huà)PCB的人,會(huì)認(rèn)為絲印不影響電路的性能,所以,對(duì)絲印并不重視。但是,對(duì)于一個(gè)專業(yè)的硬件工程師來(lái)說(shuō),必須重視這些細(xì)節(jié)。 下面介紹如何優(yōu)雅地弄好PCB絲印。 1 擺放的位置 一般來(lái)說(shuō),電阻、電容
    發(fā)表于 04-08 14:59

    電源技術(shù)工業(yè)自動(dòng)的應(yīng)用

    電源技術(shù)工業(yè)自動(dòng)的應(yīng)用至關(guān)重要,它不僅是工業(yè)自動(dòng)系統(tǒng)穩(wěn)定運(yùn)行的基礎(chǔ),還直接影響到系統(tǒng)的性能、效率和可靠性。以下是對(duì)電源技術(shù)工業(yè)自動(dòng)
    的頭像 發(fā)表于 01-08 10:12 ?662次閱讀

    Verilog說(shuō)明

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

    如何設(shè)置內(nèi)網(wǎng)IP的端口映射到公網(wǎng)

    現(xiàn)代網(wǎng)絡(luò)環(huán)境,端口映射(Port Mapping)是一項(xiàng)非常實(shí)用的技術(shù),它允許用戶將內(nèi)網(wǎng)設(shè)備的服務(wù)端口映射到公網(wǎng),使外網(wǎng)用戶可以訪問(wèn)內(nèi)網(wǎng)
    的頭像 發(fā)表于 11-14 14:23 ?1802次閱讀

    如何測(cè)試交換機(jī)端口速率

    交換機(jī)端口速率是指交換機(jī)端口在數(shù)據(jù)傳輸過(guò)程的最大傳輸速率。在網(wǎng)絡(luò)環(huán)境,交換機(jī)端口速率對(duì)于確保網(wǎng)絡(luò)性能和數(shù)據(jù)傳輸效率至關(guān)重要。測(cè)試交換機(jī)
    的頭像 發(fā)表于 10-18 09:48 ?3861次閱讀

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

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

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

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

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

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

    ad端口的幾種類型

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

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

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

    以太網(wǎng)端口和千兆端口的區(qū)別

    以太網(wǎng)端口和千兆端口多個(gè)方面存在顯著的區(qū)別,這些區(qū)別主要體現(xiàn)在速度、應(yīng)用范圍、技術(shù)規(guī)格以及網(wǎng)絡(luò)性能等方面。
    的頭像 發(fā)表于 08-07 15:42 ?2265次閱讀

    如何優(yōu)雅OpenMV上使用LVGL

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

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

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

    路由器端口轉(zhuǎn)發(fā)怎么設(shè)置

    路由器端口轉(zhuǎn)發(fā)設(shè)置是網(wǎng)絡(luò)配置的一個(gè)重要環(huán)節(jié),它允許外部設(shè)備通過(guò)特定的端口訪問(wèn)內(nèi)網(wǎng)的設(shè)備或服務(wù)。 路由器端口轉(zhuǎn)發(fā)的基本概念 1.1 什么是
    的頭像 發(fā)表于 07-09 11:33 ?1.1w次閱讀

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

    工業(yè)自動(dòng)領(lǐng)域中,PLC(Programmable Logic Controller,可編程邏輯控制器)因其高度的可靠性、靈活性和強(qiáng)大的功能而備受青睞。PLC系統(tǒng)通過(guò)其輸入端口接收外部信號(hào),經(jīng)過(guò)
    的頭像 發(fā)表于 06-19 14:11 ?4948次閱讀
    主站蜘蛛池模板: 欧美色综合网站 | 美女一级牲交毛片视频 | 久久夜色tv网站免费影院 | 亚欧免费视频一区二区三区 | yiren22亚洲综合高清一区 | 福利在线看片 | 成人永久免费视频网站在线观看 | 俺要操| 亚洲精品一线二线三线 | 天天综合天天添夜夜添狠狠添 | 一级毛片真人免费播放视频 | 天堂资源| 国产农村三片免费网站 | 日日噜噜爽爽狠狠视频 | 6080伦理久久精品亚洲 | 日韩精品一区二区三区免费视频 | 狠狠色噜噜狠狠狠狠888奇米 | 手机看片福利日韩 | 色天天综合色天天碰 | 特黄一级视频 | 欧美xx高清 | 色爽爽爽爽爽爽爽爽 | 久久精品最新免费国产成人 | tube69欧美最新片 | 日韩欧美国产电影 | 亚洲成人在线播放 | 国产一级aaa全黄毛片 | 人人插人人干 | 5x视频在线观看 | 免费人成在线观看视频色 | 立即播放免费毛片一级 | 免费 视频 1级 | 色婷婷色 | wwwxx在线| 中文字幕一区二区三区免费视频 | 韩国a级床戏大尺度在线观看 | 天天视频色版 | 日本一区二区在线不卡 | 日本在线视频一区二区 | 真人午夜a一级毛片 | 污污视频在线免费看 |