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的一个非常强大的补充,可以实现更安全的代码重用,但这种限制非常严重。
答案 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节通过使用带静态函数的静态参数化类,您可以动态调用每种数据类型的不同参数化,并使它们对每个实例保持唯一。
任何人都可以验证这是一个可行的解决方案吗?谢谢!