這個問題是關於系統verilog宏的。
我有一個頂級模塊,子模塊和一個子子模塊。子模塊在頂層模塊中實例化的子模塊中實例化。`define macros的範圍
如果我定義子模塊中的宏`define abc
,將裏面`ifndef abc
編寫的代碼頂部模塊/子子模塊
這個問題是關於系統verilog宏的。
我有一個頂級模塊,子模塊和一個子子模塊。子模塊在頂層模塊中實例化的子模塊中實例化。`define macros的範圍
如果我定義子模塊中的宏`define abc
,將裏面`ifndef abc
編寫的代碼頂部模塊/子子模塊
在被編譯除非你在你的編譯命令使用+define+...
,在define
宏將取決於編輯順序生效。一旦編譯完成,它將被任何後續的代碼或文件行取代,直到符合相應的undef
。
說你的情況,編譯順序是:subsub.v
,sub.v
,top.v
(根據您的模塊名稱)。
假設是上的sub.v
第一行,這abc
可有效地sub.v
任何後續線以及剩餘的文件在這種情況下是top.v
,但不是subsub.v
。
所以要回答你的問題,ifndef abc
top.v
內的任何代碼都不會被編譯。另一方面,subsub.v
中的ifndef abc
將被編譯。
的`define
宏和大多數其他的編譯指令的範圍是一個編譯單元。編譯單元是編譯器解析的源文本流。一個宏在它出現在編譯單元中的位置被定義,並從該點開始可見。
由模塊和其他名稱空間定義的作用域是不相關的,因爲在任何Verilog或SystemVerilog語法被識別之前預處理宏。這意味着您永遠不能對宏定義進行實例特定的控制。
Verilog和SystemVerilog如何定義編譯單元有一個區別。
在Verilog中,每個編譯單元都是一個編譯步驟,或者是一個編譯源代碼的工具的調用。某些工具只有一個編譯步驟,要求您一步完成所有源代碼的編譯。其他工具(例如Modelsim)允許您在單獨的步驟中編譯您的代碼。 A `define
宏在一個編譯步驟中是不可見的任何其他編譯步驟,除非您重新定義它。
SystemVerilog添加了將編譯器命令行上的每個文件作爲獨立編譯單元處理的功能。這是需要的,因爲SystemVerilog允許你在模塊之外定義類型定義和函數。將每個文件保存爲單獨的編譯單元可防止命名衝突。 (這個編譯單元在C/C++中的行爲是一樣的)。
由於人們將傳統Verilog代碼與SystemVerilog混合使用,所以有些工具允許您選擇編譯單元的Verilog或SystemVerilog行爲。