OpenCores
URL https://opencores.org/ocsvn/wb2axi4/wb2axi4/trunk

Subversion Repositories wb2axi4

[/] [wb2axi4/] [trunk/] [model/] [axi_master_model.sv] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 alzhang
module axi_master_model (
2
axi_clk,
3
axi_resetn,
4
AWID    ,
5
AWADDR  ,
6
AWLEN   ,
7
AWSIZE  ,
8
AWBURST ,
9
AWLOCK  ,
10
AWCACHE ,
11
AWPROT  ,
12
AWVALID ,
13
AWREADY ,
14
//write data channel signals
15
WID     ,
16
WDATA   ,
17
WSTRB   ,
18
WLAST   ,
19
WVALID  ,
20
WREADY  ,
21
//write response channel
22
BID     ,
23
BRESP   ,
24
BVALID  ,
25
BREADY  ,
26
//Read control channel signals
27
ARID    ,
28
ARADDR  ,
29
ARLEN   ,
30
ARSIZE  ,
31
ARBURST ,
32
ARLOCK  ,
33
ARCACHE ,
34
ARPROT  ,
35
ARVALID ,
36
ARREADY ,
37
//Read data channel signals
38
RID     ,
39
RDATA   ,
40
RRESP   ,
41
RLAST   ,
42
RVALID  ,
43
RREADY
44
);
45
parameter AXI_ID_W          = 4;
46
parameter AXI_ADDR_W        = 32;
47
parameter AXI_DATA_W        = 32;
48
parameter AXI_PROT_W        = 3;
49
parameter AXI_STB_W         = 4;
50
parameter AXI_LEN_W         = 4;
51
parameter AXI_SIZE_W        = 3;
52
parameter AXI_BURST_W       = 2;
53
parameter AXI_LOCK_W        = 2;
54
parameter AXI_CACHE_W       = 4;
55
parameter AXI_RESP_W        = 2;
56
 
57
input  axi_clk;
58
input  axi_resetn;
59
output [AXI_ID_W       - 1:0]  AWID    ;
60
output [AXI_ADDR_W     - 1:0]  AWADDR  ;
61
output [AXI_LEN_W      - 1:0]  AWLEN   ;
62
output [AXI_SIZE_W     - 1:0]  AWSIZE  ;
63
output [AXI_BURST_W    - 1:0]  AWBURST ;
64
output [AXI_LOCK_W     - 1:0]  AWLOCK  ;
65
output [AXI_CACHE_W    - 1:0]  AWCACHE ;
66
output [AXI_PROT_W     - 1:0]  AWPROT  ;
67
output                         AWVALID ;
68
input                          AWREADY ;
69
  //write data channel signals
70
output [AXI_ID_W       - 1:0]  WID     ;
71
output [AXI_DATA_W     - 1:0]  WDATA   ;
72
output [AXI_STB_W      - 1:0]  WSTRB   ;
73
output                         WLAST   ;
74
output                         WVALID  ;
75
input                          WREADY  ;
76
  //write response channel
77
input  [AXI_ID_W       - 1:0]  BID     ;
78
input  [AXI_RESP_W     - 1:0]  BRESP   ;
79
input                          BVALID  ;
80
output                         BREADY  ;
81
  //Read control channel signals
82
output [AXI_ID_W        - 1:0] ARID    ;
83
output [AXI_ADDR_W      - 1:0] ARADDR  ;
84
output [AXI_LEN_W       - 1:0] ARLEN   ;
85
output [AXI_SIZE_W      - 1:0] ARSIZE  ;
86
output [AXI_BURST_W     - 1:0] ARBURST ;
87
output [AXI_LOCK_W      - 1:0] ARLOCK  ;
88
output [AXI_CACHE_W     - 1:0] ARCACHE ;
89
output [AXI_PROT_W      - 1:0] ARPROT  ;
90
output                         ARVALID ;
91
input                          ARREADY ;
92
  //Read data channel signals
