📄 tst_bench_top.v
字号:
///////////////////////////////////////////////////////////////////////// //////// simple_spi ('HC11 compatible) testbench //////// //////// Author: Richard Herveille //////// richard@asics.ws //////// www.asics.ws //////// //////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2004 Richard Herveille //////// richard@asics.ws //////// //////// 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 SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY //////// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED //////// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS //////// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR //////// 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. //////// /////////////////////////////////////////////////////////////////////////// CVS Log//// $Id: tst_bench_top.v,v 1.1 2004/02/28 16:01:47 rherveille Exp $//// $Date: 2004/02/28 16:01:47 $// $Revision: 1.1 $// $Author: rherveille $// $Locker: $// $State: Exp $//// Change History:// $Log: tst_bench_top.v,v $// Revision 1.1 2004/02/28 16:01:47 rherveille// Initial testbench release added//////`include "timescale.v"module tst_bench_top(); // // wires && regs // reg clk; reg rstn; wire [31:0] adr; wire [ 7:0] dat_i, dat_o; wire we; wire stb; wire cyc; wire ack; wire inta; reg [1:0] cpol, cpha; reg [2:0] e; wire sck, mosi, miso; reg [7:0] q; parameter SPCR = 2'b00; parameter SPSR = 2'b01; parameter SPDR = 2'b10; parameter SPER = 2'b11; // // Module body // integer n; // generate clock always #5 clk = ~clk; // hookup wishbone master model wb_master_model #(8, 32) u0 ( .clk (clk), .rst (rstn), .adr (adr), .din (dat_i), .dout(dat_o), .cyc (cyc), .stb (stb), .we (we), .sel (), .ack (ack), .err (1'b0), .rty (1'b0) ); // hookup spi core simple_spi_top spi_top ( // wishbone interface .clk_i (clk), .rst_i (rstn), .cyc_i (cyc), .stb_i (stb), .adr_i (adr[1:0]), .we_i (we), .dat_i (dat_o), .dat_o (dat_i), .ack_o (ack), .inta_o(inta), .sck_o (sck), .mosi_o(mosi), .miso_i(miso) ); // hookup spi slave model spi_slave_model spi_slave ( .csn(1'b0), .sck(sck), .di(mosi), .do(miso) ); initial begin `ifdef WAVES $shm_open("waves"); $shm_probe("AS",tst_bench_top,"AS"); $display("INFO: Signal dump enabled ...\n\n"); `endif// force spi_slave.debug = 1'b1; // enable spi_slave debug information force spi_slave.debug = 1'b0; // disable spi_slave debug information $display("\nstatus: %t Testbench started\n\n", $time); // initially values clk = 0; // reset system rstn = 1'b1; // negate reset #2; rstn = 1'b0; // assert reset repeat(1) @(posedge clk); rstn = 1'b1; // negate reset $display("status: %t done reset", $time); @(posedge clk); // // program core // for (cpol=0; cpol<=1; cpol=cpol+1) for (cpha=0; cpha<=1; cpha=cpha+1) for (e=0; e<=3; e=e+1) begin //set cpol/cpha in spi slave model force spi_slave.cpol=cpol[0]; force spi_slave.cpha=cpha[0]; $display("cpol:%b, cpha:%b, e:%b", cpol[0],cpha[0],e[1:0]); // program internal registers // load control register u0.wb_write(1, SPCR, {4'b0101,cpol[0],cpha[0],e[1:0]} ); //verify control register u0.wb_cmp (0, SPCR, {4'b0101,cpol[0],cpha[0],e[1:0]} ); // load extended control register u0.wb_write(1,SPER,8'h0); //verify extended control register u0.wb_cmp (0,SPER,8'h0); //fill memory for(n=0;n<8;n=n+1) begin u0.wb_write(1,SPDR,{cpol[0],cpha[0],e[1:0],n[3:0]}); //wait for transfer to finish u0.wb_read(1,SPSR,q); while(~q[7]) u0.wb_read(1,SPSR,q); //clear 'spif' bit u0.wb_write(1,SPSR,8'h80); end //verify memory for(n=0;n<8;n=n+1) begin u0.wb_write(1,SPDR,~n); //wait for transfer to finish u0.wb_read(1,SPSR,q); while(~q[7]) u0.wb_read(1,SPSR,q); //clear 'spif' bit u0.wb_write(1,SPSR,8'h80); //verify memory content u0.wb_cmp(0,SPDR,{cpol[0],cpha[0],e[1:0],n[3:0]}); end end // check tip bit// u0.wb_read(1, SR, q);// while(q[1])// u0.wb_read(1, SR, q); // poll it until it is zero// $display("status: %t tip==0", $time); #250000; // wait 250us $display("\n\nstatus: %t Testbench done", $time); $finish; endendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -