對于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文章
5434瀏覽量
124561 -
C語言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141812 -
編程語言
+關(guān)注
關(guān)注
10文章
1956瀏覽量
36681
發(fā)布評論請先 登錄
信號發(fā)生器泰克AFG31000系列在模擬電路檢定中的應(yīng)用

AN65974在vivado 2018.2中進(jìn)行仿真時, 無法獲取輸出數(shù)據(jù)信號是怎么回事?
labview進(jìn)行的數(shù)據(jù)采集
如何正確地進(jìn)行信號放大

在testbench中如何使用阻塞賦值和非阻塞賦值

數(shù)組名之間可以直接賦值嗎
信號放大基礎(chǔ):什么是信號放大,如何正確地進(jìn)行信號放大
ADS131M03的寄存器讀寫是要在轉(zhuǎn)換觸發(fā)的中斷中進(jìn)行配置,還是可以在standby狀態(tài)下進(jìn)行?
FPGA無芯片怎么進(jìn)行HDMI信號輸入

在進(jìn)行高速信號放大設(shè)計時,往往需要用到反饋電路,是否反饋電路越短越好?
使用霍爾效應(yīng)傳感器在電子智能鎖中進(jìn)行位置感應(yīng)應(yīng)用說明

評論