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

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

3天內不再提示

在SpinalHDL中的對應關系及聲明形式

FPGA之家 ? 來源:似猿非猿的FPGA ? 作者:似猿非猿的FPGA ? 2022-07-03 11:02 ? 次閱讀

針對SpinalHDL中的兩大類型Reg、Wire,來梳理下在SpinalHDL中的對應關系及聲明形式。

Wire

在編寫Verilog時,reg、wire是我們經常用到的變量聲明類型。wire類型變量常用于描述組合邏輯。而Reg則用于描述時序邏輯。在SpinalHDL中,其定義了Bool、Bits、UInt、SInt、Vec等數據類型。當我們聲明一個數據類型變量時其默認均為線網類型:

aeee314c-f678-11ec-ba43-dac502259ad0.png

在上面的代碼中,我們聲明了端口dataIn、dataOut、其默認均對應著RTL中的Wire類型:

af0096a2-f678-11ec-ba43-dac502259ad0.png

Reg

Reg類型變量常用于時序邏輯,在SpinalHDL中,將數據類型聲明為Reg類型的方式有:

af0d5ca2-f678-11ec-ba43-dac502259ad0.png

SpinalHDL提供了四種類型聲明寄存器的方式,根據不同的場景需求,我們可以四選一選擇最合適的(都是基于Reg一步步封裝的)。 除此之外,由于SpinalHDL中默認為Wire類型,而SpinalHDL為其都提供了setAsReg()方法來標注為寄存器類型,同時提供Init(resetValue)方法來做初始化。因此想上面的那個例子我們想寄存器打一拍我們可以這么來寫:

case class regDemo() extends Component{  val io=new Bundle{    val dataIn=in UInt(8 bits)    val dataOut=out UInt(8 bits)  }  val regTemp=Reg(UInt(8 bits)) init(0)  regTemp:=io.dataIn  io.dataOut:=regTemp}
也可以這么來寫:

case class regDemo() extends Component{  val io=new Bundle{    val dataIn=in UInt(8 bits)    val dataOut=out UInt(8 bits)  }  val regTemp=RegInit(U(0,8 bits))  regTemp:=io.dataIn  io.dataOut:=regTemp}
還可以這么寫:

case class regDemo() extends Component{  val io=new Bundle{    val dataIn=in UInt(8 bits)    val dataOut=out UInt(8 bits)  }  io.dataOut:=RegNext(io.dataIn).init(0)}
甚至可以這么寫:

case class regDemo() extends Component{  val io=new Bundle{    val dataIn=in UInt(8 bits)    val dataOut=out UInt(8 bits) setAsReg() init(0)  }  io.dataOut:=io.dataIn} 

時序調整很容易

在我們編寫RTL代碼時,當時序存在問題時需要我們調整時序時是很痛苦的,因為無論是Verilog還是SystemVerilog代碼,在較長組合邏輯之間添加一級寄存器往往需要改動較多的點,還需要仔細的評估。稍不注意就是時序沒調整好,功能先出問題了(主要在于代碼太長,更改需慎之又慎)。 而在SpinalHDL里,時序調整可以做到簡潔而優雅。 在我們之前用SpinalHDL做Sobel圖像處理算法時有這么一段代碼:

af1f1ec4-f678-11ec-ba43-dac502259ad0.png

在卷積核計算處理時這里存在較多的組合邏輯延遲,會成為系統時序瓶頸點。當我們想向更高的頻率去跑時這里便需要插入寄存器。想想看這里如果是用Verilog來寫時我們插入寄存器不僅要計算清楚中間寄存器的位寬,同時也需要改多行代碼,還要小心翼翼的改寫。 而在SpinalHDL里,我們這里插入寄存器調整時序很容易!我們可以通過調用regNext很容易地插入一級寄存器:

af3cc118-f678-11ec-ba43-dac502259ad0.png

如此我們便可以輕松地優化時序,誰還說時序調整是個體力活兒呢??? 而針對帶握手信號的時序打拍優化,SpinalHDL也有相關的Lib供調用可以快捷地優化處理。

原文標題:SpinalHDL—Reg&Wire

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

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

    關注

    30

    文章

    5164

    瀏覽量

    118135
  • Reg
    Reg
    +關注

    關注

    0

    文章

    20

    瀏覽量

    11433
  • 代碼
    +關注

    關注

    30

    文章

    4575

    瀏覽量

    67137
  • 時序邏輯
    +關注

    關注

    0

    文章

    37

    瀏覽量

    9106

原文標題:SpinalHDL—Reg&Wire

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

