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

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

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

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

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

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

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