日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

在SpinalHDL中如何像軟件調(diào)用方法那樣優(yōu)雅地例化端口

FPGA之家 ? 來(lái)源:FPGA之家 ? 作者:FPGA之家 ? 2022-06-13 10:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

前言

習(xí)慣了寫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_in input 1 輸入有效標(biāo)志
data1 input 8 輸入數(shù)據(jù)
data2 input 8 輸入數(shù)據(jù)
sum output 8
sum_valid output 1 和有效標(biāo)志

初階

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


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

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


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抽象出來(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)寫:


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

而我們?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è)模塊的一次例化和端口連接!

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)注

    6

    文章

    183

    瀏覽量

    31565
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74427
  • 編輯器
    +關(guān)注

    關(guān)注

    1

    文章

    829

    瀏覽量

    33082

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    [VirtualLab] 準(zhǔn)直系統(tǒng)的鬼

    或關(guān)閉。然后,軟件可以自動(dòng)確定光在系統(tǒng)的傳播路徑,并相應(yīng)地追跡電磁場(chǎng)。例如,我們展示了對(duì)準(zhǔn)直系統(tǒng)的研究,并附有另一份文件,該文件深入介紹了上述通道概念:準(zhǔn)直系統(tǒng)
    發(fā)表于 04-20 08:21

    C語(yǔ)言單元測(cè)試嵌入式軟件開(kāi)發(fā)的作用及專業(yè)工具的應(yīng)用

    功能包括: 測(cè)試通過(guò)/失敗統(tǒng)計(jì) 代碼覆蓋率可視 執(zhí)行時(shí)間分析 缺陷跟蹤和報(bào)告生成 winAMS的圖形界面可以直觀展示測(cè)試結(jié)果和覆蓋率數(shù)據(jù)。 七、總結(jié)與展望 C語(yǔ)言單元測(cè)試嵌入式軟件
    發(fā)表于 12-18 11:46

    CW32F030配置GPIO的話,需要STM32那樣禁用JTAG嗎?

    請(qǐng)問(wèn)CW32F030配置GPIO的話,需要STM32那樣禁用JTAG嗎
    發(fā)表于 12-08 07:26

    不只是工具,更是平臺(tái),易工(TQKIT)讓系統(tǒng)功能調(diào)用寫應(yīng)用邏輯一樣簡(jiǎn)單

    易工(TQKIT)展示了天嵌 Android系統(tǒng)級(jí)能力封裝上的深厚積累。通過(guò)自研系統(tǒng)封裝庫(kù),易工(TQKIT)將復(fù)雜的系統(tǒng)控制能力以接口形式開(kāi)放給開(kāi)發(fā)者,讓系統(tǒng)功能調(diào)用寫應(yīng)用邏輯一樣簡(jiǎn)單。
    的頭像 發(fā)表于 12-05 16:53 ?395次閱讀
    不只是工具,更是平臺(tái),易工(TQKIT)讓系統(tǒng)功能<b class='flag-5'>調(diào)用</b><b class='flag-5'>像</b>寫應(yīng)用邏輯一樣簡(jiǎn)單

    連載|開(kāi)發(fā)工具,易安卓讓系統(tǒng)功能調(diào)用寫應(yīng)用邏輯一樣簡(jiǎn)單

    通過(guò)自研系統(tǒng)封裝庫(kù),易安卓將復(fù)雜的系統(tǒng)控制能力以接口形式開(kāi)放給開(kāi)發(fā)者,讓系統(tǒng)功能調(diào)用寫應(yīng)用邏輯一樣簡(jiǎn)單。
    的頭像 發(fā)表于 11-27 11:40 ?87次閱讀
    連載|開(kāi)發(fā)工具,易安卓讓系統(tǒng)功能<b class='flag-5'>調(diào)用</b><b class='flag-5'>像</b>寫應(yīng)用邏輯一樣簡(jiǎn)單

    API接口調(diào)用的網(wǎng)絡(luò)異常及解決方案

    不可達(dá)(Connection Refused/Timeout) 服務(wù)器IP/端口錯(cuò)誤:配置的API域名解析錯(cuò)誤、端口號(hào)填寫錯(cuò)誤(如將HTTPS默認(rèn)的443端口寫成80)。 服務(wù)器離線或過(guò)載:API服務(wù)器宕機(jī)、維護(hù)
    的頭像 發(fā)表于 11-17 09:22 ?1014次閱讀

    Python調(diào)用API教程

    兩個(gè)不同系統(tǒng)之間的信息交互。在這篇文章,我們將詳細(xì)介紹Python調(diào)用API的方法和技巧。 一、用Requests庫(kù)發(fā)送HTTP請(qǐng)求 使用Python調(diào)用API的第一步是發(fā)送HTTP
    的頭像 發(fā)表于 11-03 09:15 ?1232次閱讀

    GPIO輸入輸出調(diào)用方法的理解與分享

    Nuclei Studio為GPIO的調(diào)用定義了七個(gè)函數(shù)。 與GPIO輸入輸出的直接有關(guān)的是: GPIO_TypeDef *gpio可以選擇為GPIOA
    發(fā)表于 10-29 06:24

    利用軟件方法解決EMC問(wèn)題

    一前言隨著信息技術(shù)和半導(dǎo)體技術(shù)的快速發(fā)展,電子產(chǎn)品的類型和功能模塊日益多樣,提訊傳輸速率也日益提高,產(chǎn)品的EMC問(wèn)題也是越來(lái)越多樣,解決EMC問(wèn)題的方法多種多樣,常見(jiàn)的方法硬件層面
    的頭像 發(fā)表于 10-28 11:35 ?398次閱讀
    利用<b class='flag-5'>軟件</b>的<b class='flag-5'>方法</b>解決EMC問(wèn)題

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

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

    Xilinx BRAM IP核配置及其

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

    上??匕玻夯谀P偷臏y(cè)試用生成

    的測(cè)試用生成(Model-Based Test Case Generation)作為一種新興且高效的測(cè)試方法,正逐漸成為解決這一問(wèn)題的重要手段。 01 引 言 傳統(tǒng)的軟件測(cè)試過(guò)程
    的頭像 發(fā)表于 08-28 14:30 ?1108次閱讀
    上??匕玻夯谀P偷臏y(cè)試用<b class='flag-5'>例</b>生成

    請(qǐng)問(wèn)有沒(méi)有什么方法可以通過(guò)PSoC5LP將配置數(shù)據(jù)編程到BCR plus?

    有沒(méi)有什么方法可以通過(guò) PSoC5LP 將配置數(shù)據(jù)編程到 BCR plus? 我們希望通過(guò) PC 使用 BCR plus 將配置二進(jìn)制數(shù)據(jù)編程到原型板。但是,該主板沒(méi)有CY4534那樣
    發(fā)表于 08-15 06:42

    如何CanMV IDE預(yù)覽哪樣可以Windows上讀到實(shí)時(shí)圖像?

    在做一個(gè)產(chǎn)品,需要將識(shí)別到的人臉及標(biāo)注一同顯示自己用c#開(kāi)發(fā)的MIS軟件,請(qǐng)教方法。CanMV IDE
    發(fā)表于 08-01 06:29

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

    cyusb3014,插入usb2.0接口后,軟件調(diào)用cyapi.lib的哪些函數(shù)完成初始、讀寫操作?
    發(fā)表于 05-29 07:14
    江山市| 墨竹工卡县| 舞阳县| 洪湖市| 明水县| 都昌县| 合江县| 无极县| 衢州市| 长白| 玉溪市| 秀山| 保德县| 龙岩市| 慈利县| 德钦县| 襄樊市| 宜丰县| 故城县| 尉犁县| 茂名市| 土默特左旗| 克拉玛依市| 陇川县| 土默特左旗| 汝城县| 泸水县| 邯郸市| 十堰市| 徐州市| 唐山市| 仲巴县| 礼泉县| 东平县| 新泰市| 大方县| 易门县| 新源县| 兴海县| 扬中市| 巩留县|