色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

SpinalHDL 1.9.4版本中的PackedBundle、PackedWordBundle的使用

Spinal FPGA ? 來源:Spinal FPGA ? 2023-11-11 15:35 ? 次閱讀

聊一聊SpinalHDL 1.9.4版本中的PackedBundle、PackedWordBundle的使用

位域的提取與封裝 在邏輯設計里,但凡牽涉到協議,一般都避免不了協議字段的提取。以下面的一個簡單協議為例:

c8b275ac-8042-11ee-939d-92fbcf53809c.jpg

這里256bit輸入數據,包含了五個協議字段:

host_addr:64 bits

card_addr:64 bits

length:14 bits

sop:1 bits

eop:1 bits

在進行協議解析時,我們可能會定義如下數據類型:

caseclassDescriptor() extendsBundle{
val host_addr=UInt(64bits)
val card_addr=UInt(64bits)
val length=UInt(14bits)
val sop=Bool()
val eop=Bool()

override defassignFromBits(data:Bits)={
host_addr.assignFromBits(data(0,64bits))
card_addr.assignFromBits(data(64,64bits))
length.assignFromBits(data(128,14bits))
sop:=data(144)
eop:=data(145)
}

override defasBits():Bits={
eop##sop##B(0,2 bits)##length##card_addr##host_addr
}
}

在Descriptor中,我們重寫了assignFromBits()和asBits用于協議字段的提取與數據流的的封裝.如此,我們在使用時即可在代碼使用時使代碼里盡可能的簡潔明了:

c8d6d5aa-8042-11ee-939d-92fbcf53809c.png

在一個大型工程里,往往可能存在許多的協議定義,那么協議的提取與數據流封裝就往往需要許多這種assignFromBits()和asBits的重寫了,“繁重的”體力勞動。

在SpinalHDL 1.9.4版本中,引入了PackedBundle、PackedWordBundle兩個組件(之前的版本略有bug)。從而能夠避免這種重復的體力活。像上面的結構中,可以直接這么定義Descriptor數據類型:

caseclassDescriptor() extends PackedBundle {
val host_addr=UInt(64bits).packFrom(0)
val card_addr=UInt(64bits).packFrom(64)
val length=UInt(14bits) //根據當前已使用的位域推斷其對應的位域
val sop=Bool().packFrom(128+16)
val eop=Bool().packFrom(128+16+1)
}

我們無需再override任何函數,僅需定義數據類型即可。在使用時:

c8fbd63e-8042-11ee-939d-92fbcf53809c.png

通過unpack,可以從data_in中提取協議字段,通過packed方法,可以將協議字段按照位域封裝成數據流。

》PackedBundle

在PackedBundle中,為SpinalHDL中的基礎數據類型隱式擴展了DataPositionEnrich類。為其定義了用于位域綁定的函數:

def pack(range: Range)

def pack(range: Range, endianness: Endianness = LITTLE)

def packFrom(pos: Int)

def packTo(pos: Int)

通過這幾個函數,我們可以在使用時對定義的字段綁定位域。這里面在使用時更傾向于后面兩種方式。對于packTo與packFrom,下面的Descriptor描述方式和上面的Descriptor是等效的:

caseclassDescriptor() extends PackedBundle {
val host_addr=UInt(64bits).packTo(63)
val card_addr=UInt(64bits).packTo(127)
val length=UInt(14bits)
val sop=Bool().packFrom(128+16)
val eop=Bool().packFrom(128+16+1)
}

而通過PackedBundle中所提供的pack方法,可以用于將我們定義的數據類型封裝成數據流:

def packed: Bits

而對于從數據流中提取協議字段,則可以通過unpack方法:

def unpack(bits: Bits)

def unpack(bits: Bits, hi: Int, lo: Int)

第二個方法使用場景可能相對較少,感興趣的可以去看源代碼。

》PackedWordBundle

