📄 wb_mast_model.v
字号:
///////////////////////////////////////////////////////////////////////// //////// WISHBONE Master Model //////// //////// //////// Author: Rudolf Usselmann //////// rudi@asics.ws //////// //////// //////// Downloaded from: http://www.opencores.org/cores/wb_dma/ //////// ///////////////////////////////////////////////////////////////////////////// //////// Copyright (C) 2000-2002 Rudolf Usselmann //////// www.asics.ws //////// rudi@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: wb_mast_model.v,v 1.3 2002/02/01 01:55:44 rudi Exp $//// $Date: 2002/02/01 01:55:44 $// $Revision: 1.3 $// $Author: rudi $// $Locker: $// $State: Exp $//// Change History:// $Log: wb_mast_model.v,v $// Revision 1.3 2002/02/01 01:55:44 rudi//// - Minor cleanup//// Revision 1.2 2001/09/07 15:34:36 rudi//// Changed reset to active high.//// Revision 1.1 2001/07/29 08:57:02 rudi////// 1) Changed Directory Structure// 2) Added restart signal (REST)//// Revision 1.1.1.1 2001/03/19 13:11:34 rudi// Initial Release//////`include "wb_model_defines.v"module wb_mast(clk, rst, adr, din, dout, cyc, stb, sel, we, ack, err, rty);input clk, rst;output [31:0] adr;input [31:0] din;output [31:0] dout;output cyc, stb;output [3:0] sel;output we;input ack, err, rty;//////////////////////////////////////////////////////////////////////// Local Wires//parameter mem_size = 4096;reg [31:0] adr;reg [31:0] dout;reg cyc, stb;reg [3:0] sel;reg we;reg [31:0] rd_mem[mem_size:0];reg [31:0] wr_mem[mem_size:0];integer rd_cnt;integer wr_cnt;//////////////////////////////////////////////////////////////////////// Memory Logic//initial begin //adr = 32'hxxxx_xxxx; //adr = 0; adr = 32'hffff_ffff; dout = 32'hxxxx_xxxx; cyc = 0; stb = 0; sel = 4'hx; we = 1'hx; rd_cnt = 0; wr_cnt = 0; #1; $display("\nINFO: WISHBONE MASTER MODEL INSTANTIATED (%m)\n"); endtask mem_fill;integer n;beginrd_cnt = 0;wr_cnt = 0;for(n=0;n<mem_size;n=n+1) begin rd_mem[n] = $random; wr_mem[n] = $random; endendendtask//////////////////////////////////////////////////////////////////////// Write 1 Word Task//task wb_wr1;input [31:0] a;input [3:0] s;input [31:0] d;begin@(posedge clk);#1;adr = a;dout = d;cyc = 1;stb = 1;we=1;sel = s;@(posedge clk);while(~ack & ~err) @(posedge clk);#1;cyc=0;stb=0;adr = 32'hxxxx_xxxx;//adr = 32'hffff_ffff;//adr = 0;dout = 32'hxxxx_xxxx;we = 1'hx;sel = 4'hx;endendtask//////////////////////////////////////////////////////////////////////// Write 4 Words Task//task wb_wr4;input [31:0] a;input [3:0] s;input delay;input [31:0] d1;input [31:0] d2;input [31:0] d3;input [31:0] d4;integer delay;begin@(posedge clk);#1;cyc = 1;sel = s;repeat(delay) begin @(posedge clk); #1; endadr = a;dout = d1;stb = 1;we=1;while(~ack & ~err) @(posedge clk);#2;stb=0;we=1'bx;dout = 32'hxxxx_xxxx;repeat(delay) begin @(posedge clk); #1; endstb=1;adr = a+4;dout = d2;we=1;@(posedge clk);while(~ack & ~err) @(posedge clk);#2;stb=0;we=1'bx;dout = 32'hxxxx_xxxx;repeat(delay) begin @(posedge clk); #1; endstb=1;adr = a+8;dout = d3;we=1;@(posedge clk);while(~ack & ~err) @(posedge clk);#2;stb=0;we=1'bx;dout = 32'hxxxx_xxxx;repeat(delay) begin @(posedge clk); #1; endstb=1;adr = a+12;dout = d4;we=1;@(posedge clk);while(~ack & ~err) @(posedge clk);#1;stb=0;cyc=0;adr = 32'hxxxx_xxxx;//adr = 0;//adr = 32'hffff_ffff;dout = 32'hxxxx_xxxx;we = 1'hx;sel = 4'hx;endendtasktask wb_wr_mult;input [31:0] a;input [3:0] s;input delay;input count;integer delay;integer count;integer n;begin@(posedge clk);#1;cyc = 1;for(n=0;n<count;n=n+1) begin repeat(delay) begin @(posedge clk); #1; end adr = a + (n*4); dout = wr_mem[n + wr_cnt]; stb = 1; we=1; sel = s; if(n!=0) @(posedge clk); while(~ack & ~err) @(posedge clk); #2; stb=0; we=1'bx; sel = 4'hx; dout = 32'hxxxx_xxxx; adr = 32'hxxxx_xxxx; endcyc=0;adr = 32'hxxxx_xxxx;//adr = 32'hffff_ffff;wr_cnt = wr_cnt + count;endendtasktask wb_rmw;input [31:0] a;input [3:0] s;input delay;input rcount;input wcount;integer delay;integer rcount;integer wcount;integer n;begin@(posedge clk);#1;cyc = 1;we = 0;sel = s;repeat(delay) @(posedge clk);for(n=0;n<rcount-1;n=n+1) begin adr = a + (n*4); stb = 1; while(~ack & ~err) @(posedge clk); rd_mem[n + rd_cnt] = din; //$display("Rd Mem[%0d]: %h", (n + rd_cnt), rd_mem[n + rd_cnt] ); #2; stb=0; we = 1'hx; sel = 4'hx; adr = 32'hxxxx_xxxx; repeat(delay) begin @(posedge clk); #1; end we = 0; sel = s; endadr = a+(n*4);stb = 1;@(posedge clk);while(~ack & ~err) @(posedge clk);rd_mem[n + rd_cnt] = din;//$display("Rd Mem[%0d]: %h", (n + rd_cnt), rd_mem[n + rd_cnt] );#1;stb=0;we = 1'hx;sel = 4'hx;adr = 32'hxxxx_xxxx;rd_cnt = rd_cnt + rcount;//@(posedge clk);for(n=0;n<wcount;n=n+1) begin repeat(delay) begin @(posedge clk); #1; end adr = a + (n*4); dout = wr_mem[n + wr_cnt]; stb = 1; we=1; sel = s;// if(n!=0) @(posedge clk); while(~ack & ~err) @(posedge clk); #2; stb=0; we=1'bx; sel = 4'hx; dout = 32'hxxxx_xxxx; adr = 32'hxxxx_xxxx; endcyc=0;adr = 32'hxxxx_xxxx;//adr = 32'hffff_ffff;wr_cnt = wr_cnt + wcount;endendtasktask wb_wmr;input [31:0] a;input [3:0] s;input delay;input rcount;input wcount;integer delay;integer rcount;integer wcount;integer n;begin@(posedge clk);#1;cyc = 1;we = 1'bx;sel = 4'hx;sel = s;for(n=0;n<wcount;n=n+1) begin repeat(delay) begin @(posedge clk); #1; end adr = a + (n*4); dout = wr_mem[n + wr_cnt]; stb = 1; we=1; sel = s; @(posedge clk); while(~ack & ~err) @(posedge clk); #2; stb=0; we=1'bx; sel = 4'hx; dout = 32'hxxxx_xxxx; adr = 32'hxxxx_xxxx; endwr_cnt = wr_cnt + wcount;stb=0;repeat(delay) @(posedge clk);#1;sel = s;we = 0;for(n=0;n<rcount-1;n=n+1) begin adr = a + (n*4); stb = 1; while(~ack & ~err) @(posedge clk); rd_mem[n + rd_cnt] = din; //$display("Rd Mem[%0d]: %h", (n + rd_cnt), rd_mem[n + rd_cnt] ); #2; stb=0; we = 1'hx; sel = 4'hx; adr = 32'hxxxx_xxxx; repeat(delay) begin @(posedge clk); #1; end we = 0; sel = s; endadr = a+(n*4);stb = 1;@(posedge clk);while(~ack & ~err) @(posedge clk);rd_mem[n + rd_cnt] = din;rd_cnt = rd_cnt + rcount;//$display("Rd Mem[%0d]: %h", (n + rd_cnt), rd_mem[n + rd_cnt] );#1;cyc = 0;stb = 0;we = 1'hx;sel = 4'hx;adr = 32'hxxxx_xxxx;endendtask//////////////////////////////////////////////////////////////////////// Read 1 Word Task//task wb_rd1;input [31:0] a;input [3:0] s;output [31:0] d;begin@(posedge clk);#1;adr = a;cyc = 1;stb = 1;we = 0;sel = s;//@(posedge clk);while(~ack & ~err) @(posedge clk);d = din;#1;cyc=0;stb=0;//adr = 32'hxxxx_xxxx;//adr = 0;adr = 32'hffff_ffff;dout = 32'hxxxx_xxxx;we = 1'hx;sel = 4'hx;endendtask//////////////////////////////////////////////////////////////////////// Read 4 Words Task//task wb_rd4;input [31:0] a;input [3:0] s;input delay;output [31:0] d1;output [31:0] d2;output [31:0] d3;output [31:0] d4;integer delay;begin@(posedge clk);#1;cyc = 1;we = 0;sel = s;repeat(delay) @(posedge clk);adr = a;stb = 1;while(~ack & ~err) @(posedge clk);d1 = din;#2;stb=0;we = 1'hx;sel = 4'hx;repeat(delay) begin @(posedge clk); #1; endwe = 0;sel = s;adr = a+4;stb = 1;@(posedge clk);while(~ack & ~err) @(posedge clk);d2 = din;#2;stb=0;we = 1'hx;sel = 4'hx;repeat(delay) begin @(posedge clk); #1; endwe = 0;sel = s;adr = a+8;stb = 1;@(posedge clk);while(~ack & ~err) @(posedge clk);d3 = din;#2;stb=0;we = 1'hx;sel = 4'hx;repeat(delay) begin @(posedge clk); #1; endwe = 0;sel = s;adr = a+12;stb = 1;@(posedge clk);while(~ack & ~err) @(posedge clk);d4 = din;#1;stb=0;cyc=0;we = 1'hx;sel = 4'hx;adr = 32'hffff_ffff;endendtasktask wb_rd_mult;input [31:0] a;input [3:0] s;input delay;input count;integer delay;integer count;integer n;begin@(posedge clk);#1;cyc = 1;we = 0;sel = s;repeat(delay) @(posedge clk);for(n=0;n<count-1;n=n+1) begin adr = a + (n*4); stb = 1; while(~ack & ~err) @(posedge clk); rd_mem[n + rd_cnt] = din; #2; stb=0; we = 1'hx; sel = 4'hx; adr = 32'hxxxx_xxxx; repeat(delay) begin @(posedge clk); #1; end we = 0; sel = s; endadr = a+(n*4);stb = 1;@(posedge clk);while(~ack & ~err) @(posedge clk);rd_mem[n + rd_cnt] = din;#1;stb=0;cyc=0;we = 1'hx;sel = 4'hx;adr = 32'hffff_ffff;adr = 32'hxxxx_xxxx;rd_cnt = rd_cnt + count;endendtaskendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -