OpenCores
URL https://opencores.org/ocsvn/aemb/aemb/trunk

Subversion Repositories aemb

[/] [aemb/] [tags/] [AEMB_7_05/] [sim/] [verilog/] [testbench.v] - Blame information for rev 37

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 18 sybreon
/*
2 31 sybreon
 * $Id: testbench.v,v 1.4 2007-04-30 15:56:50 sybreon Exp $
3 18 sybreon
 *
4
 * AEMB Generic Testbench
5 30 sybreon
 * Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
6 18 sybreon
 *
7 30 sybreon
 * This library is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public License
9
 * as published by the Free Software Foundation; either version 2.1 of
10
 * the License, or (at your option) any later version.
11 18 sybreon
 *
12 30 sybreon
 * This library is distributed in the hope that it will be useful, but
13
 * WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
 * Lesser General Public License for more details.
16 18 sybreon
 *
17 30 sybreon
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library; if not, write to the Free Software
19
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20
 * USA
21 18 sybreon
 *
22
 * DESCRIPTION
23
 * Top level test bench and fake RAM/ROM.
24
 *
25
 * HISTORY
26
 * $Log: not supported by cvs2svn $
27 31 sybreon
 * Revision 1.3  2007/04/27 15:18:43  sybreon
28
 * Minor updates as sw/c/aeMB_testbench.c got updated.
29
 *
30 30 sybreon
 * Revision 1.2  2007/04/25 22:15:05  sybreon
31
 * Added support for 8-bit and 16-bit data types.
32
 *
33 22 sybreon
 * Revision 1.1  2007/04/12 20:21:34  sybreon
34
 * Moved testbench into /sim/verilog.
35
 * Simulation cleanups.
36 18 sybreon
 *
37
 */
38
 
39
module testbench ();
40
   parameter ISIZ = 16;
41
   parameter DSIZ = 16;
42 22 sybreon
 
43 18 sybreon
 
44 22 sybreon
   // INITIAL SETUP //////////////////////////////////////////////////////
45
 
46
   reg       sys_clk_i, sys_rst_i, sys_int_i, sys_exc_i;
47
   always #5 sys_clk_i = ~sys_clk_i;
48 18 sybreon
 
49
   initial begin
50 31 sybreon
      //$dumpfile("dump.vcd");
51
      //$dumpvars(1,dut);
52 18 sybreon
   end
53
 
54
   initial begin
55
      sys_clk_i = 1;
56
      sys_rst_i = 0;
57
      sys_int_i = 0;
58
      sys_exc_i = 0;
59
      #10 sys_rst_i = 1;
60
      #10000 sys_int_i = 1;
61
      #100 sys_int_i = 0;
62
   end
63
 
64
   initial fork
65
      //#100000 $displayh("\nTest Completed."); 
66
      //#11000 $finish;
67
   join
68
 
69 22 sybreon
   // FAKE MEMORY ////////////////////////////////////////////////////////
70
 
71 18 sybreon
   wire [ISIZ-1:0] iwb_adr_o;
72 22 sybreon
   wire            iwb_stb_o;
73
   wire            dwb_stb_o;
74
   reg [31:0]       rom [0:65535];
75
   wire [31:0]      iwb_dat_i;
76
   reg             iwb_ack_i, dwb_ack_i;
77 18 sybreon
 
78 22 sybreon
   reg [31:0]       ram[0:65535];
79
   wire [31:0]      dwb_dat_i;
80
   reg [31:0]       dwblat;
81
   wire            dwb_we_o;
82
   reg [DSIZ-1:2]  dadr,iadr;
83
   wire [3:0]       dwb_sel_o;
84
   wire [31:0]      dwb_dat_o;
85 18 sybreon
   wire [DSIZ-1:0] dwb_adr_o;
86 22 sybreon
   wire [31:0]      dwb_dat_t;
87
 
88 31 sybreon
   assign          {dwb_dat_i[7:0],dwb_dat_i[15:8],dwb_dat_i[23:16],dwb_dat_i[31:24]} = ram[dadr];
89
   assign          {iwb_dat_i[7:0],iwb_dat_i[15:8],iwb_dat_i[23:16],iwb_dat_i[31:24]} = ram[iadr];
90
   assign          {dwb_dat_t} = ram[dwb_adr_o[DSIZ-1:2]];
91 22 sybreon
 
92 18 sybreon
   always @(posedge sys_clk_i) begin
93
      iwb_ack_i <= #1 iwb_stb_o;
94
      dwb_ack_i <= #1 dwb_stb_o;
95
      iadr <= #1 iwb_adr_o[ISIZ-1:2];
96 22 sybreon
      dadr <= dwb_adr_o[DSIZ-1:2];
97
 
98
      if (dwb_we_o & dwb_stb_o) begin
99
         case (dwb_sel_o)
