Subversion Repositories ngs

Rev

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

  1. // modelling dma_sequencer.v together with dma_access.v
  2.  
  3. `define CLK_PERIOD 40
  4.  
  5. //`define NO_CPU
  6.  
  7. module tb;
  8.  
  9.  
  10.    parameter DEVNUM = 4;
  11.  
  12.  
  13.    integer i,j,k;
  14.  
  15.  
  16.         reg clk,rst_n;
  17.  
  18.         reg can_go;
  19.  
  20.    tri1 iorq_n,mreq_n,rd_n,wr_n;
  21.    tri0 busrq_n,busak_n;
  22.    trireg [15:0] zaddr;
  23.    tri  [7:0] zdata;
  24.  
  25.  
  26.    wire dma_req,dma_rnw;
  27.    wire dma_ack,dma_end;
  28.    wire dma_busynready;
  29.  
  30.    wire [20:0] dma_addr;
  31.    wire  [7:0] dma_wd;
  32.    wire  [7:0] dma_rd;
  33.  
  34.    tri0 [DEVNUM-1:0] req;
  35.    tri1 [DEVNUM-1:0] rnw;
  36.    wire [DEVNUM-1:0] done;
  37.    wire [DEVNUM-1:0] ack;
  38.  
  39.    tri0[20:0] addr[0:DEVNUM-1];
  40.    tri0 [7:0]   wd[0:DEVNUM-1];
  41.    wire [7:0]   rd;
  42.  
  43.  
  44.  
  45.    wire mem_dma_bus;
  46.    wire [15:0] mem_dma_addr;
  47.    wire [7:0] mem_dma_wd;
  48.    wire [7:0] mem_dma_rd;
  49.    wire mem_dma_rnw;
  50.    wire mem_dma_oe;
  51.    wire mem_dma_we;
  52.  
  53.  
  54.  
  55.         initial
  56.         begin
  57.                 clk = 1'b0;
  58.                 forever #(`CLK_PERIOD/2) clk = ~clk;
  59.         end
  60.  
  61.  
  62.  
  63.  
  64. `ifndef NO_CPU
  65.    T80a z80( .RESET_n(rst_n),
  66.              .CLK_n(clk),
  67.              .WAIT_n(1'b1),
  68.              .INT_n(1'b1),
  69.              .NMI_n(1'b1),
  70.              .MREQ_n(mreq_n),
  71.              .IORQ_n(iorq_n),
  72.              .RD_n(rd_n),
  73.              .WR_n(wr_n),
  74.              .BUSRQ_n(busrq_n),
  75.              .BUSAK_n(busak_n),
  76.              .A(zaddr),
  77.              .D(zdata) );
  78. `endif
  79.  
  80.  
  81.  
  82.    rom myrom( .addr(zaddr),
  83.               .data(zdata),
  84.               .ce_n( (zaddr<16'h8000)?(mreq_n|rd_n):1'b1 ) );
  85.  
  86.  
  87.    assign zaddr = mem_dma_bus ? mem_dma_addr[15:0] : 16'hZZZZ;
  88.  
  89.    assign zdata = (mem_dma_bus&(!mem_dma_rnw)) ? mem_dma_wd : 8'hZZ;
  90.    assign mem_dma_rd = zdata;
  91.  
  92.    ram myram( .addr(zaddr),
  93.               .data(zdata),
  94.               .ce_n( (zaddr>=16'h8000)?1'b0:1'b1 ),
  95.               .oe_n( mem_dma_bus ? mem_dma_oe : (mreq_n|rd_n) ),
  96.               .we_n( mem_dma_bus ? mem_dma_we : (mreq_n|wr_n) ) );
  97.  
  98.  
  99.    dma_sequencer myseq( .clk(clk),
  100.                         .rst_n(rst_n),
  101.  
  102.                         .rd   (rd),
  103.  
  104.                         .addr0(addr[0]),
  105.                         .wd0  (wd[0]),
  106.                         .req0 (req[0]),
  107.                         .rnw0 (rnw[0]),
  108.                         .ack0 (ack[0]),
  109.                         .end0 (done[0]),
  110.  
  111.                         .addr1(addr[1]),
  112.                         .wd1  (wd[1]),
  113.                         .req1 (req[1]),
  114.                         .rnw1 (rnw[1]),
  115.                         .ack1 (ack[1]),
  116.                         .end1 (done[1]),
  117.  
  118.                         .addr2(addr[2]),
  119.                         .wd2  (wd[2]),
  120.                         .req2 (req[2]),
  121.                         .rnw2 (rnw[2]),
  122.                         .ack2 (ack[2]),
  123.                         .end2 (done[2]),
  124.  
  125.                         .addr3(addr[3]),
  126.                         .wd3  (wd[3]),
  127.                         .req3 (req[3]),
  128.                         .rnw3 (rnw[3]),
  129.                         .ack3 (ack[3]),
  130.                         .end3 (done[3]),
  131.  
  132.  
  133.  
  134.  
  135.                         .dma_req(dma_req),
  136.                         .dma_rnw(dma_rnw),
  137.                         .dma_ack(dma_ack),
  138.                         .dma_end(dma_end),
  139.                         .dma_addr(dma_addr),
  140.                         .dma_wd(dma_wd),
  141.                         .dma_rd(dma_rd) );
  142.  
  143.  
  144.         dma_access mydma( .dma_req(dma_req),
  145.                           .dma_rnw(dma_rnw),
  146.                           .dma_ack(dma_ack),
  147.                           .dma_end(dma_end),
  148.                           .dma_addr(dma_addr),
  149.                           .dma_wd(dma_wd),
  150.                           .dma_rd(dma_rd),
  151.  
  152.                           .dma_busynready(dma_busynready),
  153.  
  154.                           .mem_dma_rd(zdata),
  155.                           .mem_dma_wd(mem_dma_wd),
  156.                           .mem_dma_bus(mem_dma_bus),
  157.                           .mem_dma_addr(mem_dma_addr),
  158.                           .mem_dma_rnw(mem_dma_rnw),
  159.                           .mem_dma_oe(mem_dma_oe),
  160.                           .mem_dma_we(mem_dma_we),
  161.  
  162.                           .clk(clk),
  163.                           .rst_n(rst_n),
  164.                           .busrq_n(busrq_n),
  165.                           .busak_n(busak_n) );
  166.  
  167.  
  168.  
  169.         generate
  170.                 genvar gv;
  171.                 for(gv=0;gv<DEVNUM;gv=gv+1)
  172.                 begin : instantiate_testers
  173.  
  174.                         dma_tester #( .BEG_ADDR(21'h0A000+21'd4096*gv) ) mytest (
  175.                                       .clk(clk),
  176.                                       .can_go(can_go),
  177.  
  178.                                       .req(req[gv]),
  179.                                       .rnw(rnw[gv]),
  180.                                       .wd(wd[gv]),
  181.                                       .addr(addr[gv]),
  182.                                       .ack(ack[gv]),
  183.                                       .done(done[gv]),
  184.                                       .rd(rd)
  185.                         );
  186.                 end
  187.         endgenerate
  188.  
  189.  
  190.  
  191.  
  192. /*
  193.         reg start  [0:DEVNUM-1];
  194.         reg rnw_in [0:DEVNUM-1];
  195.         wire inprogress [0:DEVNUM-1];
  196.  
  197.         generate
  198.                 genvar gv;
  199.                 for(gv=0;gv<DEVNUM;gv=gv+1)
  200.                 begin : dmaers
  201.                         dmaer g( .clk(clk), .rst_n(rst_n),
  202.                                  .start(start[gv]),
  203.                                  .rnw_in(rnw_in[gv]),
  204.                                  .inprogress(inprogress[gv]),
  205.                                  .req(req[gv]),
  206.                                  .rnw(rnw[gv]),
  207.                                  .ack(ack[gv]),
  208.                                  .done(done[gv]) );
  209.                 end
  210.         endgenerate
  211. */
  212.  
  213.  
  214.  
  215.  
  216.  
  217.         initial
  218.         begin
  219.                 rst_n  = 1'b0;
  220.                 can_go = 1'b0;
  221.  
  222.                 for(i=0;i<DEVNUM;i=i+1)
  223.                 begin
  224.                         //start[i]  = 1'b0;
  225.                         //rnw_in[i] = 1'b1;
  226.                         //addr[i]   = 21'h8001;
  227.                         //wd[i] = 1+i+(i<<2)+(i<<6);
  228.                 end
  229.  
  230.  
  231.                 repeat(4) @(posedge clk);
  232.  
  233.                 rst_n <= 1'b1;
  234.  
  235.                 repeat(10) @(posedge clk);
  236.  
  237.                 can_go <= 1'b1;
  238.  
  239.  
  240.  
  241.  
  242. /*              start[1] <= 1'b1;
  243.                 @(posedge ack[1]);
  244.                 start[1] <= 1'b0;
  245.  
  246.                 @(negedge inprogress[1]);
  247.  
  248.                 repeat (5) @(posedge clk);
  249.  
  250.  
  251.  
  252.                 rnw_in[1] = 1'b0;
  253.                 rnw_in[1] = 1'b1;
  254.                 rnw_in[1] = 1'b1;
  255.                 rnw_in[1] = 1'b1;
  256.                 start[0] = 1'b1;
  257.                 start[1] = 1'b1;
  258.                 start[2] = 1'b1;
  259.                 start[3] = 1'b1;
  260.  
  261.                 fork
  262.                 begin
  263.                         repeat (3) @(posedge ack[0]);
  264.                         start[0] <= 1'b0;
  265.                 end
  266.                 begin
  267.                         repeat (3) @(posedge ack[1]);
  268.                         start[1] <= 1'b0;
  269.                         repeat(9) @(posedge clk);
  270.                         start[1] <= 1'b1;
  271.                         repeat(2) @(posedge ack[1]);
  272.                         start[1] <= 1'b0;
  273.                 end
  274.                 begin
  275.                         repeat(13) @(posedge ack[2]);
  276.                         start[2] <= 1'b0;
  277.                 end
  278.                 begin
  279.                         repeat(17) @(posedge ack[3]);
  280.                         start[3] <= 1'b0;
  281.                 end
  282.                 join
  283. */
  284.  
  285. //              $stop;
  286.  
  287.  
  288.  
  289.         end
  290.  
  291.  
  292.  
  293.  
  294. endmodule
  295.  
  296.  
  297.  
  298.  
  299. module dmaer(
  300.  
  301.         input  wire clk,
  302.         input  wire rst_n,
  303.  
  304.         input  wire start,
  305.         input  wire rnw_in,
  306.  
  307.         output reg  inprogress,
  308.  
  309.         output reg  req,
  310.         output reg  rnw,
  311.         input  wire ack,
  312.         input  wire done
  313. );
  314.  
  315.  
  316.         initial
  317.         begin
  318.                 inprogress = 1'b0;
  319.                 req        = 1'b0;
  320.                 rnw        = 1'b1;
  321.         end
  322.  
  323.  
  324.         always @(negedge rst_n)
  325.         begin
  326.                 disable main_loop;
  327.  
  328.                 req = 1'b0;
  329.                 rnw = 1'b1;
  330.                 inprogress = 1'b0;
  331.         end
  332.  
  333.  
  334.         always
  335.         begin : main_loop
  336.  
  337.                 wait(rst_n);
  338.  
  339.                 wait(start);
  340.  
  341.               begin : dma_loop
  342.                         forever
  343.                         begin
  344.                                 inprogress <= 1'b1;
  345.                                 rnw <= rnw_in;
  346.                                 req <= 1'b1;
  347.  
  348.                                 @(negedge ack);
  349.                                 if( !start ) disable dma_loop;
  350.                         end
  351.                 end
  352.  
  353.                 req <= 1'b0;
  354.                 wait(done);/*@(posedge done);*/
  355.                 inprogress <= 1'b0;
  356.         end
  357.  
  358.  
  359.  
  360. endmodule
  361.  
  362.