|
| 1 | +module CyclotronTile #( |
| 2 | + parameter ARCH_LEN = 32, |
| 3 | + parameter INST_BITS = 64, |
| 4 | + parameter IMEM_TAG_BITS = 32, |
| 5 | + parameter DMEM_DATA_BITS = 32, |
| 6 | + parameter DMEM_TAG_BITS = 32, |
| 7 | + parameter NUM_WARPS = 8, |
| 8 | + parameter NUM_LANES = 16, |
| 9 | + parameter OP_BITS = 9, |
| 10 | + parameter REG_BITS = 8, |
| 11 | + parameter IMM_BITS = 32, |
| 12 | + parameter CSR_IMM_BITS = 8, |
| 13 | + parameter PRED_BITS = 4, |
| 14 | + localparam DMEM_SIZE_BITS = $clog2($clog2(DMEM_DATA_BITS / 8) + 1), |
| 15 | + localparam DMEM_MASK_BITS = (DMEM_DATA_BITS / 8), |
| 16 | + localparam OPNOEXT_BITS = 7, |
| 17 | + localparam OPEXT_BITS = 2, |
| 18 | + localparam WARP_ID_BITS = $clog2(NUM_WARPS), |
| 19 | + localparam WARP_COUNT_BITS = $clog2(NUM_WARPS+1) |
| 20 | +) ( |
| 21 | + input clock, |
| 22 | + input reset, |
| 23 | + |
| 24 | + output logic imem_req_valid, |
| 25 | + input logic imem_req_ready, |
| 26 | + output logic [ARCH_LEN-1:0] imem_req_bits_address, |
| 27 | + output logic [IMEM_TAG_BITS-1:0] imem_req_bits_tag, |
| 28 | + output logic imem_resp_ready, |
| 29 | + input logic imem_resp_valid, |
| 30 | + input logic [IMEM_TAG_BITS-1:0] imem_resp_bits_tag, |
| 31 | + input logic [INST_BITS-1:0] imem_resp_bits_data, |
| 32 | + |
| 33 | + output logic [NUM_LANES-1:0] dmem_req_valid, |
| 34 | + input logic [NUM_LANES-1:0] dmem_req_ready, |
| 35 | + output logic [NUM_LANES-1:0] dmem_req_bits_store, |
| 36 | + output logic [(NUM_LANES*DMEM_TAG_BITS)-1:0] dmem_req_bits_tag, |
| 37 | + output logic [(NUM_LANES*ARCH_LEN)-1:0] dmem_req_bits_address, |
| 38 | + output logic [(NUM_LANES*DMEM_SIZE_BITS)-1:0] dmem_req_bits_size, |
| 39 | + output logic [(NUM_LANES*DMEM_DATA_BITS)-1:0] dmem_req_bits_data, |
| 40 | + output logic [(NUM_LANES*DMEM_MASK_BITS)-1:0] dmem_req_bits_mask, |
| 41 | + output logic [NUM_LANES-1:0] dmem_resp_ready, |
| 42 | + input logic [NUM_LANES-1:0] dmem_resp_valid, |
| 43 | + input logic [(NUM_LANES*DMEM_TAG_BITS)-1:0] dmem_resp_bits_tag, |
| 44 | + input logic [(NUM_LANES*DMEM_DATA_BITS)-1:0] dmem_resp_bits_data, |
| 45 | + output logic finished |
| 46 | +); |
| 47 | + `include "Cyclotron.vh" |
| 48 | + |
| 49 | + import "DPI-C" function void cyclotron_tile_tick( |
| 50 | + output bit imem_req_valid, |
| 51 | + input bit imem_req_ready, |
| 52 | + output int imem_req_bits_address, |
| 53 | + output longint imem_req_bits_tag, |
| 54 | + output bit imem_resp_ready, |
| 55 | + input bit imem_resp_valid, |
| 56 | + input longint imem_resp_bits_tag, |
| 57 | + input longint imem_resp_bits_data, |
| 58 | + output bit dmem_req_valid[NUM_LANES], |
| 59 | + input bit dmem_req_ready[NUM_LANES], |
| 60 | + output bit dmem_req_bits_store[NUM_LANES], |
| 61 | + output int dmem_req_bits_address[NUM_LANES], |
| 62 | + output byte dmem_req_bits_size[NUM_LANES], |
| 63 | + output int dmem_req_bits_tag[NUM_LANES], |
| 64 | + output int dmem_req_bits_data[NUM_LANES], |
| 65 | + output byte dmem_req_bits_mask[NUM_LANES], |
| 66 | + output bit dmem_resp_ready[NUM_LANES], |
| 67 | + input bit dmem_resp_valid[NUM_LANES], |
| 68 | + input int dmem_resp_bits_tag[NUM_LANES], |
| 69 | + input int dmem_resp_bits_data[NUM_LANES], |
| 70 | + output bit finished |
| 71 | + ); |
| 72 | + |
| 73 | + initial cyclotron_init_task(); |
| 74 | + |
| 75 | + bit __out_imem_req_ready; |
| 76 | + bit __out_imem_resp_valid; |
| 77 | + longint __out_imem_resp_bits_tag; |
| 78 | + longint __out_imem_resp_bits_data; |
| 79 | + |
| 80 | + bit __in_imem_req_valid; |
| 81 | + int __in_imem_req_bits_address; |
| 82 | + longint __in_imem_req_bits_tag; |
| 83 | + bit __in_imem_resp_ready; |
| 84 | + bit __in_imem_req_valid_next; |
| 85 | + int __in_imem_req_bits_address_next; |
| 86 | + longint __in_imem_req_bits_tag_next; |
| 87 | + bit __in_imem_resp_ready_next; |
| 88 | + |
| 89 | + bit __in_finished; |
| 90 | + bit __in_finished_next; |
| 91 | + |
| 92 | + bit __out_dmem_req_ready [0:NUM_LANES-1]; |
| 93 | + bit __out_dmem_resp_valid[0:NUM_LANES-1]; |
| 94 | + int __out_dmem_resp_tag [0:NUM_LANES-1]; |
| 95 | + int __out_dmem_resp_data [0:NUM_LANES-1]; |
| 96 | + |
| 97 | + bit __in_dmem_req_valid [0:NUM_LANES-1]; |
| 98 | + bit __in_dmem_req_store [0:NUM_LANES-1]; |
| 99 | + int __in_dmem_req_address [0:NUM_LANES-1]; |
| 100 | + byte __in_dmem_req_size [0:NUM_LANES-1]; |
| 101 | + int __in_dmem_req_tag [0:NUM_LANES-1]; |
| 102 | + int __in_dmem_req_data [0:NUM_LANES-1]; |
| 103 | + byte __in_dmem_req_mask [0:NUM_LANES-1]; |
| 104 | + bit __in_dmem_resp_ready [0:NUM_LANES-1]; |
| 105 | + |
| 106 | + bit __in_dmem_req_valid_next [0:NUM_LANES-1]; |
| 107 | + bit __in_dmem_req_store_next [0:NUM_LANES-1]; |
| 108 | + int __in_dmem_req_address_next [0:NUM_LANES-1]; |
| 109 | + byte __in_dmem_req_size_next [0:NUM_LANES-1]; |
| 110 | + int __in_dmem_req_tag_next [0:NUM_LANES-1]; |
| 111 | + int __in_dmem_req_data_next [0:NUM_LANES-1]; |
| 112 | + byte __in_dmem_req_mask_next [0:NUM_LANES-1]; |
| 113 | + bit __in_dmem_resp_ready_next [0:NUM_LANES-1]; |
| 114 | + |
| 115 | + assign __out_imem_req_ready = imem_req_ready; |
| 116 | + assign __out_imem_resp_valid = imem_resp_valid; |
| 117 | + assign __out_imem_resp_bits_tag = imem_resp_bits_tag; |
| 118 | + assign __out_imem_resp_bits_data = imem_resp_bits_data; |
| 119 | + |
| 120 | + assign imem_req_valid = __in_imem_req_valid; |
| 121 | + assign imem_req_bits_address = __in_imem_req_bits_address[ARCH_LEN-1:0]; |
| 122 | + assign imem_req_bits_tag = __in_imem_req_bits_tag[IMEM_TAG_BITS-1:0]; |
| 123 | + assign imem_resp_ready = __in_imem_resp_ready; |
| 124 | + |
| 125 | + assign finished = __in_finished; |
| 126 | + |
| 127 | + genvar g; |
| 128 | + generate |
| 129 | + for (g = 0; g < NUM_LANES; g = g + 1) begin |
| 130 | + assign __out_dmem_req_ready[g] = dmem_req_ready[g]; |
| 131 | + assign __out_dmem_resp_valid[g] = dmem_resp_valid[g]; |
| 132 | + assign __out_dmem_resp_tag[g] = dmem_resp_bits_tag[DMEM_TAG_BITS*g +: DMEM_TAG_BITS]; |
| 133 | + assign __out_dmem_resp_data[g] = dmem_resp_bits_data[DMEM_DATA_BITS*g +: DMEM_DATA_BITS]; |
| 134 | + |
| 135 | + assign dmem_req_valid[g] = __in_dmem_req_valid[g]; |
| 136 | + assign dmem_req_bits_store[g] = __in_dmem_req_store[g]; |
| 137 | + assign dmem_req_bits_address[ARCH_LEN*g +: ARCH_LEN] = |
| 138 | + __in_dmem_req_address[g][ARCH_LEN-1:0]; |
| 139 | + assign dmem_req_bits_size[DMEM_SIZE_BITS*g +: DMEM_SIZE_BITS] = |
| 140 | + __in_dmem_req_size[g][DMEM_SIZE_BITS-1:0]; |
| 141 | + assign dmem_req_bits_tag[DMEM_TAG_BITS*g +: DMEM_TAG_BITS] = |
| 142 | + __in_dmem_req_tag[g][DMEM_TAG_BITS-1:0]; |
| 143 | + assign dmem_req_bits_data[DMEM_DATA_BITS*g +: DMEM_DATA_BITS] = |
| 144 | + __in_dmem_req_data[g][DMEM_DATA_BITS-1:0]; |
| 145 | + assign dmem_req_bits_mask[DMEM_MASK_BITS*g +: DMEM_MASK_BITS] = |
| 146 | + __in_dmem_req_mask[g][DMEM_MASK_BITS-1:0]; |
| 147 | + assign dmem_resp_ready[g] = __in_dmem_resp_ready[g]; |
| 148 | + end |
| 149 | + endgenerate |
| 150 | + |
| 151 | + always @(posedge clock) begin |
| 152 | + if (reset) begin |
| 153 | + __in_imem_req_valid <= '0; |
| 154 | + __in_imem_req_bits_address <= '0; |
| 155 | + __in_imem_req_bits_tag <= '0; |
| 156 | + __in_imem_resp_ready <= '0; |
| 157 | + __in_finished <= '0; |
| 158 | + for (integer i = 0; i < NUM_LANES; i = i + 1) begin |
| 159 | + __in_dmem_req_valid[i] <= '0; |
| 160 | + __in_dmem_req_store[i] <= '0; |
| 161 | + __in_dmem_req_address[i] <= '0; |
| 162 | + __in_dmem_req_size[i] <= '0; |
| 163 | + __in_dmem_req_tag[i] <= '0; |
| 164 | + __in_dmem_req_data[i] <= '0; |
| 165 | + __in_dmem_req_mask[i] <= '0; |
| 166 | + __in_dmem_resp_ready[i] <= '0; |
| 167 | + end |
| 168 | + end else begin |
| 169 | + __in_imem_req_valid_next = __in_imem_req_valid; |
| 170 | + __in_imem_req_bits_address_next = __in_imem_req_bits_address; |
| 171 | + __in_imem_req_bits_tag_next = __in_imem_req_bits_tag; |
| 172 | + __in_imem_resp_ready_next = __in_imem_resp_ready; |
| 173 | + __in_finished_next = __in_finished; |
| 174 | + for (integer i = 0; i < NUM_LANES; i = i + 1) begin |
| 175 | + __in_dmem_req_valid_next[i] = __in_dmem_req_valid[i]; |
| 176 | + __in_dmem_req_store_next[i] = __in_dmem_req_store[i]; |
| 177 | + __in_dmem_req_address_next[i] = __in_dmem_req_address[i]; |
| 178 | + __in_dmem_req_size_next[i] = __in_dmem_req_size[i]; |
| 179 | + __in_dmem_req_tag_next[i] = __in_dmem_req_tag[i]; |
| 180 | + __in_dmem_req_data_next[i] = __in_dmem_req_data[i]; |
| 181 | + __in_dmem_req_mask_next[i] = __in_dmem_req_mask[i]; |
| 182 | + __in_dmem_resp_ready_next[i] = __in_dmem_resp_ready[i]; |
| 183 | + end |
| 184 | + cyclotron_tile_tick( |
| 185 | + __in_imem_req_valid_next, |
| 186 | + __out_imem_req_ready, |
| 187 | + __in_imem_req_bits_address_next, |
| 188 | + __in_imem_req_bits_tag_next, |
| 189 | + __in_imem_resp_ready_next, |
| 190 | + __out_imem_resp_valid, |
| 191 | + __out_imem_resp_bits_tag, |
| 192 | + __out_imem_resp_bits_data, |
| 193 | + __in_dmem_req_valid_next, |
| 194 | + __out_dmem_req_ready, |
| 195 | + __in_dmem_req_store_next, |
| 196 | + __in_dmem_req_address_next, |
| 197 | + __in_dmem_req_size_next, |
| 198 | + __in_dmem_req_tag_next, |
| 199 | + __in_dmem_req_data_next, |
| 200 | + __in_dmem_req_mask_next, |
| 201 | + __in_dmem_resp_ready_next, |
| 202 | + __out_dmem_resp_valid, |
| 203 | + __out_dmem_resp_tag, |
| 204 | + __out_dmem_resp_data, |
| 205 | + __in_finished_next |
| 206 | + ); |
| 207 | + __in_imem_req_valid <= __in_imem_req_valid_next; |
| 208 | + __in_imem_req_bits_address <= __in_imem_req_bits_address_next; |
| 209 | + __in_imem_req_bits_tag <= __in_imem_req_bits_tag_next; |
| 210 | + __in_imem_resp_ready <= __in_imem_resp_ready_next; |
| 211 | + __in_finished <= __in_finished_next; |
| 212 | + for (integer i = 0; i < NUM_LANES; i = i + 1) begin |
| 213 | + __in_dmem_req_valid[i] <= __in_dmem_req_valid_next[i]; |
| 214 | + __in_dmem_req_store[i] <= __in_dmem_req_store_next[i]; |
| 215 | + __in_dmem_req_address[i] <= __in_dmem_req_address_next[i]; |
| 216 | + __in_dmem_req_size[i] <= __in_dmem_req_size_next[i]; |
| 217 | + __in_dmem_req_tag[i] <= __in_dmem_req_tag_next[i]; |
| 218 | + __in_dmem_req_data[i] <= __in_dmem_req_data_next[i]; |
| 219 | + __in_dmem_req_mask[i] <= __in_dmem_req_mask_next[i]; |
| 220 | + __in_dmem_resp_ready[i] <= __in_dmem_resp_ready_next[i]; |
| 221 | + end |
| 222 | + end |
| 223 | + end |
| 224 | + |
| 225 | +endmodule |
0 commit comments