最近在項目中以SpinalHDL為主體做系統(tǒng)集成,其中遇到了不少模塊命名與管理的坑,借此機(jī)會,再來聊一聊混合編程中的模塊件命名與管理的事情。
問題是什么
不可否認(rèn),在當(dāng)前的整體大環(huán)境下,Verilog/SystemVerilog仍然是主流,而SpinalHDL其本質(zhì)上更像是一個生成Verilog的腳本工具。在團(tuán)隊合作中,最終拿去生成跑綜合及布局布線生網(wǎng)表的仍然是Verilog代碼。團(tuán)隊合作時當(dāng)同時存在SpianlHDL代碼和Verilog代碼時不可避免的存在命名沖突的問題:
盡管SpinalHDL支持參數(shù)化設(shè)計,但其參數(shù)化是基于Scala層面上的,當(dāng)我們調(diào)用SpinalHDL同一個IP以不同的參數(shù)例化時往往會為每次例化均生成一個Verilog模塊代碼。而當(dāng)合作中存在多人調(diào)用組件生成RTL代碼時最后往往會有模塊命名撞車的問題。
在《被忽略的兩個Tips》及《換個名字混江湖》中對于模塊的命名均有提到一些方法,這里就真實的使用場景來看看這個問題。
setDefinitionName
在《換個名字混江湖》中對setDefinitionName的使用有較為詳細(xì)的介紹,setDefinitionName可以手動的修改最終生成的Verilog代碼對應(yīng)的模塊名,像下面的這段代碼:
這里在例化Apb3Decoder這個SpinalHDL中的IP組件時,通過setDefinitionName來設(shè)置生成RTL代碼時該模塊名重新命名為Deocer。最終生成的代碼便是下面這樣:
倘若不添加setDefinitionName指定那么生成的RTL代碼則保持原來的名字:
通過setDefinitionName可以手動的為我們的模塊指定特定的名稱,但如此做帶來的問題是我們需要要求每個人在例化每個模塊時均指定名稱。稍有不慎漏掉一個那么在最后合并整體工程時便會有重復(fù)命名的問題。更值得把握的是當(dāng)我們調(diào)用的其他lib有多層嵌套例化時那么這種方式便顯得更為復(fù)雜了。
globalPrefix
通過globalPrefix的方式可以使得在生成RTL代碼時為每個模塊添加一個特定的前綴。像下面的代碼:
指定每個模塊的命名前面均添加“test_”,可以看到最終生成的RTL代碼的每個模塊前均添加有"test_"前綴:
多人合作時根據(jù)每個人負(fù)責(zé)的功能模塊分別添加響應(yīng)的模塊命名前綴似乎是一個很的方式,然而是否通用? 看下面的例子:
這里我們在SpinalHDL中調(diào)用了封裝好的RTL代碼addTop,如果我們在例化時指定globalPrefix為“test_”,那么看看會是什么樣子:
問題來了,我例化的BlackBox代碼模塊名稱為addTop,而這里例化的時候卻例化了test_addTop——一個壓根沒有的模塊。
也就意味著當(dāng)代碼里存在Verilog和SpinalHDL代碼混合使用時那么這種globalPrefix方式便顯得太“一刀切”了。
怎么做
解決不了上面的問題那么無論SpinalHDL再怎么優(yōu)秀那終究是雞肋~
怎么做?合二為一唄!
看下面的代碼:
而最終生成的RTL代碼為:
是不是看起來解決了我們的問題? setDefinitionName的優(yōu)先級是高于globalPrefix的,我們在例化BlackBox時通過setDefinitionName指定模塊的名字來避免在添加globalPrefix時帶來的問題便可。
小小建議
在當(dāng)前的環(huán)境下,團(tuán)隊合作時若你采用SpinalHDL作為編程語言不妨采用下面的方式來進(jìn)行混合編程下的模塊命名與管理:
1、若只負(fù)責(zé)單個模塊的開發(fā),那么在生成rtl代碼時根據(jù)模塊的功能通過globalPrefix添加適當(dāng)?shù)那熬Y。
2、若在SpinalHDL中例化封裝Verilog代碼時,在例化時通過setDefinitionName指定例化時的模塊名稱確保生成RTL代碼時不會被修改掉。
審核編輯:湯梓紅
-
模塊
+關(guān)注
關(guān)注
7文章
2815瀏覽量
52430 -
Verilog
+關(guān)注
關(guān)注
30文章
1368瀏覽量
113711 -
混合編程
+關(guān)注
關(guān)注
0文章
27瀏覽量
8427
原文標(biāo)題:混合編程中的模塊命名與管理
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論