答案 0 :(得分:2)
SystemVerilog中的结构或多或少类似于C语言中的结构用法,结构是单个名称下的不同数据类型,变量或常量的集合。有关更多详细信息,您可以随时参考SystemVerilog LRM IEEE Std 1800-2012♦7.2结构
我将在此解释结构的更常见用法和优点。
结构声明可以通过变量或网络来完成,整个结构可以通过使用 var 关键字声明为变量,并且可以使用Verilog数据类型 wire 或 tri ,当定义为net类型时,结构的所有成员都应该是4状态类型。
结构变量:
var struct {
logic [15:0] a, b;
logic [ 7:0] data;
logic [31:0] width;
} data_word_var;
结构网:
wire struct {
logic [15:0] a, b;
logic [ 7:0] data;
logic [31:0] width;
} data_word_net;
如果我们在默认情况下没有提到结构的类型,它将是网络类型并注意,尽管整个结构可以是网络类型,但是不能在结构内声明网络类型变量。
结构可以整体初始化
data_word_net dw = ’{16'hf0f0, 16'h1010, 8’d3, 0};
或个人会员可以初始化
data_word_net dw;
dw.data = 8'b1011_1111;
我们也可以使用成员名称进行初始化
data_word_net dw = ’{a:16'hf0f0, b:16'h1010, data:8’d3, width:0}; // legal
data_word_net dw = ’{a:16'hf0f0, data:8’d3, b:16'h1010, width:0}; // legal
data_word_net dw = ’{a:16'hf0f0, 8’d3, 16'h1010, width:0}; // illegal(all members should be mentioned do not mix both)
也可以使用默认关键字
将成员初始化为默认值typedef struct {
real r0, r1;
int i0, i1;
logic [ 7:0] a;
logic [23:0] addr;
} data_word;
data_word dw;
dw = ’{ real:1.0, default:0, r1:3.1415 };
可以通过模块端口使用结构
package my_pkg;
typedef struct {
logic [31:0] a, b;
} input_ports;
typedef struct {
logic [63:0] y;
} output_ports;
endpackage
module alu
(input my_pkg::input_ports inp,
output my_pkg::output_ports outp,
input wire clock);
...
endmodule
结构也可以用作任务和函数的参数
module dut (...);
...
typedef struct {
logic [31:0] a, b;
logic [63:0] width;
logic [15:0] addr;
} i_pins;
function alu (input i_pins connect);
...
endfunction
endmodule
除了上述优点外,语言还支持打包和解包格式的结构数组,如下所示
typedef struct packed { // packed structure
logic [7:0] a;
logic [7:0] b;
} packet_t;
packet_t [15:0] packet_array; // packed array of 16 structures
typedef struct { // unpacked structure
int a;
real b;
} data_t;
data_t data_array [15:0]; // unpacked array of 16 structures