【问题标题】:Creating an array of structs with macro in Systemverilog在 Systemverilog 中使用宏创建结构数组
【发布时间】:2015-07-27 12:30:02
【问题描述】:

我创建了一个带有(示例)两个输入和两个输出的模块。每个输入和输出的定义都通过宏定义。

是否有可能将其创建得更优雅一些(以后的可用性)?类似于输入和输出数组(NAME(i)、in(i)、out(i))?

这会很有帮助,因为我稍后会使用更多的输出和输入,并且有可能使用稍后的循环来更优雅地访问输入/输出。

顶部:

`include "macro.sv"

module top (in_0, in_1, out_0, out_1);

    `STRUCT_i(in_0_temp,  10);
    `STRUCT_i(in_1_temp,  22);
    `STRUCT_i(out_0_temp,  55);
    `STRUCT_i(out_1_temp,  99);

    input   `STRUCT(in_0_temp)      in_0;
    input   `STRUCT(in_1_temp)      in_1;
    output  `STRUCT(out_0_temp)     out_0;
    output  `STRUCT(out_1_temp)     out_1;

...

    endmodule

宏.sv:

`define STRUCT(NAME) \
struct_i_``NAME``

`define STRUCT_i(NAME, DATA) \
typedef struct packed { \
  logic [DATA:0]            info; \
  logic                     test1; \
  logic                     test2; \
    } `STRUCT(NAME)

【问题讨论】:

  • 宏定义不属于包内。它们对于当前编译单元是全局的。见go.mentor.com/package-import-versus-include
  • 您是否根据 LRM 第 5.10 节尝试了 SV 支持的输入/输出结构数组?
  • 结构数组在这里不起作用,因为似乎每个元素都需要是不同的类型。
  • 是的,每个元素都需要是不同的类型,这是我的问题。没有选项可以使用数组执行此操作?哦,我在复制粘贴(包)中混合了一些东西。

标签: arrays struct module macros system-verilog


【解决方案1】:

数组无法做到这一点,因为根据定义,数组是统一类型变量的集合。使用动态索引值访问要求每个元素具有相同的布局。即使使用不同长度的简单位向量,它也不起作用。您唯一可综合的选择是使用最大大小声明 info,并希望优化掉未使用的位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多