]> git.ozlabs.org Git - minimigmac.git/blob - fpga/sim_sram.v
Add GPL v2
[minimigmac.git] / fpga / sim_sram.v
1 /* Behavioural of our SRAM chips */
2 module sim_sram512x16(input [18:0]      addr,
3                       input             _cs,
4                       input             _oe,
5                       input             _we,
6                       input             _ub,
7                       input             _lb,
8                       inout [15:0]      data);
9         
10
11         reg             sel;
12         reg [15:0]      mem[0:'h7ffff];
13         reg [15:0]      dlatch;
14         wire [15:0]     dout;   
15
16         /* Simplified model, roughly based on a IS64LV6416L model adapted
17          * to look like our AS6C8016
18          */
19         parameter Taa   = 55;
20         parameter Toh   = 10;
21         parameter Tchz  = 20;
22         parameter Tas   = 0;
23         parameter Twhz  = 20;
24
25         wire            r_en = _we & (~_cs) & (~_oe);
26         wire            w_en = (~_we) & (~_cs) & ((~_ub) | (~_lb));
27         assign #(r_en ? Taa : Tchz) data = r_en ? dout : 16'bz;   
28         assign dout[ 7:0] = _lb ? 8'bz : mem[addr][ 7:0];
29         assign dout[15:8] = _ub ? 8'bz : mem[addr][15:8];
30
31         always@(addr or w_en) begin
32                 #Tas
33                   if (w_en)
34                     #Twhz begin
35                             /* XXX Something's wrong with iverilog. It appears that
36                              * the if (w_en) above isn't enough, if I don't also test
37                              * w_en in the assignment belwow, it -will- write spuriously
38                              * to the RAMs even when w_en has never kicked for a while
39                              * and I really have no idea why. --BenH
40                              */
41                             mem[addr][ 7:0] = _lb | ~w_en ?mem[addr][ 7:0] : data[ 7:0];
42                             mem[addr][15:8] = _ub | ~w_en ?mem[addr][15:8] : data[15:8];
43                     end
44         end
45
46 `ifdef foo
47         initial begin
48                 
49                 $display("initializing RAM...");
50                 mem[0] = 0;
51                 mem[1] = 'h2000 - 16;
52                 mem[2] = 0;
53                 mem[3] = 'h1000;
54                 // 1000:       303c 000a       movew #10,%d0    
55                 mem['h1000/2] = 'h303c;
56                 mem['h1002/2] = 'h000a;
57                 // 1004:       41fa 001a       lea %pc@(1020 <_buf>),%a0
58                 mem['h1004/2] = 'h41fa;
59                 mem['h1006/2] = 'h001a;                             
60                 // 1008:       3080            movew %d0,%a0@
61                 mem['h1008/2] = 'h3080;                             
62                 // 100a:       0640 0001       addiw #1,%d0
63                 mem['h100a/2] = 'h0640;
64                 mem['h100c/2] = 'h0001;
65                 // 100e:       6000 fff4       braw 1004
66                 mem['h100e/2] = 'h6000;
67                 mem['h1010/2] = 'hfff4;
68                 $display("done");
69         end // initial begin
70 `endif
71         
72 endmodule