2 reg need_to_read_token;
4 reg need_to_send_token;
9 reg kill_only_standing;
10 reg [(`COUNT_BITS-1):0] kill_count;
11 reg [(`INSTRUCTION_WIDTH-1):0] instruction;
13 wire [(`INSTRUCTION_WIDTH-1):0] instr_d2;
14 wire [(`INSTRUCTION_WIDTH-1):0] instr_d0;
18 reg [(`COUNT_WIDTH-1+1):0] kill_d;
20 reg [(`INSTRUCTION_WIDTH-1):0] kinstruction;
25 always @(posedge clk) begin
27 `onread(instr_r, instr_a)
29 kinstruction = instr_d;
32 if (`instruction_is_kill(kinstruction)) begin
33 kill_d = { `instruction_bit_kill_only_standing(kinstruction), `instruction_count(kinstruction) };
34 `onwrite(kill_r, kill_a)
38 `onwrite(instr_rx, instr_ax)
47 assign recycle_r_ = recycle_r;
49 wire [(`INSTRUCTION_WIDTH-1):0] recycle_inst;
50 assign recycle_inst = instruction;
54 assign instr_a2_ = instr_a2;
56 funnel ifunnel(clk, instr_r0, instr_a0, instr_d0,
57 instr_rx, instr_ax, kinstruction,
58 recycle_r_, recycle_a, recycle_inst);
60 fifo4 ififo(clk, instr_r0, instr_a0, instr_d0,
61 instr_r2, instr_a2_, instr_d2);
63 always @(posedge clk) begin
66 `onwrite(recycle_r, recycle_a)
69 parse_instruction = 0;
72 end else if (fire_ok) begin
73 if (need_to_send_data) begin
74 `onwrite(`data_out_r, `data_out_a)
75 need_to_send_data = 0;
78 end else if (need_to_send_token) begin
79 `onwrite(`token_out_r, `token_out_a)
80 need_to_send_token = 0;
85 case (`instruction_count(instruction))
87 1: have_instruction = 0;
88 default: `instruction_count(instruction) = `instruction_count(instruction) - 1;
90 if (have_instruction && `instruction_bit_recycle(instruction)) begin
93 parse_instruction = have_instruction;
97 end else if (!have_instruction && !parse_instruction) begin
98 `onread(instr_r2, instr_a2)
99 instruction = instr_d2;
100 parse_instruction = 1;
104 // FIXME: actually don't want to kill partway through an instruction
105 `onread(kill_r, kill_a)
106 kill_only_standing = kill_d[`COUNT_WIDTH];
107 kill_count = kill_count + kill_d[(`COUNT_WIDTH-1):0];
110 if ((parse_instruction || have_instruction) && (kill_count > 0) &&
111 (!kill_only_standing || `instruction_count(instruction)==0))
113 kill_count = kill_count - 1;
114 have_instruction = 0;
115 parse_instruction = 0;
118 if (parse_instruction) begin
119 need_to_read_token = `instruction_bit_tokenin(instruction);
120 need_to_read_data = `instruction_bit_datain(instruction);
121 `packet_dest(`data_out_d) = `instruction_bit_dest(instruction);
122 `packet_dest(`token_out_d) = `instruction_bit_dest(instruction);
123 need_to_send_data = `instruction_bit_dataout(instruction);
124 need_to_send_token = `instruction_bit_tokenout(instruction);
125 have_instruction = 1;
126 parse_instruction = 0;
130 if (!`token_in_r && `token_in_a) `token_in_a = 0;
131 if (!`data_in_r && `data_in_a) `data_in_a = 0;
133 if (have_instruction &&
134 (!need_to_read_token || (`token_in_r && !`token_in_a)) &&
135 (!need_to_read_data || (`data_in_r && !`data_in_a))
137 if (need_to_read_token) begin
139 need_to_read_token = 0;
141 if (need_to_read_data) begin
143 need_to_read_data = 0;
145 if (`instruction_bit_latch(instruction)) begin
146 `packet_data(`data_out_d) = `data_in_d;