4. struct 结构体

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;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值