系统Verilog中基于参数的typedef
我想在系统Verilog中参数化typedef结构 例如,我可以为复杂数据类型使用参数化的typedef,而不是为8位和16位复杂数据单独定义吗系统Verilog中基于参数的typedef,verilog,system-verilog,register-transfer-level,Verilog,System Verilog,Register Transfer Level,我想在系统Verilog中参数化typedef结构 例如,我可以为复杂数据类型使用参数化的typedef,而不是为8位和16位复杂数据单独定义吗 typedef struct {logic [7:0] i, q;} complex_datatype_8b; typedef struct {logic [15:0] i, q;} complex_datatype_16b; 没有参数化的typedef构造,但可以将参数化的typedef作为参数化模块、接口、类等的一部分 module mod #
typedef struct {logic [7:0] i, q;} complex_datatype_8b;
typedef struct {logic [15:0] i, q;} complex_datatype_16b;
没有参数化的typedef构造,但可以将参数化的typedef作为参数化模块、接口、类等的一部分
module mod #(int A = 1, int B = 1)();
typedef struct packed {logic [A-1:0] i, q;} t1;
typedef struct packed {logic [B-1:0] i, q;} t2;
...
endmodule
在testbench中表示参数化typdef的典型方法是使用类:
class cl #(parameter C = 1);
typedef struct packed {logic [C-1:0] i, q;} tp;
endclass
module mod1();
cl#(7)::tp t;
..
endmodule
实际上,您可以使用任何参数来代替typedef中的常量。参数化的typedef是不可能的,但我们需要做一些调整以获得类似的结果。这里我们使用宏来实现它
`define MY_STRUCT_STAGE(NAME) \
my_struct_t_``NAME``
`define MY_STRUCT_STAGE_DEFINE(NAME, CNTR_TBL_ADDR_W, CNTR_TBL_DATA_W) \
typedef struct { \
logic [CNTR_TBL_ADDR_W-1``:0] address; \
logic [CNTR_TBL_DATA_W-1:0] data; \
} `MY_STRUCT_STAGE(NAME)
module module_struct #(parameter int ADDR = 3, parameter int DATA=2);
`MY_STRUCT_STAGE_DEFINE(struct1,ADDR,DATA)
`MY_STRUCT_STAGE(struct1)
endmodule
module top ();
module_struct ms1(); // by default ADDR = 3 and DATA=2 with this structure is created
module_struct #(5,6) ms2(); // struct is created with ADDR=5 and DATA=6
endmodule
我参考了-
职位cl#(7)::tp t;这样的声明是否允许用于模块上的端口而不仅仅是测试台?因为它需要类,所以它必须是测试台的一部分。您也可以在测试台模块的端口中使用此结构。它是不可合成的。