我创建了一个简单的模块,比如添加一些管道延迟。我将数据类型作为参数,以便它可以处理像结构一样的复杂事物。我有这样的事情:
module pipe
#(parameter type T = int,
parameter DELAY = 0)
(
input clk,
input T data_in,
output T data_out);
T pipe[DELAY];
always_ff @(posedge clk) begin
pipe[0] <= data_in;
for(int i = 1; i<DEPTH; i++) begin
pipe[i] <= pipe[i-1];
end
end
assign data_out = pipe[DELAY-1];
endmodule
这很好用,但后来我发现自己想要用一个解压缩的数组,我无法弄清楚如何实例化它。它看起来像这样,但我不认为这是对的:
logic [7:0] my_data [16];
logic [7:0] my_data_delayed [16];
pipe #(.T(logic [7:0] [16]), .DELAY(2)) i_pipe
(
.clk(clk),
.data_in(my_data),
.data_out(my_data_delayed)
);
有没有办法获取变量的类型,以便将其传递给此参数?
答案 0 :(得分:3)
您可以使用typedef
定义数据类型:
typedef logic [7:0] my_type [16];
my_type my_data;
my_type my_data_delayed;
pipe #(.T(my_type), .DELAY(2)) i_pipe
(
.clk(clk),
.data_in(my_data),
.data_out(my_data_delayed)
);
剩下的问题是它是否适用于您的模拟器。我在EDAplayground尝试过,与VCS合作但不是Riviera-PRO(得到了#34;此版本不支持&#34;消息)
我能够让typedef struct { logic [7:0] data [16]; } my_type;
工作。不太干净,但它是一种解决方法。
答案 1 :(得分:2)
在输入问题时,我找到了一个答案。 type
运算符(IEEE 1800-2012)规范中的6.23节做了我需要的操作。所以我的实例看起来像这样:
logic [7:0] my_data [16];
logic [7:0] my_data_delayed [16];
pipe #(.T(type(my_data)), .DELAY(2)) i_pipe
(
.clk(clk),
.data_in(my_data),
.data_out(my_data_delayed)
);
当然,这会导致我的工具出现编译错误,因此它看起来不受普遍支持。
我的解决方法是制作pipe
模块的一系列实例。