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

Subversion Repositories rtf65002

[/] [rtf65002/] [trunk/] [rtl/] [verilog/] [rtf65002_tb.v] - Blame information for rev 5

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

Line No. Rev Author Line
1 5 robfinch
module rtf65002_tb();
2
 
3
integer n;
4
reg rst;
5
reg clk;
6
reg nmi;
7
wire wr;
8
wire [5:0] bl;
9
wire [3:0] sel;
10
wire [33:0] a;
11
tri [31:0] d;
12
wire [31:0] dato;
13
wire [31:0] dati;
14
wire cyc;
15
wire stb;
16
wire ack;
17
wire [7:0] udo;
18
 
19
initial begin
20
        clk = 1;
21
        rst = 0;
22
        nmi = 0;
23
        #100 rst = 1;
24
        #100 rst = 0;
25
        #500 nmi = 1;
26
        #10 nmi = 0;
27
end
28
 
29
always #1 clk = ~clk;   // 500 MHz
30
 
31
rtf65002d cpu0 (
32
        .rst_i(rst),
33
        .clk_i(clk),
34
        .nmi_i(nmi),
35
        .irq_i(1'b0),
36
        .bte_o(),
37
        .cti_o(),
38
        .bl_o(bl),
39
        .lock_o(),
40
        .cyc_o(cyc),
41
        .stb_o(stb),
42
        .ack_i(1'b1),
43
        .we_o(wr),
44
        .sel_o(sel),
45
        .adr_o(a),
46
        .dat_i(dati),
47
        .dat_o(dato)
48
);
49
 
50
wire uartcs = cyc && stb && a[33:8]==26'h00000CF;
51
wire romcs = ~(cyc && stb && a[33:28]==6'h0F);
52
wire ramcs = ~(cyc && stb && a[33:15]==19'h00);
53
wire romcs1 = ~(cyc && stb && a[33:13]==21'h07);        // E000
54
 
55
assign d = wr ? dato : 32'bz;
56
assign dati = ~romcs ? d : 32'bz;
57
assign dati = ~ramcs ? d : 32'bz;
58
assign dati = uartcs ? {4{udo}} : 32'bz;
59
assign dati = ~romcs1 ? d : 32'bz;
60
 
61
rom2Kx32 #(.MEMFILE("t65c.mem")) rom0(.ce(romcs), .oe(wr), .addr(a[12:2]), .d(d));
62
rom2Kx32 #(.MEMFILE("t65c.mem")) rom1(.ce(romcs1), .oe(wr), .addr(a[12:2]), .d(d));
63
ram8Kx32 ram0 (.clk(clk), .ce(ramcs), .oe(wr), .we(~wr), .sel(sel), .addr(a[14:2]), .d(d));
64
uart uart0(.clk(clk), .cs(uartcs), .wr(wr), .a(a[2:0]), .di(dato[7:0]), .do(udo));
65
 
66
always @(posedge clk) begin
67
        if (rst)
68
                n = 0;
69
        else
70
                n = n + 1;
71
        if ((n & 7)==0)
72
                $display("t   n  cti cyc we   addr din adnx do re vma wr ird sync vma nmi irq  PC  IR A  X  Y  SP nvmdizcb\n");
73
        $display("%d %d %b  %b  %b  %h %h %h %h %h %h %h %h %h %h %h %h %b%b%b%b%b%b%b%b %d %b %b %b %b %b",
74
                $time, n, cpu0.cti_o, cpu0.cyc_o, cpu0.we_o, cpu0.adr_o, cpu0.dat_i, cpu0.dat_o, cpu0.res, cpu0.res8, cpu0.pc, cpu0.ir,
75
                cpu0.acc, cpu0.x, cpu0.y, cpu0.isp, cpu0.sp,
76
                cpu0.nf, cpu0.vf, cpu0.df, cpu0.im, cpu0.zf, cpu0.cf, cpu0.bf, cpu0.em, cpu0.state, cpu0.imiss, cpu0.ihit,cpu0.hit0,cpu0.hit1,cpu0.imiss);
77
end
78
 
79
endmodule
80
 
81
/* ---------------------------------------------------------------
82
        rom2kx32.v -- external async 8Kx8 ROM Verilog model
83
        (simulation only)
84
 
85
        Note this module is a functional model, with no timing, and
86
  is only suitable for simulation, not synthesis.
87
--------------------------------------------------------------- */
88
 
89
module rom2Kx32(ce, oe, addr, d);
90
parameter MEMFILE = "t65002d.mem";
91
        input                   ce;     // active low chip enable
92
        input                   oe;     // active low output enable
93
        input   [10:0]   addr;   // byte address
94
        output  [31:0]   d;              // tri-state data I/O
95
        tri [31:0] d;
96
 
97
        reg             [7:0]    mem [0:8191];
98
 
99
        initial begin
100
                $readmemh (MEMFILE, mem);
101
//              $readmemh ("t65c.mem", mem);
102
                $display ("Loaded t65002d.mem");
103
                $display (" 000000: %h %h %h %h %h %h %h %h",
104
                        mem[0], mem[1], mem[2], mem[3], mem[4], mem[5], mem[6], mem[7]);
105
        end
106
 
107
        assign d = (~oe & ~ce) ? {mem[{addr,2'b11}],mem[{addr,2'b10}],mem[{addr,2'b01}],mem[{addr,2'b00}]} : 32'bz;
108
/*
109
        always @(oe or ce or addr) begin
110
//              $display (" 000000: %h %h %h %h %h %h %h %h %h %h",
111
//                      mem[0], mem[1], mem[2], mem[3], mem[4], mem[5], mem[6], mem[7], mem[8], mem[9]);
112
                $display (" read %h: %h", addr, mem[addr]);
113
        end
114
*/
115
endmodule
116
 
117
/* ---------------------------------------------------------------
118
        ram32kx8.v -- external sync 32Kx8 RAM Verilog model
119
        (simulation only)
120
 
121
        Note this module is a functional model, with no timing, and
122
  is only suitable for simulation, not synthesis.
123
--------------------------------------------------------------- */
124
 
125
module ram8Kx32(clk, ce, oe, we, sel, addr, d);
126
        input clk;
127
        input                   ce;             // active low chip enable
128
        input                   oe;             // active low output enable
129
        input                   we;             // active low write enable
130
        input [3:0] sel;         // byte lane selects
131
        input   [12:0]   addr;   // byte address
132
        output  [31:0]   d;              // tri-state data I/O
133
        tri [31:0] d;
134
 
135
        reg             [31:0]   mem [0:8191];
136
        integer nn;
137
 
138
        initial begin
139
                for (nn = 0; nn < 8192; nn = nn + 1)
140
                        mem[nn] <= 32'b0;
141
        end
142
 
143
        assign d = (~oe & ~ce & we) ? mem[addr] : 32'bz;
144
 
145
        always @(posedge clk) begin
146
                if (clk) begin
147
                        if (~ce & ~we) begin
148
                                if (sel[0]) mem[addr][7:0] <= d[7:0];
149
                                if (sel[1]) mem[addr][15:8] <= d[15:8];
150
                                if (sel[2]) mem[addr][23:16] <= d[23:16];
151
                                if (sel[3]) mem[addr][31:24] <= d[31:24];
152
                                $display (" wrote: %h with %h", addr, d);
153
                        end
154
                        if (~ce & we & ~oe)
155
                                $display (" read: %h val %h", addr, d);
156
                end
157
        end
158
/*
159
        always @(we or oe or ce or addr) begin
160
                if (ce==0)
161
                        $display (" 000000: %h %h %h %h %h %h %h %h %h %h",
162
                                mem[0], mem[1], mem[2], mem[3], mem[4], mem[5], mem[6], mem[7], mem[8], mem[9]);
163
        end
164
*/
165
endmodule
166
 
167
module uart(clk, cs, wr, a, di, do);
168
        input clk;
169
        input cs;
170
        input wr;
171
        input [2:0] a;
172
        input [7:0] di;
173
        output reg [7:0] do;
174
//      reg [7:0] do;
175
 
176
        reg [127:0] msg;
177
        integer msgn;
178
        integer logf,r;
179
 
180
        initial begin
181
                msgn <= 0;
182
        end
183
 
184
        always @(posedge clk)
185
                if (cs & wr) begin
186
                        if (di==8'h0A) begin
187
                                $display(" ");
188
                                $display("%s", msg);
189
                                $display (" ");
190
                                $stop;
191
                                msgn <= 0;
192
                                msg <= 0;
193
                        end
194
                        else begin
195
                                case(msgn)
196
                                0: msg[127:120] <= di;
197
                                1: msg[119:112] <= di;
198
                                2:      msg[111:104] <= di;
199
                                3:      msg[103:96] <= di;
200
                                4:      msg[95:88] <= di;
201
                                5:      msg[87:80] <= di;
202
                                6:      msg[79:72] <= di;
203
                                7:      msg[71:64] <= di;
204
                                endcase
205
                                msgn <= msgn + 1;
206
                        end
207
                end
208
 
209
//      always @(posedge clk)
210
//              if (cs & wr) begin
211
//                      logf = $fopen("uart_in", "a");
212
//                      r = $fdisplay(logf, "%h", di);
213
//                      $fclose(logf);
214
//              end
215
 
216
        always @(a)
217
        begin
218
                case(a)
219
                default:
220
                        do <= 8'h00;
221
                endcase
222
        end
223
 
224
//      assign do = 8'h00;
225
 
226
endmodule

powered by: WebSVN 2.1.0

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