【问题标题】:How to share constants between many files in Verilog?如何在 Verilog 中的多个文件之间共享常量?
【发布时间】:2016-08-15 18:39:02
【问题描述】:

我在 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 编码的人来说,这方面的首选方法是什么?

【问题讨论】:

    标签: verilog fpga


    【解决方案1】:

    我希望我可以说 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
    

    【讨论】:

    • 这听起来是个好建议,谢谢。也许我应该为这个后续问题打开另一个问题,但是共享一个函数呢?
    • 你的意思是像配置变量的吸气剂?那可以工作。我在 UVM 中看到过类似的东西,但在 RTL 中还没有(到目前为止)。
    • 不,我的意思是一个可以被多个文件使用的函数。像 ASCII 到 Hex 转换器之类的东西?
    • 啊,这听起来像是另一个问题。 :) 我没有在 RTL 模块之间做太多的功能共享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2013-02-11
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多