struct和array的区别是,array里的数据类型都是一样的,struct可以用不一样的类型。
下面是array和struct区别的例子。
// Normal arrays -> a collection of variables of same data type
int array [10]; // all elements are of type ‘int’
bit [7:0] mem [256]; // all elements are of type ‘bit’
// Structures -> a collection of variables of same or different data types
struct
{ byte val1;
int val2;
string val3; } DataValue;
4.1 packed的struct
struct packed signed {
byte BE; //2-state
int addr; //2-state
int data; //2-state
} pStruct; //signed, 2-state
由于所有变量都是2 state的,整个packed的struct也是2 state的。如果packet struct有一个4 state的的变量,整个struct也变成4 state。如果有一个2state的变量在4 state的struct里,当使用变量的时候还是2state的。
在内存中,第一个数据是存在最高位MSB,最后一个数据存在LSB
struct packed {
logic frame_;
logic [15:0] address;
logic [31:0] data;
} control;
module top;
typedef enum
{
READ,
WRITE
} PCI_COMMAND;
typedef enum
{
IRDY,
TRDY
} PCI_IO;
typedef struct packed
{
PCI_COMMAND RW;
PCI_IO IR;
logic [15:0] addr;
logic [15:0] data;
} PCI_BUS;
PCI_BUS pBUS;
initial begin
// Assign pBUS felds by name
pBUS.RW = READ;
pBUS.IR = IRDY;
pBUS.addr = 16'ha0a0;
pBUS.data = 16'hf0f0;
$display("Fields by name :: pBUS = %p", pBUS);
// Assign pBUS felds by bit position
pBUS[31:16] = 16'h1010;
pBUS[15: 0] = 16'h2020;
$display("Fields by bit position :: pBUS = %p", pBUS);
// Assign all felds of pBUS
pBUS = '{WRITE, TRDY, 16'h3030, 16'h4040};
$display("All felds at once :: pBUS = %p", pBUS);
end
endmodule
Simulation log:
Fields by name :: pBUS = '{RW:READ, IR:IRDY, addr:'ha0a0, data:'hf0f0}
Fields by bit position :: pBUS = '{RW:READ, IR:IRDY, addr:'h1010, data:'h2020}
All felds at once :: pBUS = '{RW:WRITE, IR:TRDY, addr:'h3030, data:'h4040}
V C S S i m u l a t i o n R e p o r t
4.2 unpacked的struct
struct默认是unp的,举个例子
module SU;
struct {bit [7:0] intr; //unpacked struct
logic [23:0] addr;
} SURu;
initial begin
SURu.intr = 'hFF; //assign to a single feld
$display($stime,,, "SURu = %p", SURu);
$display($stime,,, "SURu Intr = %h", SURu.intr);
SURu = '{'h00,'hFF}; //assign to all felds
$display($stime,,, "SURu = %p", SURu);
//SURu = SURu + 'h12;
// ERROR- Unpacked struct can't be used as a vector
end
typedef struct {
int addr = 'hff; //default initial value
int data;
byte crc [4] = '{4{1}}; //default initial value
} bus;
bus b1;
initial begin
$display ("\n");
$display($stime,,, "b1.addr=%h b1.data=%h b1.crc=%p",
b1.addr,b1.data,b1.crc);
b1 = '{'h 1010, 'h a0a0, '{1,2,3,4}}; //overrides defaults
$display($stime,,, "b1.addr=%h b1.data=%h b1.crc=%p", b1.addr,b1.data,b1.crc);
end
endmodule
Simulation log:
0 SURu = '{intr:'hff, addr:'hxxxxxx} 0 SURu Intr = ff
0 SURu = '{intr:'h0, addr:'hff}
0 b1.addr=000000ff b1.data=00000000 b1.crc='{1, 1, 1, 1}
0 b1.addr=00001010 b1.data=0000a0a0 b1.crc='{1, 2, 3, 4}
V C S S i m u l a t i o n R e p o r t
5.3 作为参数传递
typedef struct {
logic [31:0] addr;
logic [63:0] data;
logic [3:0] BEnable;
} control;
function Dbus (input control ct1);
….
endfunction
5.4 struct嵌套使用
typedef struct {
bit [31:0] addr;
bit [31:0] data; } Bus;
Bus myBus;
typedef struct {
myBus x;
myBus y; } multiBus;