93
input [AXI_ID_W   - 1:0]  RID     ;
94
input [AXI_DATA_W - 1:0]  RDATA   ;
95
input [AXI_RESP_W     - 1:0]  RRESP   ;
96
input                         RLAST   ;
97
input                         RVALID  ;
98
output                        RREADY  ;
99
 
100
 
101
reg  [AXI_ID_W   -1:0] axi_id    ;
102
reg  [AXI_ADDR_W -1:0] axi_addr  ;
103
reg  [AXI_LEN_W  -1:0] axi_len   ;
104
reg  [AXI_SIZE_W -1:0] axi_size  ;
105
reg  [AXI_BURST_W-1:0] axi_burst ;
106
reg  [AXI_LOCK_W -1:0] axi_lock  ;
107
reg  [AXI_CACHE_W-1:0] axi_cache ;
108
reg  [AXI_PROT_W -1:0] axi_prot  ;
109
reg                    axi_valid ;
110
reg                    wr_req    ;
111
reg  [AXI_ID_W   -1:0] axi_wid   ;
112
reg  [AXI_DATA_W -1:0] axi_wdata ;
113
reg  [AXI_STB_W  -1:0] axi_wstrb ;
114
reg                    axi_wlast ;
115
reg                    axi_wvalid;
116
 
117
reg  [AXI_ADDR_W-1:0] start_addr;
118
reg  [AXI_ADDR_W-1:0] end_addr;
119
reg  [7:0]            num_pkt;
120
 
121
initial begin
122
  if ($value$plusargs("start_addr=%d", start_addr ))
123
    $display("****** start_addr=0x%0x", start_addr);
124
  else
125
    start_addr = 32'h10_0000;
126
  if ($value$plusargs("end_addr=%d", end_addr ))
127
    $display("****** end_addr=0x%0x", end_addr);
128
  else
129
    end_addr = 32'h1F_0000;
130
  if ($value$plusargs("num_pkt=%d", num_pkt))
131
    $display("****** num_pkt=%0d", num_pkt);
132
  else
133
    num_pkt = 3;
134
end
135
parameter AXI_IDLE = 3'b000;
136
parameter AXI_ADDR = 3'b001;
137
parameter AXI_DATA = 3'b010;
138
parameter AXI_WAIT_DATA = 3'b111;
139
parameter AXI_CFG  = 3'b011;
140
parameter AXI_UPD  = 3'b100;
141
reg [7:0]  pkt_count;
142
reg [4:0]  txn_count;
143
reg [1:0] axi_cs;
144
reg [1:0] axi_ns;
145
 
146
always @(posedge axi_clk or negedge axi_resetn)
147
  if (~axi_resetn) begin
148
    axi_cs <= AXI_IDLE;
149
  end else begin
150
    axi_cs <= axi_ns;
151
  end
152
 
153
always @(posedge axi_clk or negedge axi_resetn)
154
  if (~axi_resetn) begin
155
    pkt_count <= 0;
156
    txn_count <= 0;
157
  end else begin
158
    case (axi_cs)
159
      AXI_IDLE  : begin
160
        axi_id     <= 0;
161
        axi_addr   <= 0;
162
        axi_len    <= 0;
163
        axi_size   <= 0;
164
        axi_burst  <= 0;
165
        axi_lock   <= 0;
166
        axi_cache  <= 0;
167
        axi_prot   <= 0;
168
        axi_valid  <= 0;
169
        wr_req     <= 0;
170
        axi_wid    <= 0;
171
        axi_wdata  <= 0;
172
        axi_wstrb  <= 0;
173
        axi_wlast  <= 0;
174
        axi_wvalid <= 0;
175
 
176
      end
177
      AXI_CFG : begin
178
        pkt_count <= num_pkt;
179
      end
180
      AXI_ADDR : begin
181
        axi_id     <= 1;
182
        axi_addr   <= start_addr + 32'h20;
183
        axi_len    <= 4'hF;
184
        axi_size   <= 3'b010;
185
        axi_burst  <= 0;
186
        axi_lock   <= 0;
187
        axi_cache  <= 0;
