2 Copyright (c) 2013, IIT Madras
5 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
7 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
8 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
9 * Neither the name of IIT Madras nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
11 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
12 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
14 package tb_bsv_wrapper;
16 import Semi_FIFOF :: *;
17 import AXI4_Types :: *;
18 import AXI4_Fabric :: *;
19 import bsvmksdram_model_wrapper :: *;
20 import Connectable :: *;
21 `include "defined_parameters.bsv"
25 interface Ifc_tb_sdram_in;
27 method Action iAddr(Bit#(11) addr);
28 method Action iBa(Bit#(2) ba);
29 method Action iCke(bit cke);
30 method Action iClk(bit clk);
31 method Action iCs_n(bit cs_n);
32 method Action iRas_n(bit ras_n);
33 method Action iCas_n(bit cas_n);
34 method Action iWe_n(bit we_n);
35 method Action iDqm(Bit#(8) dqm);
39 interface Ifc_tb_bsv_wrapper;
40 interface AXI4_Master_IFC#(`PADDR, `Reg_width, `USERSPACE) axi4_sdram;
41 interface AXI4_Master_IFC#(`PADDR, `Reg_width, `USERSPACE) axi4_cntrl_reg;
42 interface Ifc_tb_sdram_in ifc_tb_sdram_in;
43 interface Inout#(Bit#(32)) dq_0 ;
44 interface Inout#(Bit#(32)) dq_1;
48 module mktb_bsv_wrapper(Ifc_tb_bsv_wrapper);
50 Reg#(Bit#(9)) rg_burst_count <- mkReg(0);
51 Reg#(bit) rg_tb_app_req <- mkReg(0);
52 Reg#(bit) rg_tb_app_wr_n <- mkRegU();
53 Reg#(Bit#(64)) rg_tb_app_req_addr <- mkReg(0);
54 Reg#(Bit#(8)) rg_tb_app_req_len <- mkReg(0);
55 Reg#(Bit#(64)) rg_tb_wr_data <- mkReg(0);
56 Reg#(Bit#(8)) rg_tb_wr_en_n <- mkReg(0);
57 Reg#(Bit#(64)) rg_tb_rd_data <- mkReg(0);
58 Reg#(Bit#(5)) rg_state_cnt <- mkReg(0);
59 Reg#(Bit#(64)) rg_tb_app_rd_addr <- mkReg(0);
60 Reg#(Bit#(8)) rg_tb_app_rd_len <- mkReg(0);
61 Reg#(Bit#(16)) rg_delay_count <- mkReg(0);
62 Reg#(bit) rg_ff <- mkReg(0);
63 Reg#(Bit#(2)) rg_bmode <- mkReg(0);
65 Reg#(Bit#(64)) rg_tb_cntrl_addr <- mkReg(0);
66 Reg#(Bit#(64)) rg_tb_cntrl_data <- mkReg(4);
68 AXI4_Master_Xactor_IFC #(`PADDR,`Reg_width,`USERSPACE) m_xactor_sdram <- mkAXI4_Master_Xactor;
69 AXI4_Master_Xactor_IFC #(`PADDR,`Reg_width,`USERSPACE) m_xactor_cntrl_reg <- mkAXI4_Master_Xactor;
71 Ifc_sdram_model sdram_model_0 <- mksdram_model_wrapper;
72 Ifc_sdram_model sdram_model_1 <- mksdram_model_wrapper;
74 function Action burst_write(Bit#(64) address, Bit#(8) bl);
79 rg_tb_app_req_addr <= address;
80 rg_tb_app_req_len <= bl;
82 // for(Integer i = 0;i <= bl; i++) begin
83 rg_tb_wr_en_n <= 8'hFF;
88 function Action data_change(bit ff);
92 rg_tb_wr_data <= 64'hDEADBEEFBABECAFE;
94 rg_tb_wr_data <= 64'hBABECAFEDEADBEEF;
102 function Action burst_read(Bit#(64) address, Bit#(8) bl);
107 rg_tb_app_rd_addr <= address;
108 rg_tb_app_rd_len <= bl;
113 function Action fn_send_cntrl_reg(Bit#(9) count);
117 rg_tb_cntrl_addr <= 64'h00;
118 rg_tb_cntrl_data <= 64'h4;
121 rg_tb_cntrl_addr <= 64'h08;
122 rg_tb_cntrl_data <= 64'h4;
125 rg_tb_cntrl_addr <= 64'h10;
126 rg_tb_cntrl_data <= 64'h2;
129 rg_tb_cntrl_addr <= 64'h18;
130 rg_tb_cntrl_data <= 64'h1;
133 rg_tb_cntrl_addr <= 64'h20;
134 rg_tb_cntrl_data <= 64'h3;
137 rg_tb_cntrl_addr <= 64'h28;
138 rg_tb_cntrl_data <= 64'h32;
141 rg_tb_cntrl_addr <= 64'h30;
142 rg_tb_cntrl_data <= 64'h3;
145 rg_tb_cntrl_addr <= 64'h38;
146 rg_tb_cntrl_data <= 64'h7;
149 rg_tb_cntrl_addr <= 64'h40;
150 rg_tb_cntrl_data <= 64'h1;
153 rg_tb_cntrl_addr <= 64'h48;
154 rg_tb_cntrl_data <= 64'h100;
157 rg_tb_cntrl_addr <= 64'h50;
158 rg_tb_cntrl_data <= 64'h6;
165 rule rl_delay(rg_ff == 0 && rg_state_cnt == 0);
166 if(rg_burst_count == 300)
169 rg_burst_count <= rg_burst_count + 1;
171 if(rg_burst_count <= 10) begin
172 if(rg_burst_count == 0) begin
173 let aw = AXI4_Wr_Addr {awaddr: rg_tb_cntrl_addr, awprot:0, awuser:0, awlen: 10, awsize: 3, awburst: 'b01};
174 m_xactor_cntrl_reg.i_wr_addr.enq(aw);
177 let w = AXI4_Wr_Data {wdata: rg_tb_cntrl_data, wstrb: 8'h11, wlast: (rg_burst_count == 10)};
178 m_xactor_cntrl_reg.i_wr_data.enq(w);
179 fn_send_cntrl_reg(rg_burst_count + 1);
180 $display("%d: Sending Control register info",$stime());
184 rule rl_response_from_cntrl_reg;
185 let resp <- pop_o(m_xactor_cntrl_reg.o_wr_resp);
186 $display("%d: Response from control reg bus %d",$stime(),(resp.bresp == AXI4_OKAY)? 1:0);
191 rule rl_write_request(rg_state_cnt == 0 && rg_ff == 1);
192 burst_write({32'b0,{8'd0,11'h0,2'b00,8'd0,3'b0}}, 8'd255);
193 rg_state_cnt <= rg_state_cnt + 1;
197 rule rl_read_request_gen(rg_state_cnt == 15);
198 burst_read({32'b0,{8'd0,11'd0,2'b00,8'hA,3'b000}}, 8'd7);
199 rg_state_cnt <= rg_state_cnt + 1;
204 rule rl_iapp_req_ack_connection(rg_state_cnt == 2 || rg_state_cnt == 5 || rg_state_cnt == 8 || rg_state_cnt == 11 || rg_state_cnt == 14 || rg_state_cnt == 27);
205 let resp <- pop_o(m_xactor_sdram.o_wr_resp);
206 $display("%d: Response from write bus %d",$stime(),(resp.bresp == AXI4_OKAY)? 1:0);
207 rg_state_cnt <= rg_state_cnt + 1;
209 // tb_core.iapp_req_ack((resp.bresp == AXI4_OKAY)? 1:0 );
212 rule rl_oapp_wr_data(rg_state_cnt == 1 || rg_state_cnt == 4 || rg_state_cnt == 7 || rg_state_cnt == 10 || rg_state_cnt == 13 || rg_state_cnt == 26);
213 if(rg_tb_app_req_len == 0) begin
214 let aw = AXI4_Wr_Addr {awaddr: rg_tb_app_req_addr, awprot:0, awuser:0, awlen: extend(rg_tb_app_req_len), awsize: 2, awburst: 'b01};
215 let w = AXI4_Wr_Data {wdata: 64'hDEADBEEFBABECAFE, wstrb: rg_tb_wr_en_n, wlast: True};
216 m_xactor_sdram.i_wr_addr.enq(aw);
217 m_xactor_sdram.i_wr_data.enq(w);
218 $display("%d: Sending write request",$stime());
221 if(rg_burst_count == 0) begin
222 let aw = AXI4_Wr_Addr {awaddr: rg_tb_app_req_addr, awprot:0, awuser: 0, awlen: extend(rg_tb_app_req_len), awsize: 2, awburst: 'b01};
223 let w = AXI4_Wr_Data {wdata: 64'hDEADBEEFBABECAFE, wstrb: rg_tb_wr_en_n, wlast: False};
225 rg_burst_count <= rg_burst_count + 1;
226 m_xactor_sdram.i_wr_addr.enq(aw);
227 m_xactor_sdram.i_wr_data.enq(w);
230 else if(rg_burst_count <= extend(rg_tb_app_req_len) && rg_burst_count != 0) begin
231 let w = AXI4_Wr_Data {wdata: rg_tb_wr_data, wstrb: rg_tb_wr_en_n, wlast: (rg_burst_count == extend(rg_tb_app_req_len))};
232 rg_burst_count <= rg_burst_count + 1;
233 $display("%d: Sending write data %x rg_ff %b",$stime(),rg_tb_wr_data, rg_ff);
235 m_xactor_sdram.i_wr_data.enq(w);
236 //tb_core.iapp_last_wr(pack(rg_burst_count == tb_core.oapp_req_len));
240 rg_state_cnt <= rg_state_cnt + 1;
245 rule rl_next_write(rg_state_cnt == 3);
246 burst_write({32'b0,{8'd0,11'd1500,2'b01,8'd56,3'b0}}, 8'd246);
247 rg_state_cnt <= rg_state_cnt + 1;
251 rule rl_next_write1(rg_state_cnt == 6);
252 burst_write({32'b0,{8'd0,11'd2010,2'b01,8'd25,3'b0}}, 8'd7);
253 rg_state_cnt <= rg_state_cnt + 1;
257 rule rl_next_write2(rg_state_cnt == 9);
258 burst_write({32'b0,{8'd0,11'd1600,2'b10,8'd55,3'b0}}, 8'd4);
259 rg_state_cnt <= rg_state_cnt + 1;
263 rule rl_next_write3(rg_state_cnt == 12);
264 burst_write({32'b0,{8'd0,11'h8,2'b0,8'd5,3'b0}}, 8'd3);
265 rg_state_cnt <= rg_state_cnt + 1;
269 rule rl_next_write4(rg_state_cnt == 20);
270 burst_write({32'b0,{8'd0,11'h8,2'b01,8'd255,3'b0}}, 8'd2);
271 rg_state_cnt <= rg_state_cnt + 1;
275 rule rl_read_request(rg_state_cnt == 16 || rg_state_cnt == 19);
276 let read_request = AXI4_Rd_Addr {araddr: rg_tb_app_rd_addr, arprot: 0, aruser: 0, arlen: extend(rg_tb_app_rd_len), arsize: 3, arburst: rg_bmode}; // arburst: 00-FIXED 01-INCR 10-WRAP
277 m_xactor_sdram.i_rd_addr.enq(read_request);
278 $display("%d: Sending read request",$stime());
279 rg_state_cnt <= rg_state_cnt + 1;
282 rule rl_read_response(rg_state_cnt == 17 || rg_state_cnt == 20);
283 if(rg_burst_count == 300) begin
284 let response <- pop_o(m_xactor_sdram.o_rd_data);
285 rg_tb_rd_data <= response.rdata;
286 $display("%d: Read data %x",$stime(),response.rdata);
287 rg_tb_app_rd_len <= rg_tb_app_rd_len - 1;
288 if(rg_tb_app_rd_len == 0)
289 rg_state_cnt <= rg_state_cnt + 1;
291 else rg_burst_count <= rg_burst_count + 1;
294 rule rl_read_request_gen1(rg_state_cnt == 18);
295 burst_read({32'b0,{8'd0,11'd0,2'b00,8'hA,3'b000}}, 8'd3);
297 rg_state_cnt <= rg_state_cnt + 1;
303 interface dq_0 = sdram_model_0.dq;
304 interface dq_1 = sdram_model_1.dq;
306 interface Ifc_tb_sdram_in ifc_tb_sdram_in;
308 // interface Inout#(Bit#(32)) dq = tb_core.sdr_dq;
310 method Action iAddr(Bit#(11) addr);
311 sdram_model_0.iAddr(addr);
312 sdram_model_1.iAddr(addr);
315 method Action iBa(Bit#(2) ba);
316 sdram_model_0.iBa(ba);
317 sdram_model_1.iBa(ba);
320 method Action iCke(bit cke);
321 sdram_model_0.iCke(cke);
322 sdram_model_1.iCke(cke);
325 method Action iClk(bit clk);
326 sdram_model_0.iClk(clk);
327 sdram_model_1.iClk(clk);
330 method Action iCs_n(bit cs_n);
331 sdram_model_0.iCs_n(cs_n);
332 sdram_model_1.iCs_n(cs_n);
335 method Action iRas_n(bit ras_n);
336 sdram_model_0.iRas_n(ras_n);
337 sdram_model_1.iRas_n(ras_n);
340 method Action iCas_n(bit cas_n);
341 sdram_model_0.iCas_n(cas_n);
342 sdram_model_1.iCas_n(cas_n);
345 method Action iWe_n(bit we_n);
346 sdram_model_0.iWe_n(we_n);
347 sdram_model_1.iWe_n(we_n);
350 method Action iDqm(Bit#(8) dqm);
351 sdram_model_0.iDqm(dqm[3:0]);
352 sdram_model_1.iDqm(dqm[7:4]);
357 interface axi4_sdram = m_xactor_sdram.axi_side;
358 interface axi4_cntrl_reg = m_xactor_cntrl_reg.axi_side;