1 /* Behavioural of our SRAM chips */
2 module sim_sram512x16(input [18:0] addr,
12 reg [15:0] mem[0:'h7ffff];
16 /* Simplified model, roughly based on a IS64LV6416L model adapted
17 * to look like our AS6C8016
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];
31 always@(addr or w_en) 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
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];
49 $display("initializing RAM...");
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;