PackedWordBundle是在PackedBundle的基礎上擴展而來,從而能夠按照Word進行位域綁定,使用相對簡單,不再做額外贅述,參考例子:

c925974e-8042-11ee-939d-92fbcf53809c.png

》使用注意

對于PackedBundle、PackedWordBundle,其有種C語言位域結構體的味道,可以方便的定義位域,減少重復性的開發工作。不過其中有一點是其允許位域重復,如下所示:

caseclassDescriptor() extends PackedBundle {
val host_addr=UInt(64bits).packTo(63)
val card_addr=UInt(64bits).packTo(63)
val length=UInt(14bits)
val sop=Bool().packFrom(128+16)
val eop=Bool().packFrom(128+16+1)
}

將card_addr與host_addr綁定到相同的位置是允許的,在進行pack時由于Last Valid Assignment Win,host_addr將不會被使用。故在使用時需注意別重復綁定。

審核編輯:彭菁

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

    關注

    8

    文章

    7048

    瀏覽量

    89073
  • 封裝
    +關注

    關注

    126

    文章

    7916

    瀏覽量

    143003
  • 代碼
    +關注

    關注

    30

    文章

    4790

    瀏覽量

    68650

原文標題:位域一鍵提取/封裝

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

收藏 人收藏

    評論

    相關推薦

    如何實現SpinalHDL 環境搭建

    SpinalHDL可以不用IDE的運行。教學文檔說需要安裝的軟件如下 也就是需要安裝java SDK 1.8,Scala建議采用2.11.12版本 https://www.scala-lang.org
    的頭像 發表于 08-24 14:43 ?8661次閱讀
    如何實現<b class='flag-5'>SpinalHDL</b> 環境搭建

    SpinalHDL如何快速地實現總線連接

    教你在SpinalHDL總線連接時針對總線的部分信號位寬不同時的如何快速地實現總線連接。
    發表于 11-28 15:48 ?865次閱讀

    spinalhdl轉Verilog可讀性 SpinalHDL開發流程

    是比較陡峭的。另外在團隊協作,你可以要求你的同伴對Verilog,VHDL語言進行掌握,但是不能要求他們也掌握SpinalHDL,Chisel這些語言,所以你的代碼怎么安排別人接手也是一個問題。但是這并不妨礙我們采用SpinalHDL
    的頭像 發表于 07-27 09:29 ?2304次閱讀
    <b class='flag-5'>spinalhdl</b>轉Verilog可讀性 <b class='flag-5'>SpinalHDL</b>開發流程

    TortoiseSVN-1.9.4.27285-x64-svn-1.9.4

    TortoiseSVN-1.9.4.27285-x64-svn-1.9.4svn客戶端
    發表于 06-13 11:49

    聊一聊SpinalHDL 1.6.1引入的blackbox inline功能

    1.6.1版本,提供了一個inline功能,用于將blackbox“真的”封裝進SpinalHDL。setInlineVerilog在BlackBox的定義里,新增了兩個方法:其
    發表于 06-29 16:02

    SpinalHDL關于casez的使用

    SpinalHDL的switch在之前的文章中曾提到過SpinalHDLswitch的使用:通常情況下,switch對應著我們日常Verilog代碼
    發表于 07-06 10:59

    如何在SpinalHDL里啟動一個仿真

    前言在安裝完成Verilator、GtkWave后,我們即可在IDEA里通過SpinalHDL提供的仿真接口來對我們的設計進行仿真。在《SpinalHDL—仿真環境》一文已提到SpinalH
    發表于 07-26 16:59

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

    1、SpinalHDL設計錯誤  SpinalHDL編譯器會做很多設計檢查,來確保生成的VHDL/Verilog是可仿真的可綜合的。基本上,SpinalHDL不會生成破損的VHDL/Verilog
    發表于 10-24 15:37

    基于Windows系統的SpinalHDL開發環境搭建步驟

    1 所有軟件安裝在C:\\SpinalHDL根目錄下即可2 所有軟件安裝過程,把path選項都勾選上3 仿真需要使用GTKWave+Verilator,安裝MSYS2軟件之后,打開用戶終端輸入如下
    發表于 10-24 15:40

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

    在之前寫Verilog時,位拼接符是一個很常見的東西,今天來看下在SpinalHDL中常見的位拼接符的使用。建議SpinalHDL 版本不低于1.7.1(1.7.1版本Bug較多,再往
    發表于 11-18 15:21

    SpinalHDL的SpiMasterCtrl模塊做使用說明詳解

    最近偶爾需要用到SPI模塊。正巧看到SpinalHDL中所提供的SPI-Master設計。看完之后尤為佩服如此簡潔而又全面的設計方式。本篇不對SPI協議進行講解,僅針對SpinalHDL的SpiMasterCtrl模塊做使用說
    的頭像 發表于 04-19 09:58 ?3721次閱讀

    SpinalHDL的對應關系及聲明形式

    針對SpinalHDL的兩大類型Reg、Wire,來梳理下在SpinalHDL的對應關系及聲明形式。
    的頭像 發表于 07-03 11:02 ?1573次閱讀

    SpinalHDLBundle數據類型的轉換

    SpinalHDLBundle與SystemVerilog的packed struct很像,在某些場景下,與普通數據類型之間的連接賦值可以通過asBits,assignFromBits來實現。
    的頭像 發表于 10-17 09:51 ?1332次閱讀

    SpinalHDL BlackBox時鐘與復位

    SpinalHDL中使用之前已有的Verilog等代碼的時候需要將這些代碼包在一個BlackBox里面,但是如果這些代碼里面有時鐘和復位,我們需要怎么將時鐘和復位端口和SpinalHDL已有的時鐘域連接起來呢?
    的頭像 發表于 05-04 11:13 ?815次閱讀
    <b class='flag-5'>SpinalHDL</b> BlackBox時鐘與復位

    淺析SpinalHDLPipeline的復位定制

    之前有系列文章介紹了SpinalHDLPipeline的使用,最近在一個功能模塊真實的使用了這個lib。
    的頭像 發表于 03-17 17:31 ?1052次閱讀
    淺析<b class='flag-5'>SpinalHDL</b><b class='flag-5'>中</b>Pipeline<b class='flag-5'>中</b>的復位定制
    主站蜘蛛池模板: 成人国产亚洲欧美成人综合网| 性刺激欧美三级在线现看中文| 欧洲最大无人区免费高清完整版| 一品道门在线观看免费视频| 国产免费啪嗒啪嗒视频看看 | 日本xxx在线观看免费播放| 在线免费观看日本| 久久re热在线视频精6| 亚洲欧美日韩在线观看一区二区三区| 国产精品久久人妻无码网站一区无| 入禽太深免费视频10| 干极品美女| 无码人妻视频又大又粗欧美| 国产精品伦理一二三区伦理| 无人区日本电影在线观看| 国产精品A久久777777| 亚洲AV色香蕉一区二区9255| 韩国hd高清xxx| 伊人久久亚洲综合天堂| 久久国产综合精品欧美| 中国老头oldday tv| 男女肉大捧进出全过程免费| aaa在线观看视频高清视频| 肉多荤文高h羞耻校园| 国产精品第八页| 野花4在线观看| 毛片免费播放| 冰山高冷受被c到哭np双性| 天天爽夜夜爽8888视频精品| 韩国和日本免费不卡在线| 影音先锋色av男人资源网| 免费精品在线视频| 戳女人屁股流水羞羞漫画| 亚洲AV噜噜88| 啦啦啦视频在线观看WWW| jizz丝袜| 午夜精品久久久内射近拍高清| 久久国产香蕉| qvod在线电影| 亚洲欧洲日韩视频在钱| 女bbbbxxx孕妇|