add flush support to ships
[fleet.git] / ships / DRAM.ship
1 ship: DRAM
2
3 == Ports ===========================================================
4 data  in:    inAddrRead
5 data  in:    inAddrWrite
6 data  in:    inDataWrite
7
8 data  out:   out
9
10 == TeX ==============================================================
11
12 == Fleeterpreter ====================================================
13     public void service() { }
14 == FleetSim ==============================================================
15
16 == FPGA ==============================================================
17
18   reg         dram_addr_r;
19   reg         dram_isread;
20   reg         dram_write_data_push;
21   reg         dram_read_data_pop;
22   reg  [`DATAWIDTH:0]  out_d;
23   wire [31:0] dram_addr__;
24
25   assign dram_addr_r_ = dram_addr_r;
26   assign dram_isread_ = dram_isread;
27   assign dram_addr__ = !dram_isread ? inAddrWrite_d[31:0] : inAddrRead_d[31:0];
28   assign dram_addr_  = { dram_addr__[30:6], 1'b0, dram_addr__[5:0] };
29   assign dram_write_data_push_ = dram_write_data_push;
30   assign dram_read_data_pop_ = dram_read_data_pop;
31   assign dram_write_data_ = inDataWrite_d;
32 //  assign dram_write_data_ = inDataWrite_d[(`DATAWIDTH-1):0];
33   assign out_d_ = out_d;
34
35   always @(posedge clk) begin
36
37     if (!rst) begin
38       `reset
39       dram_isread <= 0;
40       dram_addr_r <= 0;
41       dram_read_data_pop <= 0;
42
43     end else begin
44       `flush
45
46       if (!inAddrRead_r_  && inAddrRead_a)  inAddrRead_a  <= 0;
47       if (!inDataWrite_r_ && inDataWrite_a) inDataWrite_a <= 0;
48       if (!inAddrWrite_r_ && inAddrWrite_a) inAddrWrite_a <= 0;
49       if ( out_r          && out_a)         out_r <= 0;
50
51       if (dram_addr_r && !dram_addr_a) begin
52          // busy
53       end else if (dram_addr_r &&  dram_addr_a && !dram_isread) begin
54           dram_addr_r <= 0;
55           inAddrWrite_a <= 1;
56           inDataWrite_a <= 1;
57           out_d <= { 1'b1, 37'b0 };
58           out_r <= 1;
59       end else if (dram_addr_r &&  dram_addr_a && dram_isread) begin
60           dram_addr_r <= 0;
61           inAddrRead_a <= 1;
62           out_d <= { 1'b0, dram_read_data[36:0] };
63           out_r <= 1;
64       end else if (!out_r && !out_a && inAddrWrite_r && !inAddrWrite_a && inDataWrite_r && !inDataWrite_a && !dram_addr_r && !dram_addr_a) begin
65           dram_addr_r <= 1;
66           dram_isread <= 0;
67       end else if (!out_r && !out_a && inAddrRead_r && !inAddrRead_a && !dram_addr_r && !dram_addr_a) begin
68           dram_addr_r <= 1;
69           dram_isread <= 1;
70       end
71     end
72   end
73
74
75 == Test ========================================================
76 #skip
77
78 == Constants ========================================================
79
80 == Contributors =========================================================
81 Adam Megacz <megacz@cs.berkeley.edu>