2015-06-10 109 views
-1

嗨,我有下面的場景,它不適合我。Tick-包含systemverilog包內的頭文件

文件:a.svh

a.svh定義了一些參數和職能 - 假設XYZ功能(B)

文件b.sv

package b; 
`include "a.svh" 

typedef logic[(xyz(10)-1):0] h; 

endpackage 

現在的問題是,B .sv在它的範圍內找不到xyz函數,甚至認爲我是tick(包括b.sv.中的a.svh)。如果我不在b.sv文件中使用包,一切正常。 (註釋掉包裝b和包裝線)。

//package b; 
`include "a.svh" 

typedef logic[(xyz(10)-1):0] h; 

//endpackage 

在systemverilog中是不是一個不明情況?

+0

這可能與編譯順序的問題。從IEEE Std 1800-2012開始:「編譯軟件包應該在編譯導入軟件包的範圍之前。」 – toolic

+0

您可以顯示a.svh的內容嗎?以及你如何編譯b.v?這將有助於創建一個完整的自包含的示例,您正在嘗試執行的操作 –

回答

1

我重新創建了您的場景EDAplayground。我沒有得到任何錯誤。

A function旨在在模擬過程中進行評估。一些模擬器在編譯/闡述過程中支持評估功能,但似乎並不需要。

SystemVerilog也有let,它更適合編譯時評估(它也支持仿真時間)。請參閱IEEE Std 1800-2012 § 11.13 讓構建

let聲明可以用於定製,並且可以在許多情況下,替換文本宏。 let構造更安全,因爲它具有局部範圍,而編譯器指令的範圍在編譯單元中是全局的。在包中包含let聲明(請參閱第26章)是爲設計代碼實現結構良好的自定義的一種自然方式。

a.svh

function int xyz_func(int b); 
    return b; 
endfunction 
let xyz_let(b) = b; 

design.sv(相當於你b.sv,EDAplayground需要design.sv存在)

package b; 
`include "a.svh" 

typedef logic[(xyz_func(10)-1):0] hf; 
typedef logic[xyz_let(10):1] hl; 

endpackage 

testbench.sv

module tb; 
    import b::*; 
    hf myhf; 
    hl myhl; 
    initial begin 
    myhf = -1; 
    myhl = -1; 
    $display("hf:%b left:%0d right:%0d", myhf, $left(myhf), $right(myhf)); 
    $display("hl:%b left:%0d right:%0d", myhl, $left(myhl), $right(myhl)); 
    end 
endmodule 

輸出:

HF:1111111111左:9右:0
HL:1111111111左:10右:1

+0

答案中提出的'a.svh'不是頭文件(在C頭文件的意義上),因爲它包含一個實現。 – user1241663