处理SystemVerilog包中的参数化

时间:2010-10-09 00:56:55

标签: verilog system-verilog

SystemVerilog添加了包以提供公共代码段(函数,类型,常量等)的命名空间。但由于软件包未实例化,因此无法对其进行参数化,因此处理参数化成员是有问题的。在实践中,我发现这是非常有限的,因为我的自定义类型通常有一些参数指示字段宽度等。

我通常通过使用带默认值的参数来解决这个问题,并且只是理解我需要返回更改某些应用程序的包源代码,这对我来说似乎非常错误。但我还没有找到一种方法来更清洁地处理这个问题。例如:

package my_pkg;
    parameter ADDR_MSB = 7;
    parameter DATA_MSB = 31;

    typedef struct {
        logic [ADDR_MSB:0] address;
        logic [DATA_MSB:0] data;
    } simple_struct_t;

endpackage

有没有人找到一种更清洁的方式来解决这个问题?我很乐意听到它,因为我认为软件包是SV的一个非常强大的补充,可以实现更安全的代码重用,但这种限制非常严重。

7 个答案:

答案 0 :(得分:3)

是的,我同意。这是包缺失的功能。

只是spitballin'在这里,但你可以将你的参数抽象到一个secod包中,并在编译时使用正确的参数来调整你的包。我知道这不是你真正想要的,但它可能会让你接近。

如果我在项目中遇到这种情况,我想我最终会得到代表每种配置的多个包。

答案 1 :(得分:3)

我有几点想法。首先,我倾向于使用类而不是结构来建模我的数据。类可以参数化,动态分配,随机化,包含覆盖组等。当我想要一个压缩结构时,我只使用结构。打包的结构非常棒,因为您可以像常规向量一样分配它们,然后使用命名字段访问数据。非常好。 :)

其次,即使可以重新定义包参数,模拟中只有一个包的“实例”;不能有多个具有不同参数值的特化,例如可以存在模块或类。所以在我看来,取消参数并使用宏代替是一个可行的解决方案。虽然我不喜欢使用宏,但这样可以在不更改源代码的情况下使用新值重新编译。

答案 2 :(得分:3)

您可以使用参数化宏来命名具有特定宽度的类型:

`define SIMPLE_STRUCT(NAME) \
   simple_struct_t_``NAME``

`define SIMPLE_STRUCT_DEF(NAME, ADDR_MSB, DATA_MSB) \
 typedef struct { \
        logic [ADDR_MSB``:0] address; \
        logic [DATA_MSB:0] data; \
    } `SIMPLE_STRUCT(NAME)

然后,在代码中的某个位置,您可以定义所需的结构:

`SIMPLE_STRUCT_DEF(narrow, 7, 31)
`SIMPLE_STRUCT_DEF(wide, 15, 63)

然后,只需使用名称:

即可在需要的地方使用它
`SIMPLE_STRUCT(narrow) narrow1, narrow2;
narrow1.data = 0;
narrow2 = narrow1;
...

答案 3 :(得分:2)

这可能适用也可能不适用,具体取决于您想要放入包中的具体内容,但接口可以参数化,并且如果您的工具支持它,则可以合成。

http://www.doulos.com/knowhow/sysverilog/tutorial/interfaces/

有一个例子

答案 4 :(得分:1)

我有同样的问题,同事建议如下:

// defines.sv:

`ifndef MY_DEFINES
  `define MY_DEFINES
     `define TYPEDEF_VECTOR_T typedef logic [WIDTH-1:0] vector_t;
`endif

// mod_sub.sv:

`include "defines.sv"
module mod_sub #(parameter WIDTH = 32);
...
   `TYPEDEF_VECTOR_T
   vector_t some_reg;
...
endmodule

// mod_top.sv:

module mod_top;

   mod_sub #(.WIDTH(8))  mod_sub8;
   mod_sub #(.WIDTH(64)) mod_sub64;

endmodule

我相信在任何模块之前都会详细说明System Verilog软件包,因此在编译时它们的内容不能被参数修改。

答案 5 :(得分:0)

我不会说这是一个缺失的功能。几十年来,你在Verilog中用宏完成了你要做的事情。麻烦的是,你必须在命名方式上保持相当独特,以避免包之间发生冲突。这不好,但它确实有效。

参数有点不同。它们用于逐个实例定制(如VHDL泛型)。在逻辑模块或测试台的类上。我对它们的唯一批评是,一旦你开始使用它们,它们往往会在你的层次结构中传播,语法并不完全紧凑。虽然非常强大,但对于代码重用非常有用。

答案 6 :(得分:0)

我知道这是一个非常古老的帖子,但我已经在这个问题上苦苦挣扎了很长一段时间了。我相信我找到了合适的解决方案,但我目前还没有工具集来验证这是否可以成功合成。

参见:http://www.sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf

中的5.6.7节

通过使用带静态函数的静态参数化类,您可以动态调用每种数据类型的不同参数化,并使它们对每个实例保持唯一。

任何人都可以验证这是一个可行的解决方案吗?谢谢!