blob: 8e0418efdf9c5307ab71840dbd6908dfab2245cc [file] [log] [blame]
`default_nettype none
`timescale 1 ns / 1 ps
`include "caravel.v"
`include "spiflash.v"
module pyfive_top_tb;
reg clock;
reg clk_samp;
reg RSTB;
reg power1, power2;
wire gpio;
wire [37:0] mprj_io;
wire [15:0] checkbits;
assign checkbits = mprj_io[31:16];
always #10.416 clock <= (clock === 1'b0);
always #3.247 clk_samp <= (clk_samp == 1'b0);
initial begin
clock = 0;
clk_samp = 0;
end
initial begin
$dumpfile("pyfive_top_tb.vcd");
$dumpvars(0, pyfive_top_tb);
// // Repeat cycles of 1000 clock edges as needed to complete testbench
// repeat (150) begin
// repeat (1000) @(posedge clock);
// // $display("+1000 cycles");
// end
// $display("%c[1;31m",27);
// $display ("Monitor: Timeout, Test Mega-Project IO (RTL) Failed");
// $display("%c[0m",27);
// $finish;
end
initial begin
wait(checkbits == 16'h AB60);
$display("Monitor: Test 2 MPRJ-Logic Analyzer Started");
wait(checkbits == 16'h AB61);
$display("Monitor: Test 2 MPRJ-Logic Analyzer Passed");
$finish;
end
initial begin
RSTB <= 1'b0;
#1000;
RSTB <= 1'b1; // Release reset
#2000;
end
initial begin // Power-up sequence
power1 <= 1'b0;
power2 <= 1'b0;
#200;
power1 <= 1'b1;
#200;
power2 <= 1'b1;
end
wire flash_csb;
wire flash_clk;
wire flash_io0;
wire flash_io1;
wire VDD1V8;
wire VDD3V3;
wire VSS;
assign VDD3V3 = power1;
assign VDD1V8 = power2;
assign VSS = 1'b0;
caravel uut (
.vddio (VDD3V3),
.vssio (VSS),
.vdda (VDD3V3),
.vssa (VSS),
.vccd (VDD1V8),
.vssd (VSS),
.vdda1 (VDD3V3),
.vdda2 (VDD3V3),
.vssa1 (VSS),
.vssa2 (VSS),
.vccd1 (VDD1V8),
.vccd2 (VDD1V8),
.vssd1 (VSS),
.vssd2 (VSS),
.clock (clock),
.gpio (gpio),
.mprj_io (mprj_io),
.flash_csb(flash_csb),
.flash_clk(flash_clk),
.flash_io0(flash_io0),
.flash_io1(flash_io1),
.resetb (RSTB)
);
spiflash #(
.FILENAME("pyfive_top.hex")
) spiflash (
.csb(flash_csb),
.clk(flash_clk),
.io0(flash_io0),
.io1(flash_io1),
.io2(),
.io3()
);
// MIDI loopback
reg midi_del;
always #10 midi_del <= mprj_io[15];
assign mprj_io[16] = midi_del;
// Read file
wire usb_pu;
wire usb_dp;
wire usb_dn;
assign usb_pu = mprj_io[13];
assign mprj_io[12] = usb_dp;
assign mprj_io[11] = usb_dn;
reg [7:0] in_file_data;
reg in_file_valid;
reg in_file_done;
integer fh_in, rv;
initial
fh_in = $fopen("capture_usb_raw_short.dat", "rb");
always @(posedge clk_samp)
begin
if (RSTB) begin
if (usb_pu === 1'bz) begin
in_file_data <= 8'h00;
in_file_valid <= 1'b0;
in_file_done <= 1'b0;
end else begin
if (!in_file_done) begin
rv = $fread(in_file_data, fh_in);
in_file_valid <= (rv == 1);
in_file_done <= (rv != 1);
end else begin
in_file_data <= 8'h00;
in_file_valid <= 1'b0;
in_file_done <= 1'b1;
$finish;
end
end
end
end
// Input
assign usb_dp = (uut.mprj.mprj.io_oeb[1] == 1'b1) ? (in_file_valid ? in_file_data[1] : 1'b0) : 1'bz;
assign usb_dn = (uut.mprj.mprj.io_oeb[0] == 1'b1) ? (in_file_valid ? in_file_data[0] : 1'b0) : 1'bz;
endmodule
`default_nettype wire