我重新創建了您的場景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
這可能與編譯順序的問題。從IEEE Std 1800-2012開始:「編譯軟件包應該在編譯導入軟件包的範圍之前。」 – toolic
您可以顯示a.svh的內容嗎?以及你如何編譯b.v?這將有助於創建一個完整的自包含的示例,您正在嘗試執行的操作 –