处理SystemVerilog包中的参数化

Jef*_*ffW 10 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
Run Code Online (Sandbox Code Playgroud)

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

Sta*_*tan 5

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

`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)
Run Code Online (Sandbox Code Playgroud)

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

`SIMPLE_STRUCT_DEF(narrow, 7, 31)
`SIMPLE_STRUCT_DEF(wide, 15, 63)
Run Code Online (Sandbox Code Playgroud)

然后,在您需要的地方使用它,仅使用名称:

`SIMPLE_STRUCT(narrow) narrow1, narrow2;
narrow1.data = 0;
narrow2 = narrow1;
...
Run Code Online (Sandbox Code Playgroud)


小智 3

是的,我同意。这是软件包所缺少的功能。

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

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