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