收藏 人收藏

    評論

    相關推薦

    SpinalHDL里switch方法有何用處呢

    ,當我們需要根據tkeep信號來計算這一拍有多少有效數據時這里的代碼會是什么樣子……這種代碼寫的手有點兒累(又沒啥技術含量)……SpinalHDL里該如何做呢?switchSpinalHDL提供了
    發表于 06-22 14:25

    SpinalHDL里實現優雅的添加待跟蹤波形信號

    時會同時生成用于生成相應ILa IP的tcl腳本,從而能夠輕松的SpinalHDL實現對待跟蹤波形信號的抓取實現。下面一段代碼展示了如何在SpinalHDL里添加ILA:在上述代碼
    發表于 06-22 14:37

    SpinalHDL的設計中集成現有RTL設計(IP)的渠道——BlackBox

    接口及parameter參數(這也是我們RTL里例化IP時常用的)。我們來看SpinalHDL-doc給出的example:整個代碼里做了三件事:參數聲明、端口聲明,時鐘域映射。參數
    發表于 06-22 14:59

    談談SpinalHDLStreamCCByToggle組件設計不足的地方

    到ack為低電平即可處理新的任務?! 懺谧詈蟆 £P于跨時鐘域處理處理上相對來講還是一個易錯點,其處理也是新學者需要好好把握的。SpinalHDL的源代碼還是很值得一讀的。一方面
    發表于 06-30 15:11

    聊聊SpinalHDL的FIFO

    DFX添加所有FIFO的這兩個信號。而一旦真的出現了拉高,那不管你的設計經驗多么豐富,也得老老實實去review代碼和構建測試case。一定要這樣么為什么經常碰到有人講FPGA這些不好
    發表于 06-30 15:28

    SpinalHDL關于casez的使用

    SpinalHDL的switch之前的文章中曾提到過SpinalHDLswitch的使用:通常情況下,switch
    發表于 07-06 10:59

    分享一個SpinalHDL里apply的有趣用法

    接口相關的時序操作均封裝在flushRx并將接口的賦值封裝成函數的形式供其他人調用,從而將算法設計與接口時序分離。這里看一個簡單的例子:代碼本身意義不大,這里我們將對接口c的時序操作均放置
    發表于 07-19 15:08

    SpinalHDL的代碼組織結構如何實現Component參數化設計呢

    ,SpinalHDL在生成RTL時,會檢測Bundle的所有元素是否都聲明了端口方向。有一點是像上面的MyAdder將端口聲明放在Bun
    發表于 07-21 14:20

    請問SpinalHDL的Area到底是什么意思

    (僅限于純組合邏輯)。AreaSpinalHDKL里,與Verilog、SystemVerilog對應的概念是Component,當我們的類繼承了Component后,與之相應的我們就要定義端口
    發表于 07-22 14:22

    SpinalHDL是如何讓仿真跑起來的

    SpinalHDL的測試代碼里也可以起多個,不過其為協程。SpinalHDL的仿真庫已經幫我們封裝好了底層協程的處理,兩個協程之間的通信(類似systemVerilog的mailb
    發表于 07-25 15:09

    SpinalHDL仿真信號的驅動實現

    梳理基本完畢,下文將以一個小的例子為demo構建一個完整的個人覺得不錯的SpinalHDL仿真環境書寫方式。原作者:玉騏
    發表于 07-27 14:37

    記錄一個使用BlackBoxparameter踩到的坑

    》踩到的坑很早之前,曾寫過如何在SpinalHDL例化之前用Verilog/SystemVerilog所寫的代碼,可參照文章《[SpinalHDL——集成你的RTL代碼]》一文。
    發表于 08-31 14:58

    SpinalHDLBundle與普通數據類型之間的連接賦值轉換

    SpinalHDLBundle與SystemVerilog的packed struct很像,某些場景下,與普通數據類型之間的連接賦值可以通過asBits,assignFromBi
    發表于 10-18 14:22

    SpinalHDL設計錯誤總結相關資料分享

    設計。以下是SpinalHDL檢查的簡要概括:  重復賦值  時鐘域交叉  層次化違例  組合邏輯環路  Latch  未驅動的信號  位寬不匹配  得不到的switch生命  每個SpinalHDL
    發表于 10-24 15:37

    看下在SpinalHDL中常見的位拼接符的使用

    信號的不同bit賦值給不同的信號,這種拼接方式可以SpinalHDL按照如下的形式進行書寫:case class demo() extends Component{val
    發表于 11-18 15:21
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>