100 31 sybreon
           4'h1: ram[dwb_adr_o[DSIZ-1:2]] <= {dwb_dat_o[7:0],dwb_dat_t[23:0]};
101
           4'h2: ram[dwb_adr_o[DSIZ-1:2]] <= {dwb_dat_t[31:24],dwb_dat_o[15:8],dwb_dat_t[15:0]};
102
           4'h4: ram[dwb_adr_o[DSIZ-1:2]] <= {dwb_dat_t[31:16],dwb_dat_o[23:16],dwb_dat_t[7:0]};
103
           4'h8: ram[dwb_adr_o[DSIZ-1:2]] <= {dwb_dat_t[31:8],dwb_dat_o[31:24]};
104
           4'h3: ram[dwb_adr_o[DSIZ-1:2]] <= {dwb_dat_o[7:0],dwb_dat_o[15:8],dwb_dat_t[15:0]};
105
           4'hC: ram[dwb_adr_o[DSIZ-1:2]] <= {dwb_dat_t[31:16],dwb_dat_o[23:16],dwb_dat_o[31:24]};
106
           4'hF: ram[dwb_adr_o[DSIZ-1:2]] <= {dwb_dat_o[7:0],dwb_dat_o[15:8],dwb_dat_o[23:16],dwb_dat_o[31:24]};
107 22 sybreon
         endcase // case (dwb_sel_o)     
108
      end
109 18 sybreon
   end
110
 
111
   integer i;
112
   initial begin
113
      for (i=0;i<65535;i=i+1) begin
114 31 sybreon
         ram[i] <= $random;
115 18 sybreon
      end
116 22 sybreon
      #1 $readmemh("aeMB.rom",ram);
117 18 sybreon
   end
118
 
119 22 sybreon
   // DISPLAY OUTPUTS ///////////////////////////////////////////////////
120
 
121 18 sybreon
   always @(negedge sys_clk_i) begin
122 22 sybreon
 
123 18 sybreon
      $write("\nT: ",$stime);
124
      if (iwb_stb_o & iwb_ack_i)
125
        $writeh("\tPC: 0x",iwb_adr_o,"=0x",iwb_dat_i);
126
      if (dwb_stb_o & dwb_we_o & dwb_ack_i)
127 22 sybreon
        $writeh("\tST: 0x",dwb_adr_o,"=0x",dwb_dat_o," S=0x",dwb_sel_o);
128 18 sybreon
      if (dwb_stb_o & ~dwb_we_o & dwb_ack_i)
129 22 sybreon
        $writeh("\tLD: 0x",dwb_adr_o,"=0x",dwb_dat_i," S=0x",dwb_sel_o);
130 18 sybreon
      if (dut.regfile.wDWE)
131 22 sybreon
        $writeh("\tR",dut.regfile.rRD_,"=",dut.regfile.wDDAT,";");
132 18 sybreon
 
133 30 sybreon
      if (dwb_we_o & (dwb_dat_o == "INTR"))
134
        $display("\t*** SERVICE ***");
135 18 sybreon
      if (dut.control.rFSM == 2'o1)
136 30 sybreon
        $display("\t*** INTERRUPT ***");
137 22 sybreon
 
138
      if (dwb_we_o & (dwb_dat_o == "FAIL")) begin
139
         $display("\tFAIL");
140
         $finish;
141
      end
142
      if (dwb_we_o & (dwb_dat_o == "PASS")) begin
143
         $display("\tPASS");
144
      end
145 31 sybreon
      if (iwb_dat_i == 32'hb8000000) begin
146 22 sybreon
         $display("\n\t*** PASSED ALL TESTS ***");
147
         $finish;
148
      end
149
   end // always @ (posedge sys_clk_i)
150 18 sybreon
 
151 22 sybreon
   // INTERNAL WIRING ////////////////////////////////////////////////////
152 18 sybreon
 
153
   aeMB_core #(ISIZ,DSIZ)
154
     dut (
155
          .sys_int_i(sys_int_i),.sys_exc_i(sys_exc_i),
156
          .dwb_ack_i(dwb_ack_i),.dwb_stb_o(dwb_stb_o),.dwb_adr_o(dwb_adr_o),
157
          .dwb_dat_o(dwb_dat_o),.dwb_dat_i(dwb_dat_i),.dwb_we_o(dwb_we_o),
158 22 sybreon
          .dwb_sel_o(dwb_sel_o),
159 18 sybreon
          .iwb_adr_o(iwb_adr_o),.iwb_dat_i(iwb_dat_i),.iwb_stb_o(iwb_stb_o),
160
          .iwb_ack_i(iwb_ack_i),
161
          .sys_clk_i(sys_clk_i), .sys_rst_i(sys_rst_i)
162
          );
163
 
164
endmodule // testbench

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.