Subversion Repositories ngs

Rev

Rev 34 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. // testbench for CPLD_buf.v
  2. // (c) NedoPC 2010
  3.  
  4. `timescale 1ns/1ps
  5.  
  6.  
  7. `define CLK20_HALFPERIOD (25.000)
  8. `define CLK24_HALFPERIOD (20.833)
  9.  
  10.  
  11. module tb;
  12.  
  13.  
  14.         integer seed;
  15.  
  16.  
  17.         reg [ 7:0] dummy8;
  18.  
  19.  
  20.  
  21.         reg clk24,clk20;
  22.         reg [1:0] clksel;
  23.         wire clkout;
  24.  
  25.         reg clkin;
  26.  
  27.         reg coldres_n;
  28.         wire warmres_n;
  29.  
  30.  
  31.         tri1 config_n;
  32.         wire cs;
  33.         reg status_n,conf_done,init_done;
  34.  
  35.  
  36.  
  37.         reg  [15:0] zaddr;
  38.         trireg [ 7:0] zdata;
  39.         reg  [ 7:0] zdout;
  40.         reg         zdena;
  41.  
  42.  
  43.         tri1 [ 7:0] mdata;
  44.  
  45.         wire ma6,ma7,ma10,ma11,ma12,ma13;
  46.  
  47.  
  48.  
  49.         reg in_ramcs0_n,
  50.             in_ramcs1_n,
  51.             in_ramcs2_n,
  52.             in_ramcs3_n;
  53.  
  54.  
  55.         reg mreq_n, iorq_n, rd_n, wr_n;
  56.  
  57.         wire ra6,ra7,ra10,ra11,ra12,ra13;
  58.         wire mema14,mema15,mema19;
  59.         wire memoe_n,memwe_n,romcs_n;
  60.         wire out_ramcs0_n,out_ramcs1_n;
  61.  
  62.  
  63.  
  64.         reg [7:0] romd;
  65.         reg romd_ena;
  66.  
  67.         reg [7:0] last_mem_data;
  68.  
  69.  
  70.  
  71.  
  72.  
  73.         reg [7:0] md;
  74.         reg md_ena;
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.         reg       memop_type;
  82.         reg [1:0] memop_page;
  83.         reg [7:0] memop_data;
  84.  
  85.         localparam READ  = 1'b0;
  86.         localparam WRITE = 1'b1;
  87.  
  88.  
  89.  
  90.  
  91.  
  92.         // see whether out_ramcs1_n or mema19 will toggle when they shouldn't
  93.         reg ramcs1_toggled;
  94.         reg mema19_toggled;
  95.         reg clr_mema19_ramcs1_toggle;
  96.  
  97.  
  98.         // external drive on romcs_n, memoe_n, memwe_n
  99.         reg eromcs_n, ememoe_n, ememwe_n;
  100.         reg edrv;
  101.  
  102.  
  103.  
  104.  
  105.  
  106.         reg cold_reset_set;
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.         // 20MHz clock
  124.         initial
  125.         begin
  126.                 clk20 = 1'b0;
  127.  
  128.                 forever #(`CLK20_HALFPERIOD) clk20 = ~clk20;
  129.         end
  130.  
  131.         // 24MHz clock
  132.         initial
  133.         begin
  134.                 clk24 = 1'b0;
  135.  
  136.                 forever #(`CLK24_HALFPERIOD) clk24 = ~clk24;
  137.         end
  138.  
  139.  
  140.         // 10 MHz clock
  141.         initial
  142.         begin
  143.                 clkin = 1'b0;
  144.  
  145.                 repeat(2)
  146.                 begin
  147.                         @(posedge clk20);
  148.                         @(posedge clk24);
  149.                 end
  150.  
  151.                 forever #(2*`CLK20_HALFPERIOD) clkin = ~clkin;
  152.         end
  153.  
  154.  
  155.         // cold reset
  156.         initial
  157.         begin
  158.                 coldres_n = 1'b0;
  159.  
  160.                 repeat(5) @(posedge clkin);
  161.  
  162.                 coldres_n <= 1'b1;
  163.  
  164.         end
  165.  
  166.         // clk switch signals
  167.         initial
  168.         begin
  169.                 clksel = 2'b00;
  170.  
  171.                 forever
  172.                 begin
  173.                         repeat(10) @(posedge clkout);
  174.  
  175.                         clksel[1:0] <= $random>>30;
  176.                 end
  177.         end
  178.  
  179.         // control minimal period of switched clock
  180.         real old_time,cur_time;
  181.         integer width,min_width;
  182.  
  183.         initial
  184.         begin
  185.                 old_time=$time;
  186.                 cur_time=old_time;
  187.                 min_width=1e10;
  188.  
  189.                 #(20); // wait to skip x->value init at the beginning
  190.  
  191.                 forever
  192.                 begin
  193.                         @(clkout);
  194.  
  195.                         cur_time=$realtime;
  196.                         width = 1000.0*(cur_time-old_time);
  197.                         old_time=cur_time;
  198.  
  199.                         if( width<min_width )
  200.                         begin
  201.                                 min_width = width;
  202.                                 $display("at time %t,",cur_time);
  203.                                 $display("minimum width set to %d",min_width);
  204.                         end
  205.                 end
  206.         end
  207.  
  208.  
  209.         // status_n, *_done control
  210.         initial
  211.                 status_n = 1'b1;
  212.         always @(config_n)
  213.         begin
  214.                 status_n <= #1000 config_n;
  215.         end
  216.  
  217.         initial
  218.                 conf_done = 1'b0;
  219.  
  220.         initial
  221.                 init_done = 1'b0;
  222.  
  223.  
  224.         // init in_ramcsX_n
  225.         initial
  226.         begin
  227.                 in_ramcs0_n = 1'b1;
  228.                 in_ramcs1_n = 1'b1;
  229.                 in_ramcs2_n = 1'b1;
  230.                 in_ramcs3_n = 1'b1;
  231.         end
  232.  
  233.         // external drive init
  234.         initial
  235.         begin
  236.                 eromcs_n = 1'b1;
  237.                 ememoe_n = 1'b1;
  238.                 ememwe_n = 1'b1;
  239.                 edrv     = 1'b0;
  240.         end
  241.  
  242.  
  243.         // Z80 cycles
  244.         assign zdata = zdena ? zdout : ( romd_ena ? romd : 8'hZZ);
  245.         //
  246.         initial
  247.         begin
  248.                 zdena = 1'b0;
  249.  
  250.                 iorq_n = 1'b1;
  251.                 mreq_n = 1'b1;
  252.                 rd_n   = 1'b1;
  253.                 wr_n   = 1'b1;
  254.  
  255.                 zaddr  = 16'h0000;
  256.  
  257.  
  258.                 cold_reset_set = 1'b1;
  259.  
  260.  
  261.                 wait(warmres_n===1'b0);
  262.                 wait(warmres_n===1'bZ);
  263.                 repeat(3) @(posedge clkin);
  264.  
  265.  
  266.                 repeat(32)
  267.                 begin
  268.                         mema19_toggled = 1'b0;
  269.                         ramcs1_toggled = 1'b0;
  270.  
  271.                         init_done = 1'b0;
  272.  
  273.  
  274.                         test_config_status;
  275.  
  276.                         test_cold_reset_flag(cold_reset_set);
  277.                         cold_reset_set = 1'b0;
  278.  
  279.                         test_fpga_cs;
  280.  
  281.                         test_conf_done;
  282.  
  283.  
  284.                         repeat(10) @(posedge clkin);
  285.  
  286.                         test_rommap;
  287.  
  288.  
  289.                         repeat(10) @(posedge clkin);
  290.  
  291.                         test_rammap;
  292.  
  293.  
  294.                         repeat(10) @(posedge clkin);
  295.  
  296.                         test_cpldoff;
  297.  
  298.  
  299.                         test_ramcs_fpga;
  300.  
  301.  
  302.                         repeat(10) @(posedge clkin);
  303.  
  304.                         test_fwd_fpga;
  305.  
  306.  
  307.                         repeat(10) @(posedge clkin);
  308.  
  309.                         test_restart;
  310.                 end
  311.  
  312.  
  313.  
  314.                 repeat(4) $display("");
  315.  
  316.                 $display("full SUCCESS!");
  317.  
  318.                 $stop;
  319.  
  320.  
  321.  
  322.         end
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.         // module connection
  352.  
  353.         GS_cpld DUT( .clk24in(clk24),
  354.                      .clk20in(clk20),
  355.                      .clksel0(clksel[0]),
  356.                      .clksel1(clksel[1]),
  357.                      .clkout(clkout),
  358.  
  359.                      .clkin(clkin),
  360.                      .coldres_n(coldres_n),
  361.                      .warmres_n(warmres_n),
  362.  
  363.                      .config_n(config_n),
  364.                      .status_n(status_n),
  365.                      .conf_done(conf_done),
  366.                      .init_done(init_done),
  367.                      .cs(cs),
  368.  
  369.                      .mreq_n(mreq_n),
  370.                      .iorq_n(iorq_n),
  371.                      .rd_n(rd_n),
  372.                      .wr_n(wr_n),
  373.  
  374.                      .d(zdata),
  375.                      .a6 (zaddr[ 6]), .a7 (zaddr[ 7]), .a10(zaddr[10]), .a11(zaddr[11]),
  376.                      .a12(zaddr[12]), .a13(zaddr[13]), .a14(zaddr[14]), .a15(zaddr[15]),
  377.  
  378.                      .memoe_n(memoe_n),
  379.                      .memwe_n(memwe_n),
  380.                      .romcs_n(romcs_n),
  381.  
  382.                      .mema14(mema14), .mema15(mema15), .mema19(mema19),
  383.  
  384.                      .in_ramcs0_n(in_ramcs0_n),
  385.                      .in_ramcs1_n(in_ramcs1_n),
  386.                      .in_ramcs2_n(in_ramcs2_n),
  387.                      .in_ramcs3_n(in_ramcs3_n),
  388.  
  389.                      .out_ramcs0_n(out_ramcs0_n),
  390.                      .out_ramcs1_n(out_ramcs1_n),
  391.  
  392.                      .rd(mdata),
  393.                      .ra6 (ma6 ), .ra7 (ma7 ), .ra10(ma10),
  394.                      .ra11(ma11), .ra12(ma12), .ra13(ma13)
  395.  
  396.                );
  397.  
  398.  
  399.         // data passing d<>rd check
  400.         reg old_mreq_n, old_iorq_n, old_memwe_n, old_memoe_n;
  401.         wire ramcs_n = out_ramcs0_n & out_ramcs1_n;
  402.         //
  403.         always @(posedge clkin)
  404.         begin
  405.                 old_mreq_n  <= mreq_n;
  406.                 old_iorq_n  <= iorq_n;
  407.                 old_memwe_n <= memwe_n;
  408.                 old_memoe_n <= memoe_n;
  409.         end
  410.         //
  411.         always @(posedge clkin)
  412.         if( !ramcs_n && !memwe_n && !old_memwe_n )
  413.         begin
  414.                 if( mdata!==zdata )
  415.                 begin
  416.                         $display("error: data do not pass from d to rd!");
  417.                         $stop;
  418.                 end
  419.         end
  420.         //
  421.         always @(posedge clkin)
  422.         if( !ramcs_n && !memoe_n && !old_memoe_n )
  423.         begin
  424.                 if( mdata!==zdata )
  425.                 begin
  426.                         $display("error: data do not pass from rd to d!");
  427.                         $stop;
  428.                 end
  429.         end
  430.  
  431.         // data passing a -> ra check
  432.         always @(posedge clkin)
  433.         if( (!mreq_n && !old_mreq_n) || (!iorq_n && !old_iorq_n) )
  434.         begin
  435.                 if( { zaddr[13:10], zaddr[7:6] } !== { ma13,ma12,ma11,ma10,ma7,ma6 } )
  436.                 begin
  437.                         $display("error: addresses do not pass from a to ra!");
  438.                         $stop ;
  439.                 end
  440.         end
  441.  
  442.  
  443.         // RAM and ROM emulators
  444.     //
  445.         always @*
  446.         begin
  447.                 if( !memoe_n && ( !out_ramcs0_n || !out_ramcs1_n ) ) // RAM via buffers
  448.                 begin
  449.                         seed = $random( {out_ramcs0_n, out_ramcs1_n, mema19, mema15, mema14, ma13, ma12, ma11, ma10, ma7, ma6} );
  450.                         seed = $random;
  451.                         last_mem_data = $random>>24;
  452.                         md = last_mem_data;
  453.                         md_ena = 1'b1;
  454.                 end
  455.                 else
  456.                         md_ena = 1'b0;
  457.         end
  458.         //
  459.         assign mdata = md_ena ? md : 8'hZZ;
  460.         //
  461.         //
  462.         always @*
  463.         begin
  464.                 if( !memoe_n && !romcs_n ) // ROM directly
  465.                 begin
  466.                         seed = $random( {romcs_n, mema19, mema15, mema14, ma13, ma12, ma11, ma10, ma7, ma6} );
  467.                         seed = $random;
  468.                         last_mem_data = $random>>24;
  469.                         romd = last_mem_data;
  470.                         romd_ena = 1'b1;
  471.                 end
  472.                 else
  473.                         romd_ena = 1'b0;
  474.         end
  475.  
  476.  
  477.         // ROM paging and data tracer
  478.         always @(posedge clkin)
  479.         if( !romcs_n && !mreq_n && !old_mreq_n && ( (!memwe_n && !old_memwe_n) || (!memoe_n && !old_memoe_n) ) )
  480.         begin
  481.                 if( memwe_n )
  482.                 begin // read ROM
  483.                         memop_type = READ;
  484.                         memop_page = {mema15,mema14};
  485.                         memop_data = zdata;
  486.                 end
  487.                 else
  488.                 begin // write ROM
  489.                         memop_type = WRITE;
  490.                         memop_page = {mema15,mema14};
  491.                         memop_data = zdata;
  492.                 end
  493.         end
  494.  
  495.         // RAM paging and data tracer
  496.         always @(posedge clkin)
  497.         if( !out_ramcs0_n && !mreq_n && !old_mreq_n && ( (!memwe_n && !old_memwe_n) || (!memoe_n && !old_memoe_n) ) )
  498.         begin
  499.                 if( memwe_n )
  500.                 begin // read RAM
  501.                         memop_type = READ;
  502.                         memop_page = {mema15,mema14};
  503.                         memop_data = zdata;
  504.                 end
  505.                 else
  506.                 begin // write RAM
  507.                         memop_type = WRITE;
  508.                         memop_page = {mema15,mema14};
  509.                         memop_data = zdata;
  510.                 end
  511.         end
  512.  
  513.         // mema19 and out_ramcs1_n toggle tracers
  514.         initial
  515.         begin
  516.                 clr_mema19_ramcs1_toggle = 1'b0;
  517.  
  518.                 #(0.1);
  519.  
  520.                 mema19_toggled = 1'b0;
  521.                 ramcs1_toggled = 1'b0;
  522.         end
  523.         //
  524.         always @(clr_mema19_ramcs1_toggle) // clr on request
  525.         begin
  526.                 mema19_toggled = 1'b0;
  527.                 ramcs1_toggled = 1'b0;
  528.         end
  529.         //
  530.         always @(mema19)
  531.         if( mema19 !== 1'b0 )
  532.                 mema19_toggled = 1'b1;
  533.         //
  534.         always @(out_ramcs1_n)
  535.         if( out_ramcs1_n !== 1'b1 )
  536.                 ramcs1_toggled = 1'b1;
  537.  
  538.         // external drive on romcs memoe memwe
  539.         assign romcs_n = edrv ? eromcs_n : 1'bZ;
  540.         assign memoe_n = edrv ? ememoe_n : 1'bZ;
  541.         assign memwe_n = edrv ? ememwe_n : 1'bZ;
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.         // tasks for z80 bus model (simplified)
  563.  
  564.         task memrd;
  565.  
  566.                 input  [15:0] addr;
  567.                 output [ 7:0] data;
  568.  
  569.                 begin
  570.                         @(posedge clkin);
  571.                         mreq_n <= 1'b1;
  572.                         iorq_n <= 1'b1;
  573.                         rd_n   <= 1'b1;
  574.                         wr_n   <= 1'b1;
  575.                         zdena  <= 1'b0;
  576.                         zaddr <= addr;
  577.  
  578.                         @(negedge clkin);
  579.  
  580.                         mreq_n <= 1'b0;
  581.                         rd_n   <= 1'b0;
  582.  
  583.                         @(negedge clkin);
  584.                         @(negedge clkin);
  585.  
  586.                         data = zdata;
  587.                         mreq_n <= 1'b1;
  588.                         rd_n   <= 1'b1;
  589.                 end
  590.         endtask
  591.  
  592.  
  593.         task memwr;
  594.  
  595.                 input  [15:0] addr;
  596.                 input  [ 7:0] data;
  597.  
  598.                 begin
  599.                         @(posedge clkin);
  600.  
  601.                         mreq_n <= 1'b1;
  602.                         iorq_n <= 1'b1;
  603.                         rd_n   <= 1'b1;
  604.                         wr_n   <= 1'b1;
  605.                         zdena  <= 1'b1;
  606.                         zaddr  <= addr;
  607.                         zdout  <= data;
  608.  
  609.                         @(negedge clkin);
  610.  
  611.                         mreq_n <= 1'b0;
  612.                         wr_n   <= 1'b0;
  613.  
  614.                         @(negedge clkin);
  615.                         @(negedge clkin);
  616.  
  617.                         mreq_n <= 1'b1;
  618.                         wr_n   <= 1'b1;
  619.                         wait(wr_n==1'b1); // delta-cycle delay!!!
  620.                         zdena  <= 1'b0;
  621.                 end
  622.         endtask
  623.  
  624.  
  625.         task iord;
  626.  
  627.                 input [15:0] addr;
  628.  
  629.                 output [7:0] data;
  630.  
  631.                 begin
  632.  
  633.                         @(posedge clkin);
  634.  
  635.                         mreq_n <= 1'b1;
  636.                         iorq_n <= 1'b1;
  637.                         rd_n   <= 1'b1;
  638.                         wr_n   <= 1'b1;
  639.  
  640.                         zdena  <= 1'b0;
  641.  
  642.                         zaddr <= addr;
  643.  
  644.                         @(negedge clkin);
  645.  
  646.                         iorq_n <= 1'b0;
  647.                         rd_n   <= 1'b0;
  648.  
  649.                         @(negedge clkin);
  650.                         @(negedge clkin);
  651.  
  652.                         data = zdata;
  653.  
  654.                         iorq_n <= 1'b1;
  655.                         rd_n   <= 1'b1;
  656.  
  657.                 end
  658.  
  659.         endtask
  660.  
  661.  
  662.         task iowr;
  663.  
  664.                 input [15:0] addr;
  665.                 input [ 7:0] data;
  666.  
  667.                 begin
  668.  
  669.                         @(posedge clkin);
  670.  
  671.                         mreq_n <= 1'b1;
  672.                         iorq_n <= 1'b1;
  673.                         rd_n   <= 1'b1;
  674.                         wr_n   <= 1'b1;
  675.  
  676.                         zdena  <= 1'b1;
  677.  
  678.                         zaddr <= addr;
  679.                         zdout <= data;
  680.  
  681.                         @(negedge clkin);
  682.  
  683.                         iorq_n <= 1'b0;
  684.                         wr_n   <= 1'b0;
  685.  
  686.                         @(negedge clkin);
  687.                         @(negedge clkin);
  688.  
  689.                         iorq_n <= 1'b1;
  690.                         wr_n   <= 1'b1;
  691.  
  692.                         wait(wr_n==1'b1); // delta-cycle delay!!!
  693.  
  694.                         zdena  <= 1'b0;
  695.  
  696.                 end
  697.  
  698.         endtask
  699.  
  700.  
  701.         task w_st_n; // wait status_n to be as given
  702.  
  703.                 input value;
  704.  
  705.                 reg [7:0] tmp;
  706.  
  707.                 forever
  708.                 begin
  709.  
  710.                 iord(16'h0080,tmp);
  711.  
  712.                         //$display("status_n=d",tmp[7]);
  713.  
  714.                         if( tmp[7]==value )
  715.                                 disable w_st_n;
  716.  
  717.                 end
  718.  
  719.         endtask
  720.  
  721.  
  722.  
  723.         task test_config_status;
  724.  
  725.                 begin
  726.                         $display("test_config_status: playing with config_n...");
  727.  
  728.                         w_st_n(1'b0);
  729.                         iowr(16'h0080,8'h01); // play with config_n
  730.                         w_st_n(1'b1);
  731.                         iowr(16'h0080,8'h00);
  732.                         w_st_n(1'b0);
  733.                         iowr(16'h0080,8'h01);
  734.                         w_st_n(1'b1);
  735.  
  736.                         $display("test_config_status: success!");
  737.                 end
  738.  
  739.         endtask
  740.  
  741.  
  742.         task test_cold_reset_flag;
  743.  
  744.                 input cold_reset_set;
  745.  
  746.  
  747.                 reg [7:0] tmp;
  748.  
  749.                 begin
  750.                         $display("test_cold_reset_flag: doing sticking test...");
  751.  
  752.                         iord(16'h0040,tmp);
  753.                         if( tmp[7] && cold_reset_set )
  754.                         begin
  755.                                 $display("test_cold_reset_flag: error! cold_reset_flag was set at the beginning!");
  756.                                 $stop;
  757.                         end
  758.  
  759.                         iowr(16'h0080,8'h81); // set cold reset flag
  760.  
  761.                         iord(16'h0040,tmp);
  762.                         if( !tmp[7] )
  763.                         begin
  764.                                 $display("test_cold_reset_flag: error! can't set cold_reset_flag!");
  765.                                 $stop;
  766.                         end
  767.  
  768.                         iowr(16'h0080,8'h01); // try to clear cold reset flag
  769.  
  770.                         iord(16'h0040,tmp);
  771.                         if( !tmp[7] )
  772.                         begin
  773.                                 $display("test_cold_reset_flag: error! can clear cold_reset_flag!");
  774.                                 $stop;
  775.                         end
  776.  
  777.                         $display("test_cold_reset_flag: success!");
  778.                 end
  779.  
  780.         endtask
  781.  
  782.  
  783.         task test_fpga_cs;
  784.  
  785.                 integer i;
  786.  
  787.                 begin
  788.                         $display("test_fpga_cs: testing cs decoding...");
  789.  
  790.                         for(i=0;i<4;i=i+1)
  791.                         begin
  792.  
  793.                                 @(posedge clkin);
  794.                                 zaddr <= { 8'd0, i[1:0], 6'd0 };
  795.                                 @(posedge clkin);
  796.  
  797.                                 if( cs!=(i==3) )
  798.                                 begin
  799.                                         $display("test_fpga_cs: error! cs is not set at addr $C0!");
  800.                                         $stop;
  801.                                 end
  802.                         end
  803.  
  804.                         $display("test_fpga_cs: success!");
  805.                 end
  806.  
  807.         endtask
  808.  
  809.  
  810.         task test_conf_done;
  811.  
  812.                 integer i;
  813.  
  814.                 reg [7:0] tmp;
  815.  
  816.                 begin
  817.                         $display("test_conf_done: testing read of conf_done...");
  818.  
  819.                         for(i=0;i<2;i=i+1)
  820.                         begin
  821.                                 @(posedge clkin);
  822.                                 conf_done <= i[0];
  823.                                 @(posedge clkin);
  824.  
  825.                                 iord(16'h0080,tmp);
  826.  
  827.                                 if( tmp[0]!=i[0] )
  828.                                 begin
  829.                                         $display("test_conf_done: error! read data is wrong!");
  830.                                         $stop;
  831.                                 end
  832.                         end
  833.  
  834.                         $display("test_conf_done: success!");
  835.                 end
  836.  
  837.         endtask
  838.  
  839.  
  840.  
  841.  
  842.         task test_rommap; // test rom paging
  843.  
  844.                 integer i;
  845.  
  846.                 reg [7:0] tmp;
  847.  
  848.                 begin
  849.                         $display("test_rommap: testing CPLD mapping of ROM...");
  850.  
  851.                         memwr(16'h0f23,8'h55);
  852.                         if( memop_type!=WRITE || memop_page!=2'b00 || memop_data!=8'h55 )
  853.                         begin
  854.                                 $display("test_rommap: error! write to cpu bank 0 fails!");
  855.                                 $stop;
  856.                         end
  857.  
  858.                         memrd(16'h3210,tmp);
  859.                         if( memop_type!=READ || memop_page!=2'b00 || tmp!=last_mem_data )
  860.                         begin
  861.                                 $display("test_rommap: error! read from cpu bank 0 fails!");
  862.                                 $stop;
  863.                         end
  864.  
  865.                         for(i=0;i<4;i=i+1)
  866.                         begin
  867.                                 iowr(16'h0040,{ 7'd0, i[1] } ); // low or high part of 64k rom slice
  868.  
  869.                                 memwr( { 1'b1, i[0], 14'h29ac }, 8'hAA );
  870.                                 if( memop_type!=WRITE || memop_page!=i[1:0] || memop_data!=8'hAA )
  871.                                 begin
  872.                                         $display("test_rommap: error! write to cpu banks 2 or 3 fails!");
  873.                                         $stop;
  874.                                 end
  875.  
  876.                                 memrd( { 1'b1, i[0], 14'h25ac }, tmp );
  877.                                 if( memop_type!=READ || memop_page!=i[1:0] || tmp!=last_mem_data )
  878.                                 begin
  879.                                         $display("test_rommap: error! read from cpu banks 2 or 3 fails!");
  880.                                         $stop;
  881.                                 end
  882.                         end
  883.  
  884.                         $display("test_rommap: success!");
  885.                 end
  886.  
  887.         endtask
  888.  
  889.  
  890.         task test_rammap;
  891.  
  892.                 integer i;
  893.  
  894.                 reg [7:0] tmp;
  895.  
  896.                 begin
  897.                         $display("test_rammap: testing CPLD mapping of RAM...");
  898.  
  899.                         memwr(16'h7fff,8'h33);
  900.                         if( memop_type!=WRITE || memop_page!=2'b00 || memop_data!=8'h33 )
  901.                         begin
  902.                                 $display("test_rammap: error! write to cpu bank 1 fails!");
  903.                                 $stop;
  904.                         end
  905.  
  906.                         memrd(16'h4000,tmp);
  907.                         if( memop_type!=READ || memop_page!=2'b00 || tmp!=last_mem_data )
  908.                         begin
  909.                                 $display("test_rammap: error! read from cpu bank 1 fails!");
  910.                                 $stop;
  911.                         end
  912.  
  913.  
  914.                         for(i=0;i<4;i=i+1)
  915.                         begin
  916.                                 iowr(16'h0040,{ 1'b1, 6'd0, i[0] } ); // low or high part of 64k ram slice
  917.  
  918.                                 memwr( { 1'b1, i[1], 14'h1555 }, 8'hCC );
  919.                                 if( memop_type!=WRITE || memop_page!={i[0],i[1]} || memop_data!=8'hCC )
  920.                                 begin
  921.                                         $display("test_rammap: error! write to cpu banks 2 or 3 fails!");
  922.                                         $stop;
  923.                                 end
  924.  
  925.                                 memrd( { 1'b1, i[1], 14'h2AAA }, tmp );
  926.                                 if( memop_type!=READ || memop_page!={i[0],i[1]} || tmp!=last_mem_data )
  927.                                 begin
  928.                                         $display("test_rammap: error! read from cpu banks 2 or 3 fails!");
  929.                                         $stop;
  930.                                 end
  931.                         end
  932.  
  933.  
  934.  
  935.  
  936.                         $display("test_rammap: success!");
  937.                 end
  938.  
  939.         endtask
  940.  
  941.  
  942.  
  943.  
  944.         task test_cpldoff; // test turning off CPLD and then - mapping of FPGA accesses
  945.  
  946.                 begin
  947.                         $display("test_cpldoff: testing CPLD going offline...");
  948.  
  949.                         // check some signals are correct prior to turning CPLD off
  950.                         if( mema19_toggled || ramcs1_toggled )
  951.                         begin
  952.                                 $display("test_cpldoff: error! mema19 or out_ramcs1_n were toggling prior to CPLD turn-off!");
  953.                                 $stop;
  954.                         end
  955.  
  956.                         @(posedge clkin);
  957.  
  958.                         init_done <= 1'b1; // here CPLD must shut off
  959.  
  960.                         repeat(4) @(posedge clkin);
  961.  
  962.                         if( mema14  !== 1'bZ ||
  963.                             mema15  !== 1'bZ ||
  964.                             romcs_n !== 1'bZ ||
  965.                             memoe_n !== 1'bZ ||
  966.                             memwe_n !== 1'bZ ||
  967.                             cs      !== 1'bZ )
  968.                         begin
  969.                                 $display("test_cpldoff: error! CPLD did not shut up outputs (mema14 etc.)!");
  970.                                 $stop;
  971.                         end
  972.  
  973.                         if( warmres_n !== 1'b0 )
  974.                         begin
  975.                                 $display("test_cpldoff: error! CPLD did not assert warmres_n after disabling!");
  976.                                 $stop;
  977.                         end
  978.  
  979.                         wait( warmres_n!==1'b0 );
  980.                         @(posedge clkin);
  981.  
  982.                         edrv = 1'b1;
  983.  
  984.                         @(posedge clkin);
  985.                         @(posedge clkin);
  986.  
  987.                         $display("test_cpldoff: success!");
  988.                 end
  989.  
  990.         endtask
  991.  
  992.  
  993.  
  994.  
  995.  
  996.         task test_ramcs_fpga;
  997.  
  998.                 integer i;
  999.  
  1000.                 begin
  1001.                         $display("test_ramcs_fpga: testing muxing 4 ramcses into 2 with extra address...");
  1002.  
  1003.                         for(i=0;i<4;i=i+1)
  1004.                         begin
  1005.                                 @(posedge clkin);
  1006.                                 { in_ramcs3_n, in_ramcs2_n, in_ramcs1_n, in_ramcs0_n } <= ~(4'b0001<<i);
  1007.                                 @(posedge clkin);
  1008.  
  1009.                                 if( mema19 != i[0]          ||
  1010.                                     out_ramcs0_n != i[1]    ||
  1011.                                     out_ramcs1_n != (~i[1]) )
  1012.                                 begin
  1013.                                         $display("test_ramcs_fpga: error!");
  1014.                                         $stop;
  1015.                                 end
  1016.                         end
  1017.  
  1018.                         @(posedge clkin);
  1019.                         in_ramcs3_n <= 1'b1;
  1020.  
  1021.                         $display("test_ramcs_fpga: success!");
  1022.                 end
  1023.  
  1024.         endtask
  1025.  
  1026.  
  1027.  
  1028.         task test_fwd_fpga;
  1029.  
  1030.  
  1031.                 begin
  1032.                         $display("test_fwd_fpga: testing forwarding of ram data during fpga active...");
  1033.  
  1034.  
  1035.                         @(posedge clkin);
  1036.  
  1037.                         eromcs_n <= 1'b1;
  1038.                         ememoe_n <= 1'b0;
  1039.                         in_ramcs0_n <= 1'b0;
  1040.  
  1041.                         @(posedge clkin);
  1042.  
  1043.                         if( zdata!==last_mem_data )
  1044.                         begin
  1045.                                 $display("test_fwd_fpga: error! no data forwarding from RAM side!");
  1046.                                 $stop;
  1047.                         end
  1048.  
  1049.                         ememoe_n <= 1'b1;
  1050.  
  1051.                         @(posedge clkin);
  1052.  
  1053.                         ememwe_n <= 1'b0;
  1054.                         zdena <= 1'b1;
  1055.                         zdout <= $random>>24;
  1056.  
  1057.                         @(posedge clkin);
  1058.  
  1059.                         if( mdata!==zdout )
  1060.                         begin
  1061.                                 $display("test_fwd_fpga: error! no data forwarding from Z80 side!");
  1062.                                 $stop;
  1063.                         end
  1064.  
  1065.                         zdena <= 1'b0;
  1066.                         ememwe_n <= 1'b1;
  1067.                         in_ramcs0_n <= 1'b1;
  1068.  
  1069.  
  1070.                         $display("test_fwd_fpga: success!");
  1071.                 end
  1072.         endtask
  1073.  
  1074.  
  1075.  
  1076.  
  1077.         task test_restart;
  1078.  
  1079.                 begin
  1080.                         $display("test_restart: restarting CPLD...");
  1081.  
  1082.  
  1083.                         iowr(16'h0080,8'h00);
  1084.  
  1085.                         edrv <= 1'b0;
  1086.  
  1087.  
  1088.  
  1089.                         $display("test_restart: success!");
  1090.                 end
  1091.         endtask
  1092.  
  1093.  
  1094.  
  1095. endmodule
  1096.  
  1097.  
  1098.