// date; time iverilog -y $BLUESPECDIR/Verilog -o amba_tb mkDMAC.v amba_tb.v; amba_tb // // 0.040u 0.000s 0:00.03 133.3% 0+0k 0+0io 1635pf+0w // Start of Test // Reset complete // write and read slave // 164: hrdata= 00000000 // // 220: hrdata= 22225678 // // 236: hrdata= 11115678 // // 252: hrdata= 22225678 // // End of Test module amba_tb(); integer test_in_progress; integer i; integer loopi; integer cnt; integer transfer_cnt; reg [8*20:1] str; // dut signals reg CLK; reg RST_N; reg s_hsel; reg [31 : 0] s_haddr; reg s_hwrite; reg [31 : 0] s_hwdata; wire [31 : 0] m_hrdata; reg s_hready_in; // reg EN_s_write_data; reg m_hgrant; // reg m_hready; wire [15 : 0] m_src_rdy; wire [15 : 0] m_dest_rdy; // wire RDY_s_hready_in; // wire RDY_s_write_data; wire s_hready_out; wire RDY_s_hready_out; wire [31 : 0] s_hrdata; wire RDY_s_hrdata; wire [1 : 0] s_hresp; wire RDY_s_hresp; wire m_hbusreq; wire RDY_m_hready; wire [31 : 0] m_hwdata; wire RDY_m_hwdata; wire [31 : 0] m_haddr; wire RDY_m_haddr; wire m_hwrite; wire RDY_m_hwrite; wire RDY_m_src_rdy; wire RDY_m_dest_rdy; wire [15 : 0] src_ack; wire RDY_src_ack; wire [15 : 0] dest_ack; wire RDY_dest_ack; wire interrupt; reg EN_m_hresp; wire RDY_m_hresp; reg [3:0] src_sel; reg [3:0] dest_sel; //reg [1:0] m_hresp_code; wire [1:0] m_htrans; wire [31:0] haddr; wire [31:0] hrdata; wire [31:0] hrdata0; wire [31:0] hrdata1; wire [31:0] hrdata2; wire [31:0] hrdata3; wire [31:0] hrdatadefault; wire hready; wire m_hready; wire [1:0] m_hresp; wire [1:0] hresp; wire [1:0] hresp0; wire [1:0] hresp1; wire [1:0] hresp2; wire [1:0] hresp3; wire [1:0] hrespdefault; wire [1:0] htrans; wire hwrite; wire [31:0] hwdata; assign haddr = m_haddr; assign m_hrdata = hrdata; assign m_hready = hready; assign m_hresp = hresp; assign hwrite = m_hwrite; assign htrans = m_htrans; assign hwdata = m_hwdata; reg rx_write2; reg [31:0] rx_d2; reg tx_read2; wire [31:0] tx_d2; reg rx_write3; reg [31:0] rx_d3; reg tx_read3; wire [31:0] tx_d3; reg [31:0] expect_value; integer rx2_speed; integer tx2_speed; integer rx3_speed; integer tx3_speed; integer offset; // -------------------------------- task write_to_slave; input [31:0] addr; input [31:0] data; begin // $display("%t: write addr=0x%x data=0x%x",$time,addr,data); s_hready_in<= 1; s_hsel <= 1; s_haddr <= addr; s_hwrite <= 1; @(posedge CLK); s_hwdata <= data; s_hsel <= 0; s_haddr <= 0; s_hwrite <= 0; @(posedge CLK); end endtask task read_from_slave; input [31:0] addr; begin s_hready_in<= 1; s_hsel <= 1; s_haddr <= addr; s_hwrite <= 0; @(posedge CLK); @(posedge CLK); // $display("%t: read addr=0x%x data=0x%x",$time,addr,s_hrdata); end endtask task fillmem; input [31:0] daddr; input [31:0] value; input [31:0] transfer_cnt; input [8*20:1] istr; // input [4:0] dsel; // assume ram for now // input [9:0] dstep; // assume 4 for now begin str = istr; $display ("%t: %s", $time,str); write_to_slave(9, 32'h1); // fill constant write_to_slave(0, 32'h0000_0000); // +1000*cnt); // src_addr write_to_slave(1, daddr); // +2000*cnt); // dest_addr write_to_slave(3, 32'h0000_000f); // interrupt Enable/Mask 1=enabled 0=masked write_to_slave(4, 32'h0); // interrupt clear write_to_slave(5, 32'h0); // interrupt status // write_to_slave(7, {14'h0,d_sel[4:0],2'b0,10'h4}); // dest config {[31:16],sel[15:12],[11:10],step[9:0]} write_to_slave(7, {14'h0,5'h0,2'b0,10'h4}); // dest config {[31:16],sel[15:12],[11:10],step[9:0]} write_to_slave(10, value); write_to_slave(2, transfer_cnt); // set transfer_cnt read_from_slave(5); @(posedge interrupt); @(posedge CLK); read_from_slave(5); if (s_hrdata!==32'h1) begin $display("int_vector=0x%x, expected=0x%x",s_hrdata,32'h0000_0001); end end endtask task mem2mem; input [4:0] ssel; input [31:0] saddr; input [9:0] sstep; input [4:0] dsel; input [31:0] daddr; input [9:0] dstep; input [31:0] transfer_cnt; input [8*20:1] istr; begin str = istr; $display ("%t: %s", $time,str); // Initial Source RAM, X out Dest RAM for (i=0;i<1024;i=i+1) begin case (dsel) 0: u_ram0.u_ram.mem[i] = 32'hx; 1: u_ram1.u_ram.mem[i] = 32'hx; endcase case (ssel) 0: u_ram0.u_ram.mem[i] = 32'h4321_0000+i; 1: u_ram1.u_ram.mem[i] = 32'h4321_0000+i; endcase end if (ssel==5'h12) write_to_slave(9, 32'h0000_0100); // else begin write_to_slave(9, 32'h0000_0000); // fill increment starting with h1234_0000 end write_to_slave(0, saddr); // +1000*cnt); // src_addr write_to_slave(1, daddr); // +2000*cnt); // dest_addr write_to_slave(3, 32'h0000_000f); // interrupt Enable/Mask 1=enabled 0=masked write_to_slave(4, 32'h0); // interrupt clear write_to_slave(5, 32'h0); // interrupt status write_to_slave(6, {15'h0,ssel[4:0],2'b0,sstep}); // src config {[31:16],sel[15:12],[11:10],step[9:0]} write_to_slave(7, {15'h0,dsel[4:0],2'b0,dstep}); // dest config {[31:16],sel[15:12],[11:10],step[9:0]} write_to_slave(2, transfer_cnt); // set transfer_cnt read_from_slave(5); // rx_d2 <= 32'ha987_0000; @(posedge CLK); if (ssel==5'h12) begin rx2_speed = 15; tx2_speed = 15; end @(posedge interrupt); @(posedge CLK); rx2_speed = 0; tx2_speed = 0; // Verify Interrupt vector indicates Transfer Done read_from_slave(5); if (s_hrdata!==32'h1) begin $display("int_vector=0x%x, expected=0x%x",s_hrdata,32'h0000_0001); end expect_value = (ssel<2) ? 32'h4321_0000 : 32'h0000_0000+offset; // Verify Written Contents of Destination RAM for (i=0;i