2016-11-08 49 views
1

這個問題是關於系統verilog宏的。
我有一個頂級模塊,子模塊和一個子子模塊。子模塊在頂層模塊中實例化的子模塊中實例化。`define macros的範圍

如果我定義子模塊中的宏`define abc,將裏面`ifndef abc編寫的代碼頂部模塊/子子模塊

回答

0

在被編譯除非你在你的編譯命令使用+define+...,在define宏將取決於編輯順序生效。一旦編譯完成,它將被任何後續的代碼或文件行取代,直到符合相應的undef

說你的情況,編譯順序是:subsub.v,sub.v,top.v(根據您的模塊名稱)。

假設​​是上的sub.v第一行,這abc可有效地sub.v任何後續線以及剩餘的文件在這種情況下是top.v,但不是subsub.v

所以要回答你的問題,ifndef abctop.v內的任何代碼都不會被編譯。另一方面,subsub.v中的ifndef abc將被編譯。

Example here

2

`define宏和大多數其他的編譯指令的範圍是一個編譯單元。編譯單元是編譯器解析的源文本流。一個宏在它出現在編譯單元中的位置被定義,並從該點開始可見。

由模塊和其他名稱空間定義的作用域是不相關的,因爲在任何Verilog或SystemVerilog語法被識別之前預處理宏。這意味着您永遠不能對宏定義進行實例特定的控制。

Verilog和SystemVerilog如何定義編譯單元有一個區別。

在Verilog中,每個編譯單元都是一個編譯步驟,或者是一個編譯源代碼的工具的調用。某些工具只有一個編譯步驟,要求您一步完成所有源代碼的編譯。其他工具(例如Modelsim)允許您在單獨的步驟中編譯您的代碼。 A `define宏在一個編譯步驟中是不可見的任何其他編譯步驟,除非您重新定義它。

SystemVerilog添加了將編譯器命令行上的每個文件作爲獨立編譯單元處理的功能。這是需要的,因爲SystemVerilog允許你在模塊之外定義類型定義和函數。將每個文件保存爲單獨的編譯單元可防止命名衝突。 (這個編譯單元在C/C++中的行爲是一樣的)。

由於人們將傳統Verilog代碼與SystemVerilog混合使用,所以有些工具允許您選擇編譯單元的Verilog或SystemVerilog行爲。