91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

FPGA之家 ? 來源:Spinal FPGA ? 作者:Spinal FPGA ? 2021-06-16 17:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

sumoutput8和

sum_validoutput1和有效標(biāo)志

初階

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

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ì)這么來寫:

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è)加法器,可以看到,這里如同我們寫Verilog代碼般一根根連線,當(dāng)有眾多模塊需要去例化時(shí)還是蠻痛苦的。

中階

在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端口。其中包含兩個(gè)Flow類型:dataIn、sum。并聲明當(dāng)作為master端口時(shí)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)}

而我們?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ù)列表來傳遞。這里我們先為我們的加法器定義一個(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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    5333

    瀏覽量

    91606
  • Verilog
    +關(guān)注

    關(guān)注

    30

    文章

    1374

    瀏覽量

    114539

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    JH7110 的 JTAG 端口 visionfive 2 上可用嗎?

    JH7110 的 JTAG 端口 visionfive 2 上可用嗎?似乎它們不在 40 針 gpio 端口上。
    發(fā)表于 02-12 07:43

    SICK工業(yè)線纜自動(dòng)系統(tǒng)的應(yīng)用與選型

    工業(yè)自動(dòng)系統(tǒng),傳感器和執(zhí)行器的穩(wěn)定信號(hào)傳輸是系統(tǒng)可靠運(yùn)行的基礎(chǔ)。作為全球領(lǐng)先的傳感器與自動(dòng)設(shè)備供應(yīng)商,SICK, Inc. 的工業(yè)電纜及線束組件被廣泛應(yīng)用于自動(dòng)
    的頭像 發(fā)表于 01-29 17:28 ?657次閱讀

    工業(yè)網(wǎng)關(guān)在汽車制造的關(guān)鍵作用:以疆鴻智能ETHERCAT轉(zhuǎn)PROFIBUS為

    整體生產(chǎn)效率的關(guān)鍵。其中,工業(yè)通信網(wǎng)關(guān)作為協(xié)議轉(zhuǎn)換的樞紐,發(fā)揮著不可替代的作用。本文將以ETHERCAT轉(zhuǎn)PROFIBUS網(wǎng)關(guān)在汽車焊接生產(chǎn)線的應(yīng)用為,探討其實(shí)際價(jià)值與挑戰(zhàn)。 網(wǎng)關(guān)的核心作用與應(yīng)用場(chǎng)景 高度自動(dòng)
    的頭像 發(fā)表于 01-15 14:37 ?252次閱讀
    工業(yè)網(wǎng)關(guān)在汽車制造<b class='flag-5'>中</b>的關(guān)鍵作用:以疆鴻智能ETHERCAT轉(zhuǎn)PROFIBUS為<b class='flag-5'>例</b>

    霍爾元件藍(lán)牙耳機(jī)充電倉的創(chuàng)新應(yīng)用:以無錫迪仕科技DH254為

    合檢測(cè)、耳機(jī)狀態(tài)管理等領(lǐng)域展現(xiàn)出不可替代的價(jià)值。本文將以無錫迪仕電子科技有限公司(以下簡(jiǎn)稱“迪仕科技”)的單極低功耗霍爾開關(guān)DH254為,解析其藍(lán)牙耳機(jī)充電倉的技術(shù)優(yōu)勢(shì)與應(yīng)用實(shí)踐。
    的頭像 發(fā)表于 01-12 17:41 ?1581次閱讀

    工業(yè)網(wǎng)絡(luò)協(xié)議網(wǎng)關(guān)在危品生產(chǎn)自動(dòng)的關(guān)鍵作用:以ETHERNET/IP轉(zhuǎn)EtherCAT為

    ?工業(yè)網(wǎng)絡(luò)協(xié)議網(wǎng)關(guān)在危品生產(chǎn)自動(dòng)的關(guān)鍵作用:以ETHERNET/IP轉(zhuǎn)EtherCAT為 現(xiàn)代化工生產(chǎn)環(huán)境
    的頭像 發(fā)表于 01-08 14:29 ?175次閱讀
    工業(yè)網(wǎng)絡(luò)協(xié)議網(wǎng)關(guān)在危<b class='flag-5'>化</b>品生產(chǎn)自動(dòng)<b class='flag-5'>化</b><b class='flag-5'>中</b>的關(guān)鍵作用:以ETHERNET/IP轉(zhuǎn)EtherCAT為<b class='flag-5'>例</b>

    verilog testbench運(yùn)行測(cè)試用時(shí),運(yùn)行到make run_test出錯(cuò)怎么解決?

    按照胡老師書上的verilog testbench運(yùn)行測(cè)試用時(shí),在運(yùn)行到make run_test步驟時(shí)出錯(cuò),查了很多方案沒有解決。
    發(fā)表于 11-11 06:52

    蜂鳥E203移植到FPGA開發(fā)板前的IP核化工作

    時(shí)鐘不能通過mmcm直接生成,需要另外寫分頻器,后續(xù)會(huì)講。 隨后加入reset IP核,設(shè)定如下 添加好IP核后,system.v頂層文件相應(yīng)IP核。 wire
    發(fā)表于 10-27 07:35

    E203分享之DDR擴(kuò)展方案實(shí)施流程(

    open ip example design,新工程文件下會(huì)自動(dòng)生成ddr3模型和相應(yīng)的文件,soc_top層對(duì)ddr3模型做,并
    發(fā)表于 10-24 07:25

    E203外設(shè)的與編譯配置

    e203_subsys_perips層與icb總線進(jìn)?連接。e203_subsys_perips同樣e203_subsys_main
    發(fā)表于 10-24 07:14

    Xilinx BRAM IP核配置及其

    )的,所以通過合理分配BRAM的大小,可以提高片上block的利用率。 完成以后,進(jìn)行綜合,可以通過report utilization來查看資源消耗情況 可以看到使用的板子
    發(fā)表于 10-24 06:10

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)33:初始功能驗(yàn)證與分析

    模型。 在這里以最小存儲(chǔ)子系統(tǒng)模型為說明對(duì)初始功能的驗(yàn)證與分析。 本節(jié)測(cè)試用, 設(shè)置橋設(shè)備模型不啟用 BAR 空間, 設(shè)置 NVM
    發(fā)表于 10-08 08:02

    Leiditech數(shù)據(jù)端口電路保護(hù)使用TVS ESD

    端口
    上海雷卯電子
    發(fā)布于 :2025年08月21日 17:28:49

    EtherCAT與Profinet協(xié)議轉(zhuǎn)換工業(yè)自動(dòng)的應(yīng)用:以匯川伺服驅(qū)動(dòng)器為

    工業(yè)自動(dòng)領(lǐng)域,實(shí)現(xiàn)不同協(xié)議設(shè)備間的無縫通信是提升生產(chǎn)效率的關(guān)鍵。以EtherCAT主站通過Profinet網(wǎng)關(guān)連接匯川伺服驅(qū)動(dòng)器的場(chǎng)景為,這一技術(shù)組合不僅解決了異構(gòu)網(wǎng)絡(luò)協(xié)同的難題,更通過精準(zhǔn)的速度控制為生產(chǎn)線注入了智能
    的頭像 發(fā)表于 07-08 15:49 ?803次閱讀
    EtherCAT與Profinet協(xié)議轉(zhuǎn)換<b class='flag-5'>在</b>工業(yè)自動(dòng)<b class='flag-5'>化</b><b class='flag-5'>中</b>的應(yīng)用:以匯川伺服驅(qū)動(dòng)器為<b class='flag-5'>例</b>

    基于瑞薩電子RA8T2 sensorless方案的樣工程 可對(duì)電流環(huán)進(jìn)行TCM設(shè)置

    基于瑞薩電子RA8T2 sensorless方案的樣工程 可對(duì)電流環(huán)進(jìn)行TCM設(shè)置
    的頭像 發(fā)表于 06-04 18:29 ?1119次閱讀

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

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