如何在 Verilog 中的多个文件之间共享常量?
How to share constants between many files in Verilog?
我在 Verilog 中使用一个简单的 UART,它包含一些 ASCII 值的定义。例如:
parameter ASCII_a = 8'h61;
parameter ASCII_b = 8'h62;
parameter ASCII_c = 8'h63;
parameter ASCII_d = 8'h64;
parameter ASCII_e = 8'h65;
parameter ASCII_f = 8'h66;
等我试图找到最好的方法来只创建一次这些参数,然后在多个文件中访问它们。当您可以创建一个包并将该包包含在您喜欢的位置时,我已经习惯了 VHDL。我知道 Verilog 可以使用 include
指令,但我认为我需要用 ifdefs
将其包围。
我只想创建一个 SystemVerilog 包,但我不想处理供应商工具之间的综合兼容性问题。 (我知道 Microsemi 有一个奇怪的东西,你可以在其中包含 SV 文件,但它们需要以 .v 结尾)。
对于长期使用 Verilog 的程序员,首选的方法是什么?
我希望我可以说 SystemVerilog 包是理想的选择,但像你一样,我发现了与声称符合 SystemVerilog 的综合和形式验证工具的兼容性问题。
代替那个,我看到了两种常用的方法:
1) 全局 `define 语句,来源一次(或由使用它们的每个文件无偿来源):
`define ASCII_a 8'h61
我不推荐这种方法,因为存在名称冲突的风险,即不同的 IP 模块使用相同的参数名称来表示不同的值。在这种情况下,参数的有效值取决于编译顺序,这在大多数情况下不是您想要的。
2) 参数包含文件,通常具有不同的扩展名(例如 .vh
、.vinc
)以防止它们在 `include 语句之外被意外编译。例如:
my_params.vh:
localparam ASCII_a = 8'h61;
...
my_module.v:
`include "my_params.vh"
一些设计人员用 ifdef
包装他们的参数文件,这是在 IP includes
多个文件和这些文件依次 include
参数文件的情况下使用的好习惯.
`ifndef _my_params_h
`define _my_params_h
localparam ASCII_a = 8'h61;
...
`endif
我在 Verilog 中使用一个简单的 UART,它包含一些 ASCII 值的定义。例如:
parameter ASCII_a = 8'h61;
parameter ASCII_b = 8'h62;
parameter ASCII_c = 8'h63;
parameter ASCII_d = 8'h64;
parameter ASCII_e = 8'h65;
parameter ASCII_f = 8'h66;
等我试图找到最好的方法来只创建一次这些参数,然后在多个文件中访问它们。当您可以创建一个包并将该包包含在您喜欢的位置时,我已经习惯了 VHDL。我知道 Verilog 可以使用 include
指令,但我认为我需要用 ifdefs
将其包围。
我只想创建一个 SystemVerilog 包,但我不想处理供应商工具之间的综合兼容性问题。 (我知道 Microsemi 有一个奇怪的东西,你可以在其中包含 SV 文件,但它们需要以 .v 结尾)。
对于长期使用 Verilog 的程序员,首选的方法是什么?
我希望我可以说 SystemVerilog 包是理想的选择,但像你一样,我发现了与声称符合 SystemVerilog 的综合和形式验证工具的兼容性问题。
代替那个,我看到了两种常用的方法:
1) 全局 `define 语句,来源一次(或由使用它们的每个文件无偿来源):
`define ASCII_a 8'h61
我不推荐这种方法,因为存在名称冲突的风险,即不同的 IP 模块使用相同的参数名称来表示不同的值。在这种情况下,参数的有效值取决于编译顺序,这在大多数情况下不是您想要的。
2) 参数包含文件,通常具有不同的扩展名(例如 .vh
、.vinc
)以防止它们在 `include 语句之外被意外编译。例如:
my_params.vh:
localparam ASCII_a = 8'h61;
...
my_module.v:
`include "my_params.vh"
一些设计人员用 ifdef
包装他们的参数文件,这是在 IP includes
多个文件和这些文件依次 include
参数文件的情况下使用的好习惯.
`ifndef _my_params_h
`define _my_params_h
localparam ASCII_a = 8'h61;
...
`endif