188
        axi_prot   <= 0;
189
        axi_valid  <= 1;
190
        wr_req     <= 1;
191
        txn_count  <= 5'b10000;
192
      end
193
      AXI_DATA: begin
194
        txn_count <= txn_count >0 ? txn_count - 1 : txn_count;
195
        axi_valid <= 0;
196
        axi_wid   <= 2;
197
        axi_wdata <= $random;
198
        axi_wstrb <= 4'hF;
199
        axi_wlast <= txn_count==0 ? 1 : 0;
200
        axi_wvalid<= 1'b1;
201
      end
202
      AXI_WAIT_DATA : begin
203
        axi_wvalid<= 1'b0;
204
      end
205
      AXI_UPD : begin
206
        pkt_count <= pkt_count >0 ? pkt_count -1 : pkt_count;
207
        axi_wvalid<= 1'b0;
208
      end
209
    endcase
210
  end
211
 
212
always @(*) begin
213
  axi_ns = axi_cs;
214
 
215
  case (axi_cs)
216
    AXI_IDLE : begin
217
      axi_ns = AXI_CFG;
218
    end
219
    AXI_CFG : begin
220
      if (pkt_count >0 & AWREADY)
221
         axi_ns = AXI_ADDR;
222
      else
223
         axi_ns = AXI_CFG;
224
    end
225
    AXI_ADDR : begin
226
      axi_ns = AXI_DATA;
227
    end
228
    AXI_DATA: begin
229
      if (WREADY & txn_count>0)
230
        axi_ns = AXI_DATA;
231
      else if (txn_count==0)
232
        axi_ns = AXI_UPD;
233
      else
234
        axi_ns = AXI_WAIT_DATA;
235
    end
236
    AXI_WAIT_DATA: begin
237
      if (WREADY)
238
        axi_ns = AXI_DATA;
239
      else
240
        axi_ns = AXI_WAIT_DATA;
241
    end
242
    AXI_UPD: begin
243
      if (pkt_count >0)
244
        axi_ns = AXI_ADDR;
245
      else
246
        axi_ns = AXI_UPD;
247
    end
248
  endcase
249
end
250
 
251
assign AWID    = wr_req ?axi_id     : 'hx;
252
assign AWADDR  = wr_req ?axi_addr   : 'hx;
253
assign AWLEN   = wr_req ?axi_len    : 'hx;
254
assign AWSIZE  = wr_req ?axi_size   : 'hx;
255
assign AWBURST = wr_req ?axi_burst  : 'hx;
256
assign AWLOCK  = wr_req ?axi_lock   : 'hx;
257
assign AWCACHE = wr_req ?axi_cache  : 'hx;
258
assign AWPROT  = wr_req ?axi_prot   : 'hx;
259
assign AWVALID = wr_req ?axi_valid  : 1'b0;
260
assign WID     = wr_req ?axi_wid    : 'hx;
261
assign WDATA   = wr_req ?axi_wdata  : 'hx;
262
assign WSTRB   = wr_req ?axi_wstrb  : 'hx;
263
assign WLAST   = wr_req ?axi_wlast  : 'hx;
264
assign WVALID  = wr_req ?axi_valid  : 1'b0;
265
 
266
assign BREADY  = 1'b1;
267
  //Read control channel signals
268
assign ARID    = wr_req ? 'hx : axi_id   ;
269
assign ARADDR  = wr_req ? 'hx : axi_addr ;
270
assign ARLEN   = wr_req ? 'hx : axi_len  ;
271
assign ARSIZE  = wr_req ? 'hx : axi_size ;
272
assign ARBURST = wr_req ? 'hx : axi_burst;
273
assign ARLOCK  = wr_req ? 'hx : axi_lock ;
274
assign ARCACHE = wr_req ? 'hx : axi_cache;
275
assign ARPROT  = wr_req ? 'hx : axi_prot ;
276
assign ARVALID = wr_req ? 1'b0: axi_valid;
277
  //Read data channel signals
278
assign RREADY = 1'b1;
279
 
280
 
281
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.