我重新创建了您的场景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?这将有助于创建一个完整的自包含的示例,您正在尝试执行的操作 –