對于SpinalHDL電路描述,信號的賦值不免有些小伙伴帶有些許迷茫,本篇抽絲剝繭,一塊兒來梳理。
是val還是var?
先來看兩個語法:

對于變量a,聲明為val,在對其進(jìn)行第二次賦值時發(fā)現(xiàn)會報錯,而聲明為var的變量則正常。在Scala里,對于val和var的定義:
**val:不可變變量類型。
var:可變變量類型
這似乎與我們在其他語言中所接觸的有些沖突,變量是不可變的為什么還叫變量呢?Scala是一門函數(shù)式編程語言,而在函數(shù)式編程里,其所倡導(dǎo)的往往是變量的賦值僅有一次,對于其他地方不會對該變量進(jìn)行重新賦值,這也是引入val類型的原因,頗有些C語言中const類型的意味。
而下面的語句:

這里變量c聲明為val,其意味著c所指向的地址不可變更,但我們?nèi)钥梢孕薷钠渲赶虻膬?nèi)容,這也正式為什么我們能對c(0)賦值,而無法再將c指向一個新聲明的Array。
聲明師=,賦值靠:=
有了上面的了解,再回到SpinalHDL電路描述里,我們在描述電路時,無論是寄存器還是Mem、這些都是電路對象,其聲明有且僅應(yīng)當(dāng)只有一次,因而我們在定義變量時,往往這么來定義:

在Scala里一切皆為class,這里我們聲明a為一個UInt對象、b為一個RegNext(a)對象,即這里聲明a、b均為8比特的寄存器,而寄存器本身一旦定義了是不可變的,為val類型。想一想倘若一會兒將a聲明為8bit寄存器,一會兒聲明為9比特寄存器,像Verilog中這么寫:

想必沒人會在Verilog中這么來寫吧。同理,在SpinalHDL里,我們聲明一個電路對象時,自然是=。
雖然電路對象不可改,就像聲明了a是8bit,其一定是8bit,但這8bit所代表的值是可以改變的?。?!這也正是我們描述電路里的賦值。
SpinalHDL里為電路對象的賦值提供了三種形式:

我們是為電路對象所代表的值進(jìn)行賦值,而不是改變電路對象本身(把電路對象指向另一個對象,想一想是否和上面Array的賦值有點兒類似),因而這里我們是不能用=(=在Scala中本身也是一個方法,是改變變量指向的位置,玩不可行),因而所要采用的是SpinalHDL中提供的:=或者\(yùn)=來給電路對象所代表的含義進(jìn)行賦值:

由于只有聲明為Reg類型的變量才會被當(dāng)成寄存器類型,這里即可放心使用“:=”。
小結(jié)
勸君莫懼Scala,我們在電路描述里用到的語法特性并不多,若有systemverilog的基礎(chǔ)那么對于這類軟件語言入門沒那么可怕,畢竟又不是去轉(zhuǎn)大數(shù)據(jù)不是么?
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5602瀏覽量
129600 -
C語言
+關(guān)注
關(guān)注
183文章
7642瀏覽量
145147 -
編程語言
+關(guān)注
關(guān)注
10文章
1962瀏覽量
39331
發(fā)布評論請先 登錄
在 VSCode 中進(jìn)行 CW32L010 MCU 的開發(fā),應(yīng)該如何配置環(huán)境?
如何在Zephyr中進(jìn)行靜態(tài)代碼分析
使用DAP miniWiggle在ADS中進(jìn)行對代碼的工程下載以及進(jìn)入調(diào)試模式進(jìn)行調(diào)試,需要安裝配置什么環(huán)境?
射頻電路對信號有什么影響
matlab appdesigner 表格組件賦值問題,求助
信號發(fā)生器泰克AFG31000系列在模擬電路檢定中的應(yīng)用
AN65974在vivado 2018.2中進(jìn)行仿真時, 無法獲取輸出數(shù)據(jù)信號是怎么回事?
labview進(jìn)行的數(shù)據(jù)采集
如何正確地進(jìn)行信號放大
在testbench中如何使用阻塞賦值和非阻塞賦值
使用PicoScope4444進(jìn)行心跳信號測試
在SpinalHDL電路中進(jìn)行信號的賦值
評論