pluto_hdl_adi/library/axi_ad3552r/axi_ad3552r_if_tb.v

240 lines
6.5 KiB
Verilog
Executable File

// ***************************************************************************
// ***************************************************************************
// Copyright (C) 2022-2023 Analog Devices, Inc. All rights reserved.
//
// In this HDL repository, there are many different and unique modules, consisting
// of various HDL (Verilog or VHDL) components. The individual modules are
// developed independently, and may be accompanied by separate and unique license
// terms.
//
// The user should read each of these license terms, and understand the
// freedoms and responsibilities that he or she has by using this source/core.
//
// This core is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
// A PARTICULAR PURPOSE.
//
// Redistribution and use of source or resulting binaries, with or without modification
// of this file, are permitted under one of the following two license terms:
//
// 1. The GNU General Public License version 2 as published by the
// Free Software Foundation, which can be found in the top level directory
// of this repository (LICENSE_GPL2), and also online at:
// <https://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
//
// OR
//
// 2. An ADI specific BSD license, which can be found in the top level directory
// of this repository (LICENSE_ADIBSD), and also on-line at:
// https://github.com/analogdevicesinc/hdl/blob/master/LICENSE_ADIBSD
// This will allow to generate bit files and not release the source code,
// as long as it attaches to an ADI device.
//
// ***************************************************************************
// ***************************************************************************
`timescale 1ns/100ps
module axi_ad3552r_if_tb;
parameter VCD_FILE = "axi_ad3552r_if_tb.vcd";
`define TIMEOUT 9000
`include "../common/tb/tb_base.v"
wire [ 23:0] data_read;
wire dac_sclk;
wire dac_csn;
wire dac_data_ready;
wire [ 3:0] sdio_i;
wire [ 3:0] sdio_o;
wire sdio_t;
wire [31:0] dac_data_final;
wire [ 3:0] readback_data_shift;
wire [ 4:0] data_increment_valid;
wire if_busy;
reg [ 7:0] address_write = 8'b0;
reg dac_clk = 1'b0;
reg reset_in = 1'b1;
reg transfer_data = 1'b0;
reg sdr_ddr_n = 1'b1;
reg reg_8b_16bn = 1'b0;
reg stream = 1'b0;
reg [23:0] data_write = 24'h0;
reg dac_data_valid = 1'b0;
reg [ 3:0] shift_count = 4'b0;
reg [31:0] transfer_reg = 32'h89abcdef;
reg [ 4:0] valid_counter = 5'b0;
reg [31:0] dac_data = 32'b0;
always #4 dac_clk <= ~dac_clk;
initial begin
#100 reset_in = 1'b0;
// Write 8 bit SDR
address_write = 8'h2c;
data_write = 24'hab0000;
sdr_ddr_n = 1'b1;
reg_8b_16bn = 1'b1;
stream = 1'b0;
#500 transfer_data = 1'b1;
#100 transfer_data = 1'b0;
// Read 8 bit SDR
address_write = 8'hac;
data_write = 24'h000000;
sdr_ddr_n = 1'b1;
reg_8b_16bn = 1'b1;
stream = 1'b0;
#500 transfer_data = 1'b1;
#100 transfer_data = 1'b0;
// Write 16 bit SDR
address_write = 8'h2c;
data_write = 24'h123400;
sdr_ddr_n = 1'b1;
reg_8b_16bn = 1'b0;
stream = 1'b0;
#500 transfer_data = 1'b1;
#100 transfer_data = 1'b0;
// Read 16 bit SDR
address_write = 8'hac;
data_write = 24'h000000;
sdr_ddr_n = 1'b1;
reg_8b_16bn = 1'b0;
stream = 1'b0;
#500 transfer_data = 1'b1;
#100 transfer_data = 1'b0;
#500;
// Write 8 bit DDR
address_write = 8'h2c;
data_write = 24'h120000;
sdr_ddr_n = 1'b0;
reg_8b_16bn = 1'b1;
stream = 1'b0;
#500 transfer_data = 1'b1;
#100 transfer_data = 1'b0;
// Read 8 bit DDR
address_write = 8'hac;
data_write = 24'h000000;
sdr_ddr_n = 1'b0;
reg_8b_16bn = 1'b1;
stream = 1'b0;
#500 transfer_data = 1'b1;
#100 transfer_data = 1'b0;
// Write 16 bit DDR
address_write = 8'h2c;
data_write = 24'h123400;
sdr_ddr_n = 1'b0;
reg_8b_16bn = 1'b0;
stream = 1'b0;
transfer_data = 1'b1;
#100 transfer_data = 1'b0;
// Read 16 bit DDR
address_write = 8'hac;
data_write = 24'h000000;
sdr_ddr_n = 1'b0;
reg_8b_16bn = 1'b0;
stream = 1'b0;
#500 transfer_data = 1'b1;
#100 transfer_data = 1'b0;
#500;
// Stream SDR
address_write = 8'h2c;
sdr_ddr_n = 1'b1;
reg_8b_16bn = 1'b0;
stream = 1'b1;
transfer_data = 1'b1;
#100 transfer_data = 1'b0;
#1000 stream = 1'b0;
#500;
// Stream DDR
address_write = 8'h2c;
reg_8b_16bn = 1'b1;
sdr_ddr_n = 1'b0;
stream = 1'b1;
transfer_data = 1'b1;
#100 transfer_data = 1'b0;
#1000 stream = 1'b0;
end
// data is incremented at each complete cycle
assign dac_data_final = (stream == 1'b1) ? dac_data : data_write;
assign data_increment_valid = (sdr_ddr_n ) ? 5'd16: 5'h8;
always @(posedge dac_clk) begin
if (valid_counter == data_increment_valid) begin
dac_data <= dac_data + 32'h00010002;
valid_counter <= 3'b0;
dac_data_valid <= 1'b1;
end else begin
dac_data <= dac_data;
valid_counter <= valid_counter + 3'b1;
dac_data_valid <= 1'b0;
end
end
// data is circullary shifted at every sampling edge
assign readback_data_shift = (sdr_ddr_n ) ? 4'h8 : 4'h4;
assign sdio_i = (sdio_t === 1'b1) ? transfer_reg[31:28] : 4'b0;
always @(posedge dac_clk) begin
if (shift_count == readback_data_shift) begin
transfer_reg <= {transfer_reg[27:0],transfer_reg[31:28]};
end else if (sdio_t === 1'b1) begin
transfer_reg <= transfer_reg;
end
if (shift_count == readback_data_shift || dac_csn == 1'b1) begin
shift_count <= 3'b0;
end else if (sdio_t === 1'b1) begin
shift_count <= shift_count + 3'b1;
end
end
axi_ad3552r_if axi_ad3552r_interface (
.clk_in(dac_clk),
.reset_in(reset_in),
.dac_data(dac_data_final),
.dac_data_valid(dac_data_valid),
.address(address_write),
.data_read(data_read),
.data_write(data_write),
.sdr_ddr_n(sdr_ddr_n),
.symb_8_16b(reg_8b_16bn),
.transfer_data(transfer_data),
.stream(stream),
.dac_data_ready(dac_data_ready),
.if_busy(if_busy),
.sclk(dac_sclk),
.csn(dac_csn),
.sdio_i(sdio_i),
.sdio_o(sdio_o),
.sdio_t(sdio_t));
endmodule