對于SpinalHDL電路描述,信號的賦值不免有些小伙伴帶有些許迷茫,本篇抽絲剝繭,一塊兒來梳理。
是val還是var?
先來看兩個語法:
對于變量a,聲明為val,在對其進行第二次賦值時發(fā)現會報錯,而聲明為var的變量則正常。在Scala里,對于val和var的定義:
**val:不可變變量類型。
var:可變變量類型
這似乎與我們在其他語言中所接觸的有些沖突,變量是不可變的為什么還叫變量呢?Scala是一門函數式編程語言,而在函數式編程里,其所倡導的往往是變量的賦值僅有一次,對于其他地方不會對該變量進行重新賦值,這也是引入val類型的原因,頗有些C語言中const類型的意味。
而下面的語句:
這里變量c聲明為val,其意味著c所指向的地址不可變更,但我們仍可以修改其指向的內容,這也正式為什么我們能對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類型的變量才會被當成寄存器類型,這里即可放心使用“:=”。
小結
勸君莫懼Scala,我們在電路描述里用到的語法特性并不多,若有systemverilog的基礎那么對于這類軟件語言入門沒那么可怕,畢竟又不是去轉大數據不是么?
審核編輯:劉清
-
寄存器
+關注
關注
31文章
5357瀏覽量
120582 -
C語言
+關注
關注
180文章
7606瀏覽量
137054 -
編程語言
+關注
關注
10文章
1946瀏覽量
34794
發(fā)布評論請先 登錄
相關推薦
評論