结构有什么好处?

时间:2015-06-19 08:12:40

标签: system-verilog

我是Verilog用户,所以我不熟悉SystemVerilog。

现在我正在尝试研究structure literals

使用结构有什么好处?

1 个答案:

答案 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