2015-06-10 70 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