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

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

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

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

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

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

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

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

這里256bit輸入數(shù)據(jù),包含了五個協(xié)議字段:

host_addr:64 bits

card_addr:64 bits

length:14 bits

sop:1 bits

eop:1 bits

在進(jìn)行協(xié)議解析時,我們可能會定義如下數(shù)據(jù)類型:

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用于協(xié)議字段的提取與數(shù)據(jù)流的的封裝.如此,我們在使用時即可在代碼使用時使代碼里盡可能的簡潔明了:

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

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

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

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

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

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

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

》PackedBundle

在PackedBundle中,為SpinalHDL中的基礎(chǔ)數(shù)據(jù)類型隱式擴(kuò)展了DataPositionEnrich類。為其定義了用于位域綁定的函數(shù):

def pack(range: Range)

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

def packFrom(pos: Int)

def packTo(pos: Int)

通過這幾個函數(shù),我們可以在使用時對定義的字段綁定位域。這里面在使用時更傾向于后面兩種方式。對于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方法,可以用于將我們定義的數(shù)據(jù)類型封裝成數(shù)據(jù)流:

def packed: Bits

而對于從數(shù)據(jù)流中提取協(xié)議字段,則可以通過unpack方法:

def unpack(bits: Bits)

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

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

》PackedWordBundle

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

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

》使用注意

對于PackedBundle、PackedWordBundle,其有種C語言位域結(jié)構(gòu)體的味道,可以方便的定義位域,減少重復(fù)性的開發(fā)工作。不過其中有一點(diǎn)是其允許位域重復(fù),如下所示:

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綁定到相同的位置是允許的,在進(jìn)行pack時由于Last Valid Assignment Win,host_addr將不會被使用。故在使用時需注意別重復(fù)綁定。

審核編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7048

    瀏覽量

    89076
  • 封裝
    +關(guān)注

    關(guān)注

    126

    文章

    7916

    瀏覽量

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

    關(guān)注

    30

    文章

    4790

    瀏覽量

    68654

原文標(biāo)題:位域一鍵提取/封裝

文章出處:【微信號:Spinal FPGA,微信公眾號:Spinal FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何實(shí)現(xiàn)SpinalHDL 環(huán)境搭建

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

    SpinalHDL如何快速地實(shí)現(xiàn)總線連接

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

    spinalhdl轉(zhuǎn)Verilog可讀性 SpinalHDL開發(fā)流程

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

    TortoiseSVN-1.9.4.27285-x64-svn-1.9.4

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

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

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

    SpinalHDL關(guān)于casez的使用

    SpinalHDL的switch在之前的文章中曾提到過SpinalHDLswitch的使用:通常情況下,switch對應(yīng)著我們?nèi)粘erilog代碼
    發(fā)表于 07-06 10:59

    如何在SpinalHDL里啟動一個仿真

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

    SpinalHDL設(shè)計錯誤總結(jié)相關(guān)資料分享

    1、SpinalHDL設(shè)計錯誤  SpinalHDL編譯器會做很多設(shè)計檢查,來確保生成的VHDL/Verilog是可仿真的可綜合的?;旧?,SpinalHDL不會生成破損的VHDL/Verilog
    發(fā)表于 10-24 15:37

    基于Windows系統(tǒng)的SpinalHDL開發(fā)環(huán)境搭建步驟

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

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

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

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

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

    SpinalHDL的對應(yīng)關(guān)系及聲明形式

    針對SpinalHDL的兩大類型Reg、Wire,來梳理下在SpinalHDL的對應(yīng)關(guān)系及聲明形式。
    的頭像 發(fā)表于 07-03 11:02 ?1574次閱讀

    SpinalHDLBundle數(shù)據(jù)類型的轉(zhuǎn)換

    SpinalHDLBundle與SystemVerilog的packed struct很像,在某些場景下,與普通數(shù)據(jù)類型之間的連接賦值可以通過asBits,assignFromBits來實(shí)現(xiàn)。
    的頭像 發(fā)表于 10-17 09:51 ?1333次閱讀

    SpinalHDL BlackBox時鐘與復(fù)位

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

    淺析SpinalHDLPipeline的復(fù)位定制

    之前有系列文章介紹了SpinalHDLPipeline的使用,最近在一個功能模塊真實(shí)的使用了這個lib。
    的頭像 發(fā)表于 03-17 17:31 ?1052次閱讀
    淺析<b class='flag-5'>SpinalHDL</b><b class='flag-5'>中</b>Pipeline<b class='flag-5'>中</b>的復(fù)位定制