diff options
Diffstat (limited to 'opencores/uart16550/bench/verilog/uart_test.v')
-rw-r--r-- | opencores/uart16550/bench/verilog/uart_test.v | 339 |
1 files changed, 339 insertions, 0 deletions
diff --git a/opencores/uart16550/bench/verilog/uart_test.v b/opencores/uart16550/bench/verilog/uart_test.v new file mode 100644 index 000000000..5d61949ba --- /dev/null +++ b/opencores/uart16550/bench/verilog/uart_test.v @@ -0,0 +1,339 @@ +////////////////////////////////////////////////////////////////////// +//// //// +//// uart_test.v //// +//// //// +//// //// +//// This file is part of the "UART 16550 compatible" project //// +//// http://www.opencores.org/cores/uart16550/ //// +//// //// +//// Documentation related to this project: //// +//// - http://www.opencores.org/cores/uart16550/ //// +//// //// +//// Projects compatibility: //// +//// - WISHBONE //// +//// RS232 Protocol //// +//// 16550D uart (mostly supported) //// +//// //// +//// Overview (main Features): //// +//// UART core test bench //// +//// //// +//// Known problems (limits): //// +//// A very simple test bench. Creates two UARTS and sends //// +//// data on to the other. //// +//// //// +//// To Do: //// +//// More complete testing should be done!!! //// +//// //// +//// Author(s): //// +//// - gorban@opencores.org //// +//// - Jacob Gorban //// +//// //// +//// Created: 2001/05/12 //// +//// Last Updated: 2001/05/17 //// +//// (See log for the revision history) //// +//// //// +//// //// +////////////////////////////////////////////////////////////////////// +//// //// +//// Copyright (C) 2000 Jacob Gorban, gorban@opencores.org //// +//// //// +//// This source file may be used and distributed without //// +//// restriction provided that this copyright statement is not //// +//// removed from the file and that any derivative work contains //// +//// the original copyright notice and the associated disclaimer. //// +//// //// +//// This source file is free software; you can redistribute it //// +//// and/or modify it under the terms of the GNU Lesser General //// +//// Public License as published by the Free Software Foundation; //// +//// either version 2.1 of the License, or (at your option) any //// +//// later version. //// +//// //// +//// This source 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. See the GNU Lesser General Public License for more //// +//// details. //// +//// //// +//// You should have received a copy of the GNU Lesser General //// +//// Public License along with this source; if not, download it //// +//// from http://www.opencores.org/lgpl.shtml //// +//// //// +////////////////////////////////////////////////////////////////////// +// +// CVS Revision History +// +// $Log: uart_test.v,v $ +// Revision 1.3 2001/05/31 20:08:01 gorban +// FIFO changes and other corrections. +// +// Revision 1.2 2001/05/17 18:34:18 gorban +// First 'stable' release. Should be sythesizable now. Also added new header. +// +// Revision 1.0 2001-05-17 21:27:12+02 jacob +// Initial revision +// +// +//`define DATA_BUS_WIDTH_8 +`include "timescale.v" +module uart_test (); + +`include "uart_defines.v" + +reg clkr; +reg wb_rst_ir; +wire [`UART_ADDR_WIDTH-1:0] wb_adr_i; +wire [31:0] wb_dat_i; +wire [31:0] wb_dat_o; +wire [3:0] wb_sel_i; +wire pad_stx_o; +reg pad_srx_ir; + +integer e; + +uart_top uart_snd( + clk, + + // Wishbone signals + wb_rst_i, wb_adr_i, wb_dat_i, wb_dat_o, wb_we_i, wb_stb_i, wb_cyc_i, wb_ack_o, wb_sel_i, + int_o, // interrupt request + + // UART signals + // serial input/output + pad_stx_o, pad_srx_i, + + // modem signals + rts_o, cts_i, dtr_o, dsr_i, ri_i, dcd_i +`ifdef UART_HAS_BAUDRATE_OUTPUT + , baud1_o +`endif + + + + ); + + +// All the signals and regs named with a 1 are receiver fifo signals + +wire [`UART_ADDR_WIDTH-1:0] wb1_adr_i; +wire [31:0] wb1_dat_i; +wire [31:0] wb1_dat_o; +wire [3:0] wb1_sel_i; +wire int1_o; +wire stx1_o; +reg srx1_ir; + +uart_top uart_rcv( + clk, + + // Wishbone signals + wb_rst_i, wb1_adr_i, wb1_dat_i, wb1_dat_o, wb1_we_i, wb1_stb_i, wb1_cyc_i, wb1_ack_o, wb1_sel_i, + int1_o, // interrupt request + + // UART signals + // serial input/output + stx1_o, srx1_i, + + // modem signals + rts1_o, cts1_i, dtr1_o, dsr1_i, ri1_i, dcd1_i +`ifdef UART_HAS_BAUDRATE_OUTPUT + , baud2_o +`endif + + ); + +assign clk = clkr; +assign wb_rst_i = wb_rst_ir; +assign pad_srx_i = pad_srx_ir; +assign cts_i = 1; //cts_ir; +assign dsr_i = 1; //dsr_ir; +assign ri_i = 1; //ri_ir; +assign dcd_i = 1; //dcd_ir; + +assign srx1_i = srx1_ir; +assign cts1_i = 1; //cts1_ir; +assign dsr1_i = 1; //dsr1_ir; +assign ri1_i = 1; //ri1_ir; +assign dcd1_i = 1; //dcd1_ir; + +reg [31:0] dat_o; +/////////// CONNECT THE UARTS +always @(pad_stx_o) +begin + srx1_ir = pad_stx_o; +end + +initial +begin + clkr = 0; + #50000 $finish; +end + +wb_mast wbm(// Outputs + .adr (wb_adr_i), + .dout (wb_dat_i), + .cyc (wb_cyc_i), + .stb (wb_stb_i), + .sel (wb_sel_i), + .we (wb_we_i), + // Inputs + .clk (clk), + .rst (wb_rst_i), + .din (wb_dat_o), + .ack (wb_ack_o), + .err (1'b0), + .rty (1'b0)); + +wb_mast wbm1(// Outputs + .adr (wb1_adr_i), + .dout (wb1_dat_i), + .cyc (wb1_cyc_i), + .stb (wb1_stb_i), + .sel (wb1_sel_i), + .we (wb1_we_i), + // Inputs + .clk (clk), + .rst (wb_rst_i), + .din (wb1_dat_o), + .ack (wb1_ack_o), + .err (1'b0), + .rty (1'b0)); + +// The test sequence +initial +begin + #1 wb_rst_ir = 1; + #10 wb_rst_ir = 0; + + //write to lcr. set bit 7 + //wb_cyc_ir = 1; + wbm.wb_wr1(`UART_REG_LC, 4'b1000, {8'b10011011, 24'b0}); + // set dl to divide by 3 + wbm.wb_wr1(`UART_REG_DL1,4'b0001, 32'd2); + @(posedge clk); + @(posedge clk); + // restore normal registers + wbm.wb_wr1(`UART_REG_LC, 4'b1000, {8'b00011011, 24'b0}); //00011011 + + fork + begin + $display("%m : %t : sending : %h", $time, 8'b10000001); + wbm.wb_wr1(0, 4'b1, 32'b10000001); + @(posedge clk); + @(posedge clk); + $display("%m : %t : sending : %h", $time, 8'b01000010); + wbm.wb_wr1(0, 4'b1, 32'b01000010); + @(posedge clk); + @(posedge clk); + $display("%m : %t : sending : %h", $time, 8'b11000011); + wbm.wb_wr1(0, 4'b1, 32'b11000011); + @(posedge clk); + @(posedge clk); + $display("%m : %t : sending : %h", $time, 8'b00100100); + wbm.wb_wr1(0, 4'b1, 32'b00100100); + @(posedge clk); + @(posedge clk); + $display("%m : %t : sending : %h", $time, 8'b10100101); + wbm.wb_wr1(0, 4'b1, 32'b10100101); + @(posedge clk); + @(posedge clk); + $display("%m : %t : sending : %h", $time, 8'b01100110); + wbm.wb_wr1(0, 4'b1, 32'b01100110); + @(posedge clk); + @(posedge clk); + $display("%m : %t : sending : %h", $time, 8'b11100111); + wbm.wb_wr1(0, 4'b1, 32'b11100111); + @(posedge clk); + @(posedge clk); + $display("%m : %t : sending : %h", $time, 8'b00011000); + wbm.wb_wr1(0, 4'b1, 32'b00011000); + wait (uart_snd.regs.tstate==0 && uart_snd.regs.transmitter.tf_count==0); +// disable check; + end +// begin: check +// end + join +end + +always @(int1_o) + if (int1_o) + $display("INT_O high (%g)", $time); + else + $display("INT_O low (%g)", $time); + +always @(int1_o) +begin + if (int1_o) begin + wbm1.wb_rd1(2,4'b0100, dat_o); + $display("IIR : %h", dat_o); + wbm1.wb_rd1(5,4'b0010, dat_o); + $display("LSR : %h", dat_o); + wbm1.wb_rd1(0, 4'b1, dat_o); + $display("%m : %t : Data out: %h", $time, dat_o); + end +end + +// receiver side +initial +begin + #11; + //write to lcr. set bit 7 + //wb_cyc_ir = 1; + wbm1.wb_wr1(`UART_REG_LC, 4'b1000, {8'b10011011, 24'b0}); + // set dl to divide by 3 + wbm1.wb_wr1(`UART_REG_DL1, 4'b1, 32'd2); + @(posedge clk); + @(posedge clk); + // restore normal registers + wbm1.wb_wr1(`UART_REG_LC, 4'b1000, {8'b00011011, 24'b0}); + wbm1.wb_wr1(`UART_REG_IE, 4'b0010, {16'b0, 8'b00001111, 8'b0}); + wait(uart_rcv.regs.receiver.rf_count == 2); + e = 800; + while (e > 0) + begin + @(posedge clk) + if (uart_rcv.regs.enable) e = e - 1; + end + wbm1.wb_rd1(0, 4'b1, dat_o); + $display("%m : %t : Data out: %h", $time, dat_o); + @(posedge clk); + wbm1.wb_rd1(0, 4'b1, dat_o); + $display("%m : %t : Data out: %h", $time, dat_o); + $display("%m : Finish"); + e = 800; + while (e > 0) + begin + @(posedge clk) + if (uart_rcv.regs.enable) e = e - 1; + end + e = 800; + while (e > 0) + begin + @(posedge clk) + if (uart_rcv.regs.enable) e = e - 1; + end + $finish; +end + +//always @(uart_rcv.regs.rstate) +//begin +// $display($time,": Receiver state changed to: ", uart_rcv.regs.rstate); +//end + +initial + begin + `ifdef DATA_BUS_WIDTH_8 +$display("DATA BUS IS 8"); +`else +$display("DATA BUS IS 32"); +`endif + $display("%d %d", `UART_ADDR_WIDTH, `UART_DATA_WIDTH); + + end + + +always +begin + #5 clkr = ~clk; +end + +endmodule |