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

Rus*_*ell 1 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;
Run Code Online (Sandbox Code Playgroud)

等。我试图找到最好的方法来创建这些参数一次,然后在多个文件中访问它们。当您可以创建一个程序包并在需要的地方包含该程序包时,我就习惯了VHDL。我知道Verilog可以使用该include指令,但是我相信我需要将其括起来ifdefs

我只想创建一个SystemVerilog程序包,但我不想处理供应商工具之间的综合兼容性问题。(我知道Microsemi有点奇怪,您可以在其中包含SV文件,但是它们必须以.v结尾)。

对于您的长期Verilog编码人员,首选的方法是什么?

tea*_*jay 5

我希望我可以说SystemVerilog软件包将是理想的选择,但是像您一样,我发现声称符合SystemVerilog的综合和正式验证工具存在兼容性问题。

取而代之的是,我看到了两种常用的方法:

1)全局`define语句,仅获得一次(或免费地由使用它们的每个文件提供):

`define ASCII_a 8'h61
Run Code Online (Sandbox Code Playgroud)

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

2)参数包括文件,通常与不同的扩展名(例如.vh.vinc),以防止它们被意外地编制外的`包含语句。例如:

my_params.vh:

localparam ASCII_a = 8'h61;
...
Run Code Online (Sandbox Code Playgroud)

my_module.v:

`include "my_params.vh"
Run Code Online (Sandbox Code Playgroud)

一些设计人员使用来包装其params文件ifdef,这是在IP includes多个文件和那些文件又依次include是参数文件的情况下使用的好习惯。

`ifndef _my_params_h
`define _my_params_h
localparam ASCII_a = 8'h61;
...
`endif
Run Code Online (Sandbox Code Playgroud)