reg have_instruction;
- reg have_token;
- reg have_data;
- reg send_token;
- reg send_data;
+ reg need_to_read_token;
+ reg need_to_read_data;
+ reg need_to_send_token;
+ reg need_to_send_data;
reg parse_instruction;
reg do_recycle;
+ reg fire_ok;
reg [(`COUNT_BITS-1):0] kill_count;
reg [(`INSTRUCTION_WIDTH-1):0] instruction;
parse_instruction = 0;
end
- end else begin
+ end else if (fire_ok) begin
+ if (need_to_send_data) begin
+ `onwrite(`data_out_r, `data_out_a)
+ need_to_send_data = 0;
+ end
- if (!have_instruction && !parse_instruction) begin
- `onread(instr_r2, instr_a2)
- instruction = instr_d2;
- parse_instruction = 1;
+ end else if (need_to_send_token) begin
+ `onwrite(`token_out_r, `token_out_a)
+ need_to_send_token = 0;
end
+
+ end else begin
+ fire_ok = 0;
+ case (`instruction_count(instruction))
+ 0: begin end
+ 1: have_instruction = 0;
+ default: `instruction_count(instruction) = `instruction_count(instruction) - 1;
+ endcase
+ if (have_instruction && `instruction_bit_recycle(instruction)) begin
+ do_recycle = 1;
+ end else begin
+ parse_instruction = have_instruction;
+ end
+ end
+
+ end else if (!have_instruction && !parse_instruction) begin
+ `onread(instr_r2, instr_a2)
+ instruction = instr_d2;
+ parse_instruction = 1;
end
+ end else begin
// FIXME: actually don't want to kill partway through an instruction
`onread(kill_r, kill_a)
kill_count = kill_count + kill_d;
end
if (parse_instruction) begin
- have_token = !`instruction_bit_tokenin(instruction);
- have_data = !`instruction_bit_datain(instruction);
- `packet_dest(`data_out_d) = `instruction_bit_dest(instruction);
- send_data = !`instruction_bit_dataout(instruction);
- send_token = !`instruction_bit_tokenout(instruction);
+ need_to_read_token = `instruction_bit_tokenin(instruction);
+ need_to_read_data = `instruction_bit_datain(instruction);
+ `packet_dest(`data_out_d) = `instruction_bit_dest(instruction);
+ `packet_dest(`token_out_d) = `instruction_bit_dest(instruction);
+ need_to_send_data = `instruction_bit_dataout(instruction);
+ need_to_send_token = `instruction_bit_tokenout(instruction);
have_instruction = 1;
parse_instruction = 0;
end
-/*
- if (!`token_in_r && `token_in_a) `token_in_a = 0;
- if (!`data_in_r && `data_in_a) `data_in_a = 0;
- if (`token_out_r && `token_out_a) `token_out_r = 0;
- if (`data_out_r && `data_out_a) `data_out_r = 0;
+
+ // return to zero
+ if (!`token_in_r && `token_in_a) `token_in_a = 0;
+ if (!`data_in_r && `data_in_a) `data_in_a = 0;
+
if (have_instruction &&
- (have_token || `token_in_r) &&
- (have_data || `data_in_r) &&
- (send_data || !`data_out_a) &&
- (send_token || !`token_out_a) &&
+ (!need_to_read_token || (`token_in_r && !`token_in_a)) &&
+ (!need_to_read_data || (`data_in_r && !`data_in_a))
) begin
- if (!have_token) begin
- token_in_a = 1;
- have_token = 1;
- end
- if (!have_data) begin
- data_in_a = 1;
- have_data = 1;
- end
- fire_ok = 1;
- end
-
- if (fire_ok) begin
- if (send_data) begin
- `onwrite(`data_out_r, `data_out_a)
- send_data = 0;
- end
+ if (need_to_read_token) begin
+ `token_in_a = 1;
+ need_to_read_token = 0;
end
- if (send_token) begin
- `onwrite(`token_out_r, `token_out_a)
- send_token = 0;
- end
+ if (need_to_read_data) begin
+ `data_in_a = 1;
+ need_to_read_data = 0;
end
- if (!send_data && !send_token) begin
- fire_ok = false;
-// die here
- end
- end
-*/
- if (have_instruction && !have_token) begin
- `onread(`token_in_r, `token_in_a)
- have_token = 1;
- end
- end
-
- if (have_instruction && !have_data) begin
- `onread(`data_in_r, `data_in_a)
- if (`instruction_bit_latch(instruction)) begin
- `packet_data(`data_out_d) = `data_in_d;
- end
- have_data = 1;
- end
- end
-
- if (have_instruction && have_data && have_token) begin
- // FIXME: add token send on diff port
- if (!send_data || !send_token) begin
- `onwrite(`data_out_r, `data_out_a)
- send_data = 1;
- send_token = 1;
- end
+ if (`instruction_bit_latch(instruction)) begin
+ `packet_data(`data_out_d) = `data_in_d;
end
+ fire_ok = 1;
end
- if (have_instruction && have_data && have_token && send_data && send_token) begin
-
- case (`instruction_count(instruction))
- 0: begin end
- 1: have_instruction = 0;
- default: `instruction_count(instruction) = `instruction_count(instruction) - 1;
- endcase
-
- if (have_instruction && `instruction_bit_recycle(instruction)) begin
- do_recycle = 1;
- end else begin
- parse_instruction = have_instruction;
- end
-
- end
end
end