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

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

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

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

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

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

由于只有聲明為Reg類型的變量才會(huì)被當(dāng)成寄存器類型,這里即可放心使用“:=”。
小結(jié)
勸君莫懼Scala,我們?cè)陔娐访枋隼镉玫降恼Z法特性并不多,若有systemverilog的基礎(chǔ)那么對(duì)于這類軟件語言入門沒那么可怕,畢竟又不是去轉(zhuǎn)大數(shù)據(jù)不是么?
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5619瀏覽量
130393 -
C語言
+關(guān)注
關(guān)注
183文章
7646瀏覽量
146122 -
編程語言
+關(guān)注
關(guān)注
10文章
1965瀏覽量
39855
發(fā)布評(píng)論請(qǐng)先 登錄
厚聲電阻RT0603FR-071KRL在信號(hào)調(diào)理電路中的應(yīng)用
使用MATLAB和Simulink進(jìn)行信號(hào)完整性分析
在 VSCode 中進(jìn)行 CW32L010 MCU 的開發(fā),應(yīng)該如何配置環(huán)境?
如何在Zephyr中進(jìn)行靜態(tài)代碼分析
使用DAP miniWiggle在ADS中進(jìn)行對(duì)代碼的工程下載以及進(jìn)入調(diào)試模式進(jìn)行調(diào)試,需要安裝配置什么環(huán)境?
射頻電路對(duì)信號(hào)有什么影響
matlab appdesigner 表格組件賦值問題,求助
信號(hào)發(fā)生器泰克AFG31000系列在模擬電路檢定中的應(yīng)用
信號(hào)發(fā)生器AFG31052在多載波信號(hào)生成中的應(yīng)用
在SpinalHDL電路中進(jìn)行信號(hào)的賦值
評(píng)論