勾选 - 包括systemverilog中包内的头文件

问题描述 投票:-1回答:1

嗨,我已经遵循了方案,它不适合我。

档案: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案例吗?

verilog system-verilog
1个回答
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

test奔驰.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

© www.soinside.com 2019 - 2024. All rights reserved.