将解压缩的数组类型作为参数传递

时间:2015-11-19 16:44:38

标签: system-verilog

我创建了一个简单的模块,比如添加一些管道延迟。我将数据类型作为参数,以便它可以处理像结构一样的复杂事物。我有这样的事情:

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)
  );

有没有办法获取变量的类型,以便将其传递给此参数?

2 个答案:

答案 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模块的一系列实例。