4a6d858cdd587b6558f07f5b97cb1d35ecd9a2ec
[fleet.git] / src / edu / berkeley / fleet / slipway / outboxcore.v
1 `include "macros.v"
2
3 module outboxcore(clk,
4                   instr_r,       instr_a_,      instr_d,
5                   fabric_in_r,   fabric_in_a_,  fabric_in_d,
6                   fabric_out_r_, fabric_out_a,  fabric_out_d_,
7                   ship_r,        ship_a_,       ship_d,
8                   kill_r,        kill_a_,       kill_d,
9                   recycle_r_,    recycle_a,     recycle_d_
10                  );
11   input clk;
12   reg have_instruction;
13   reg have_token;
14   reg have_data;
15   reg send_token;
16   reg send_data;
17   reg parse_instruction;
18   reg do_recycle;
19   reg [(`COUNT_BITS-1):0]        kill_count;
20   reg [(`INSTRUCTION_WIDTH-1):0] instruction;
21
22   `input(instr_r,       instr_a,       instr_a_,       [(`INSTRUCTION_WIDTH-1):0], instr_d)
23   `input(fabric_in_r,   fabric_in_a,   fabric_in_a_,   [(`PACKET_WIDTH-1):0],      fabric_in_d)
24   `output(fabric_out_r, fabric_out_r_, fabric_out_a,   [(`PACKET_WIDTH-1):0],      fabric_out_d_)
25   `defreg(fabric_out_d_,      [(`PACKET_WIDTH-1):0], fabric_out_d)
26   `input(ship_r,        ship_a,        ship_a_,        [(`DATAWIDTH-1):0],         ship_d)
27   `input(kill_r,        kill_a,        kill_a_,        [(`COUNT_WIDTH-1):0],       kill_d)
28   `output(recycle_r, recycle_r_, recycle_a,   [(`INSTRUCTION_WIDTH-1):0],      recycle_d_)
29   assign recycle_d_ = instruction;
30
31   always @(posedge clk) begin
32
33     if (do_recycle) begin
34       `onwrite(recycle_r, recycle_a)
35         do_recycle = 0;
36       end
37
38     end else begin
39
40       if (!have_instruction && !parse_instruction) begin
41         `onread(instr_r, instr_a)
42           instruction                 = instr_d;
43           parse_instruction           = 1;
44         end
45       end
46
47       /*  
48       // FIXME: actually don't want to kill partway through an instruction
49       `onread(kill_r, kill_a)
50         kill_count = kill_d;
51       end
52
53       if (have_instruction && (kill_count > 0)) begin
54         kill_count = kill_count - 1;
55         have_instruction = 0;
56       end
57       */  
58
59       if (parse_instruction) begin
60         have_token                  = !`instruction_bit_tokenin(instruction);
61         have_data                   = !`instruction_bit_datain(instruction);
62         `packet_dest(fabric_out_d)  =  `instruction_bit_dest(instruction);
63         send_data                   = !`instruction_bit_dataout(instruction);
64         send_token                  = !`instruction_bit_tokenout(instruction);
65         have_instruction            = 1;
66         parse_instruction = 0;
67       end
68
69       if (have_instruction && !have_token) begin
70         `onread(fabric_in_r, fabric_in_a)
71           have_token = 1;
72         end
73       end
74   
75       if (have_instruction && !have_data) begin
76         `onread(ship_r, ship_a)
77           if (`instruction_bit_latch(instruction)) begin
78             `packet_data(fabric_out_d) = ship_d;
79           end
80           have_data = 1;
81         end
82       end
83
84       if (have_instruction && have_data && have_token) begin
85         if (!send_data || !send_token) begin
86           `onwrite(fabric_out_r, fabric_out_a)
87             send_data = 1;
88             send_token = 1;
89           end
90         end
91       end
92
93       if (have_instruction && have_data && have_token && send_data && send_token) begin
94         if (`instruction_count(instruction)==1) begin
95           have_instruction = 0;
96         end else begin
97           have_instruction = 0;
98           if (`instruction_count(instruction)>0) begin
99             `instruction_count(instruction) = `instruction_count(instruction) - 1;
100           end
101           if (`instruction_bit_recycle(instruction)) begin
102             have_instruction = 0;
103             do_recycle = 1;
104           end else begin
105             parse_instruction = 1;
106           end
107         end
108       end
109     end
110   end  
111 endmodule
112