如何在Verilog中的多个文件之间共享常量?

如何在Verilog中的多个文件之间共享常量?,verilog,fpga,Verilog,Fpga,我在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; 等等,我正试图找到最好的方法,只创建一次这些参数,然后在多个文件中访问它们。当

我在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) 全局`定义语句,一次来源(或由使用它们的每个文件免费来源):

我不推荐这种方法,因为存在名称冲突的风险,即不同的IP模块使用相同的参数名称来表示不同的值。在这种情况下,参数的有效值取决于编译顺序,这在大多数情况下不是您想要的

2) 参数包括文件,通常具有不同的扩展名(例如
.vh
.vinc
),以防止在“include”语句之外意外编译这些文件。例如:

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;
我的参数vh:

localparam ASCII_a = 8'h61;
...
my_模块五:

`include "my_params.vh"
一些设计人员使用
ifdef
包装其params文件,这是一种很好的做法,适用于IP
包含多个文件,而这些文件依次
包含参数文件的情况

`ifndef _my_params_h
`define _my_params_h
localparam ASCII_a = 8'h61;
...
`endif

那听起来是个好建议,谢谢。也许我应该在接下来的讨论中提出另一个问题,但是共享一个函数呢?你的意思是像配置变量的getter一样?那可能行得通。我在UVM中见过类似的东西,但在RTL中还没有(到目前为止)。不,我指的是一个可以被多个文件使用的函数。类似于ASCII到十六进制转换器的东西?啊,听起来像是另一个问题。:)我没有在RTL模块之间进行太多的功能共享。