11

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 的一个非常强大的补充,可以实现更安全的代码重用,但这个限制非常严重。

4

7 回答 7

4

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

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

于 2010-10-23T00:17:23.620 回答
3

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

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

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

于 2010-10-17T00:18:57.877 回答
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;
...
于 2013-08-31T21:53:34.237 回答
2

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

在http://www.doulos.com/knowhow/sysverilog/tutorial/interfaces/有一个例子

于 2011-03-19T18:53:27.763 回答
1

我有同样的问题,一位同事提出以下建议:

//定义.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 包是在任何模块之前详细说明的,因此它们的内容不能在编译时通过参数修改。

于 2013-07-18T14:45:24.300 回答
0

我不会说这是一个缺失的功能。几十年来,您正在尝试使用 Verilog 中的宏来完成。麻烦的是你必须在命名事物的方式上相当独特,以避免包之间的冲突。这不是很好,但它有效。

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

于 2010-11-08T13:36:28.510 回答
0

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

请参阅第 5.6.7 节: http: //www.sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf

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

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

于 2014-09-03T19:55:36.840 回答