您好我已经遵循了这个场景并且它不适合我。
文件:a.svh
a.svh定义了一些参数和函数 - 让我们说函数xyz(b)
文件b.sv
package b;
`include "a.svh"
typedef logic[(xyz(10)-1):0] h;
endpackage
现在问题是,b.sv无法在其范围内找到xyz函数,甚至认为我在b.sv中包含a.svh。如果我不在b.sv文件中使用包,一切正常。 (注释掉包b和endpackage行)。
//package b;
`include "a.svh"
typedef logic[(xyz(10)-1):0] h;
//endpackage
在systemverilog中它是一个illigal案例吗?
答案 0 :(得分:1)
我在EDAplayground上重新创建了您的方案。我没有得到任何错误。
要在模拟期间评估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 left:9 right:0
hl:1111111111 left:10 right:1