可綜合的SystemVerilog:命名空間


關鍵名詞解釋:

  • 編譯單元(compilation unit):SystemVerilog 源代碼的集合
  • 編譯單元域(compilation-unit scope):即編譯單元的本地范圍,包含其他空間之外的所有聲明

SystemVerilog有8個命名空間,其中兩個為全局,兩個為編譯單元域內全局,剩余四個為局部,分別如下:

  • 定義命名空間(definitions name space),即未被嵌入定義的module, macromodule, primitive, program, interfaces的標識符。上述標識符一旦被定義,在整個編譯單元范圍內不能再次使用
  • 包命令空間(package name space),即所有編譯單元間的package標識符。一旦標識符被定義,則該標識符不能再在任何編譯單元中使用。
  • 編譯單元域命名空間(compilation-unit scope name space),在module, macromodule, primitive, program, interfaces結構之外的定義。即在編譯單元域之內定義的functions, tasks, parameters, net declarations, user defined types等等
  • 宏定義命令空間(text macro name space),編譯單元間全局。如果兩個宏定義使用同一個名稱時,后面的宏定義覆蓋前面的宏定義
  • 模塊命名空間(module name space),在module, macromodule, primitive, program, interfaces內定義的數據類型
  • 塊命名空間(block name space),在specify, function, task內定義的數據類型
  • 端口命令空間(port name space),該命名空間與模塊命名空間和塊命名空間重疊,專用於兩個不同的命名空間,且接口標識符可在模塊命名空間中重新聲明其網絡類型
  • 屬性命令空間(attribute name space),包含在(* *)中,且緊跟在語句之前。屬性標識符僅能在屬性命名空間中使用

代碼實例(example.sv):

function logic [3:0] adder (input [2:0] c, d);
  return c+d;
endfunction

module top (input logic [2:0] a, b,
			output logic [3:0] y);
	always_comb
		y = adder(a, b);
endmodule

其中,top屬於定義命名空間,adder、c、d屬於塊命名空間,而adder也屬於編譯單元域命令空間,a、b、y 屬於端口命名空間,其余命令空間請各自挖掘。

后記

由於工作環境的關系(工程較小,沒有良好的代碼組織),命名空間是被我一直忽略的一個知識點,也可能被很多人忽略。最近為公司組建開發平台,隨着需要引入工程的IP越來越多,代碼、頭文件在各個IP之間的相互調用,使得對命名空間的理解顯得越來越重要。


下篇預告:可綜合的SystemVerilog:接口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM