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

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

    文章

    7139

    瀏覽量

    89579
  • 封裝
    +關注

    關注

    127

    文章

    7996

    瀏覽量

    143410
  • 代碼
    +關注

    關注

    30

    文章

    4827

    瀏覽量

    69054

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

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

收藏 人收藏

    評論

    相關推薦

    如何實現SpinalHDL 環境搭建

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

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

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

    spinalhdl轉Verilog可讀性 SpinalHDL開發流程

    是比較陡峭的。另外在團隊協作,你可以要求你的同伴對Verilog,VHDL語言進行掌握,但是不能要求他們也掌握SpinalHDL,Chisel這些語言,所以你的代碼怎么安排別人接手也是一個問題。但是這并不妨礙我們采用SpinalHDL
    的頭像 發表于 07-27 09:29 ?2460次閱讀
    <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 ?3770次閱讀

    SpinalHDL的對應關系及聲明形式

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

    SpinalHDLBundle數據類型的轉換

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

    SpinalHDL BlackBox時鐘與復位

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

    淺析SpinalHDLPipeline的復位定制

    之前有系列文章介紹了SpinalHDLPipeline的使用,最近在一個功能模塊真實的使用了這個lib。
    的頭像 發表于 03-17 17:31 ?1128次閱讀
    淺析<b class='flag-5'>SpinalHDL</b><b class='flag-5'>中</b>Pipeline<b class='flag-5'>中</b>的復位定制
    主站蜘蛛池模板: 色五阁| 一级特黄特黄的大片免费 | 爱爱免费网站 | 欧美特黄特色aaa大片免费看 | 一级片在线免费观看 | 色吧首页 | 九月丁香婷婷亚洲综合色 | 午夜在线网站 | 亚洲人成电影在线小说网色 | 日韩中文字幕电影 | 人人干人人干人人干 | 四虎免费看黄 | 男人日女人的网站 | 四虎影视免费 | 国产chinesetube| 四虎成人免费观看在线网址 | 成年女人毛片 | 国产拍拍1000部ww | 天天射夜夜骑 | 五月天婷婷综合 | 全免费一级毛片在线播放 | 欧美三级手机在线 | 亚洲国产一区二区在线 | 色综合天天综合网国产国产人 | 天天躁日日躁狠狠躁中文字幕老牛 | 亚洲高清中文字幕一区二区三区 | 久久国产精品99久久久久久老狼 | 一区国产传媒国产精品 | 午夜影院一区二区三区 | aaaaa毛片 | 国产日韩精品欧美一区色 | 日日夜夜操天天干 | 国产美女一级ba大片免色 | 一区二区三区伦理高清 | 天天色综合天天 | 久久6免费视频 | 大尺度很肉污的古代小说 | 成人欧美精品大91在线 | 有没有免费的视频在线观看 | 天天躁狠狠躁夜夜躁 | 久久三级国产 |