Bluespec SystemVerilog (BSV) 是由Arvind 開(kāi)發(fā)的 Bluespec 語(yǔ)言,這是一種高級(jí)功能 硬件 描述編程語(yǔ)言,本質(zhì)上是Haskell(Haskell ( / ?h ?s k ?l / ) 是一種通用的、靜態(tài)類型的、純函數(shù)式 編程語(yǔ)言,具有類型推斷和惰性求值。)的擴(kuò)展,用于處理一般的芯片設(shè)計(jì)和電子設(shè)計(jì)自動(dòng)化。Bluespec的主要設(shè)計(jì)者和實(shí)現(xiàn)者是Lennart Augustsson。Bluespec 被部分評(píng)估(轉(zhuǎn)換 Haskell 部分)并編譯為術(shù)語(yǔ)重寫系統(tǒng)(TRS)。它帶有一個(gè)SystemVerilog前端。BSV 編譯為Verilog RTL 設(shè)計(jì)文件。
為什么要 BSV?Verilog 不好用?
BSV 是一門高級(jí)硬件描述語(yǔ)言(High-Level Hardware Description Language, HL-HDL),與 Verilog 一樣,被用于 FPGA 或 ASIC 的設(shè)計(jì)和驗(yàn)證。BSV 于 2003 年被 Bluespec 公司開(kāi)發(fā),期間是商業(yè)收費(fèi)工具,到 2020 年它的編譯器才開(kāi)源,這才給了我們接觸它的機(jī)會(huì)。
Verilog 的語(yǔ)法簡(jiǎn)單、特性少,卻能全面且精準(zhǔn)地描述數(shù)字電路,是“小而美”的語(yǔ)言。學(xué)習(xí) Verilog 時(shí),只需要掌握3種常見(jiàn)寫法:assign, always @ (*) 和 always @ (posedge clk) ,剩下的就依賴于你對(duì)電路設(shè)計(jì)的理解了。當(dāng)然,這才是最難的,包括各種繁雜的硬件設(shè)計(jì)思維——狀態(tài)機(jī)、并行展開(kāi)、流水線化、握手信號(hào)、總線協(xié)議等。
各位讀到這里有沒(méi)有意識(shí)到問(wèn)題——用如此簡(jiǎn)單的抽象級(jí)別來(lái)描述如此復(fù)雜的數(shù)字電路系統(tǒng),會(huì)不會(huì)很吃力?相信每個(gè)接觸過(guò)復(fù)雜的 Verilog 系統(tǒng)的讀者,都體會(huì)過(guò)被 always 塊下的幾十個(gè)狀態(tài)所支配的恐懼,也清晰地記得模塊實(shí)例化時(shí)那幾十行嚇人的端口連接。因此,我們需要一種抽象層次更高的 HDL 來(lái)提高開(kāi)發(fā)效率,BSV 就能勝任這一工作。
以上內(nèi)容來(lái)源于:
?
https://zhuanlan.zhihu.com/p/469917984
?
對(duì)BSV有興趣的可以看看上面文章《爆肝6萬(wàn)字的 Bluespec SystemVerilog (BSV) 中文教程上線了》。
今天的核心是使用BSV設(shè)計(jì)一款游戲,看下在實(shí)際設(shè)計(jì)中BSV表現(xiàn)如何~
使用BSV設(shè)計(jì)《太空入侵者》
緒論
2020年1月,Bluespec開(kāi)源了bsc(Bluespec SystemVerilog Compiler)。因此我安裝了 bsc,這是一個(gè)編譯器,可以對(duì)用BSV (Bluespec SystemVerilog)編寫的設(shè)計(jì)進(jìn)行高級(jí)綜合。BSV 與任何其他語(yǔ)言一樣,無(wú)法通過(guò)閱讀手冊(cè)來(lái)學(xué)習(xí),我認(rèn)為學(xué)習(xí)新語(yǔ)言的唯一方法是實(shí)際設(shè)計(jì)應(yīng)用程序。因此,我嘗試使用 BSV 設(shè)計(jì)《太空入侵者》游戲。
BSV
簡(jiǎn)而言之,Verilog HDL 是一種標(biāo)準(zhǔn)化為 IEEE 1364 的硬件設(shè)計(jì)語(yǔ)言 (HDL),而 SystemVerilog 是其標(biāo)準(zhǔn)化為 IEEE 1800 的擴(kuò)展。BSV 是進(jìn)一步擴(kuò)展 SystemVerilog 的 HDL。
使用設(shè)備
使用的開(kāi)發(fā)板如下:
第一步 - 聲音 FSM(有限狀態(tài)機(jī))設(shè)計(jì)
第一次應(yīng)用BSV時(shí),聲音狀態(tài)機(jī)的規(guī)模比較小,所以這是第一個(gè)設(shè)計(jì)目標(biāo)。
確定聲道
游戲中使用了 10 種不同的聲音;需要確定同時(shí)發(fā)生的數(shù)量(=聲道的數(shù)量)。考慮到游戲場(chǎng)景中同時(shí)發(fā)生的條件,假設(shè)有4個(gè)通道:玩家自己的船的聲音、入侵者的聲音1和2、UFO的聲音。
聲音系統(tǒng)框圖
框圖如下圖所示。聲音FSM從之前的設(shè)計(jì)擴(kuò)展到4個(gè)通道。
第二步——游戲FSM設(shè)計(jì)
然后繼續(xù)進(jìn)行游戲FSM的狀態(tài)機(jī)設(shè)計(jì)。
在設(shè)計(jì)聲音 FSM 時(shí),我使用基于狀態(tài)的設(shè)計(jì)方法來(lái)設(shè)計(jì) FSM 。本文中的基于狀態(tài)的FSM設(shè)計(jì)方法是指將序列手動(dòng)分解為狀態(tài),并為每個(gè)狀態(tài)一一編寫規(guī)則的方法。這種方法基本上需要與Verilog相同的工時(shí)。換句話說(shuō),使用高級(jí)語(yǔ)言沒(méi)有什么好處。
另一方面,BSV 有一個(gè)名為StmtFSM的庫(kù),可以高效地設(shè)計(jì)狀態(tài)機(jī)。在這個(gè)游戲FSM中,我充分利用了這一點(diǎn),設(shè)計(jì)時(shí)無(wú)需手動(dòng)進(jìn)行狀態(tài)分解。在本文中,這種方法將被稱為基于序列的方法。
博弈FSM算法
基本上,我發(fā)現(xiàn)游戲可以用與用C編寫相同的方式來(lái)編寫。例如,如果我考慮子彈移動(dòng)、碰撞檢測(cè)、碰撞處理以及顯示和擦除爆炸標(biāo)記的算法,則算法是對(duì)于自己和敵人的子彈來(lái)說(shuō)都是一樣的,如下所示。
if(bullet_explosion_timer>=1){//Bulletexploding bullet_explosion_timer++; if(bullet_explosion_timer==MAX){ bulletdeletion;//logicaldeletion erasebullet_explosion_mark;//logicalerasure bullet_explosion_timer<=?0; ????} }?else?{ ????if?(no?bullets?and?bullet?generation?condition)?{ ????????bullet?generation?process; ????????bullet?sound;?//?only?own?bullets,?no?sound?for?enemy?bullets ????} ????if?(bullet?exists)?{ ????????Collision?detection; ????????if?(collision?with?object)?{?//?invader?and?UFO?for?own?bullets,?ship?for?enemy?bullets ????????????delete?bullet;?//?logical?deletion ????????????erase?bullet_mark;?//?Physical?deletion ????????????object?state?<=?explosion; ????????????object_explosion_timer?<=?0; ????????}?else?if?(up?down?hash?||?base?||?bullets)?{?//?bullets:?if?own?bullets,?enemy?bullets;?if?enemy?bullets,?own?bullets ????????????erase?bullet_mark;?//?physical?erase ????????????show?bullet_explosion_mark; ????????????bullet_explosion_timer?<=?1;?//?start?timer ????????}?else?{?//?if?no?collision ????????????advance?bullet;?//?if?no?collision,?advance?the?bullet;?//?if?no?collision,?advance?the?bullet ????????} ????} }
另一方面,該對(duì)象需要專門的處理,如下面的代碼所示。
if(objectstate==explosion){ if(object_explosion_timer==0){ object_explosion_timer<=?1;?//?start?timer ????????object?explosion?sound; ????????show?object_explosion_mark?; ????}?else?{ ????????object_explosion_timer++; ????????if?(object_explosion_timer?==?MAX)?{ ???????????delete?object;?//?logical?deletion ???????????erase?object_explosion_mark;?//?physical?erasure ????????} ????} }
通過(guò)應(yīng)用 StmtFSM,可以將項(xiàng)目符號(hào)序列描述為一種算法,而無(wú)需將其分解為逐個(gè)時(shí)鐘狀態(tài)。我用類C語(yǔ)言編寫了上面的偽代碼,但我只需要將BSV中的'{'更改為seq ,將'}'更改為endseq 。if、while、for等控制語(yǔ)法由bsc進(jìn)行行為綜合,并轉(zhuǎn)換為Verilog中的狀態(tài)機(jī)。
游戲完成
下面的動(dòng)圖展示了可能是世界上第一部由 BSV 設(shè)計(jì)的《太空入侵者》游戲的視頻。
完整的入侵者層次結(jié)構(gòu)如下圖所示。Button_0 只是一個(gè)對(duì)板載開(kāi)關(guān)和外部開(kāi)關(guān)進(jìn)行或運(yùn)算的電路。入侵者_(dá)移動(dòng)_0是BSV設(shè)計(jì)的游戲FSM。blk_mem_gen_0是連接到游戲FSM的ROM,用于存儲(chǔ)入侵者的模式等。
BSV的優(yōu)勢(shì)
雖然 BSV 看起來(lái)效率更高,但它增加了 bsc 的編譯時(shí)間,對(duì)于大型設(shè)計(jì)來(lái)說(shuō)可能會(huì)超過(guò)一個(gè)小時(shí)。因此,對(duì)于這樣的設(shè)計(jì),修改、模型創(chuàng)建和仿真的TAT(周轉(zhuǎn)時(shí)間)將非常長(zhǎng),這可能使其效率低于Verilog。然而,Bluesim 中的仿真速度比 iverilog 中快約 3, 000 倍。
總結(jié)
代碼如下:
?
https://github.com/mocapapa/SpaceInvaders_BSV_Ultra96v2
?
對(duì)于這一“語(yǔ)言”,其發(fā)展肯定會(huì)在某一方面有突出優(yōu)點(diǎn),之后才能被慢慢接受,類似SpinalHDL/CHISEL等,但是該門語(yǔ)言目前未在業(yè)內(nèi)受到重視,但是未來(lái)的發(fā)展我抱有希望~
-
電路設(shè)計(jì)
+關(guān)注
關(guān)注
6637文章
2398瀏覽量
201138 -
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1916瀏覽量
34379
原文標(biāo)題:開(kāi)源的Bluespec SystemVerilog (BSV)語(yǔ)言表現(xiàn)如何?
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論