| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| /** Register File. |
| * |
| * Six 32-bit register file. |
| * |
| * ------------------------------- |
| * Register description | addr |
| * -------------------------|----- |
| * Control status register | 0x00 |
| * Cycle counter | 0x04 |
| * Constant value | 0x08 |
| * Vector length | 0x0c |
| * Input pointer lsb | 0x10 |
| * Input pointer msb | 0x14 |
| * Output pointer lsb | 0x18 |
| * Output pointer msb | 0x1c |
| * ------------------------------- |
| |
| * ------------------------------ |
| * Control status register | bit |
| * ------------------------------ |
| * Launch | 0 |
| * Finish | 1 |
| * ------------------------------ |
| */ |
| module RegFile # |
| (parameter MEM_ADDR_BITS = 64, |
| parameter HOST_ADDR_BITS = 8, |
| parameter HOST_DATA_BITS = 32 |
| ) |
| ( |
| input clock, |
| input reset, |
| |
| input host_req_valid, |
| input host_req_opcode, |
| input [HOST_ADDR_BITS-1:0] host_req_addr, |
| input [HOST_DATA_BITS-1:0] host_req_value, |
| output host_req_deq, |
| output host_resp_valid, |
| output [HOST_DATA_BITS-1:0] host_resp_bits, |
| |
| output launch, |
| input finish, |
| |
| input event_counter_valid, |
| input [HOST_DATA_BITS-1:0] event_counter_value, |
| |
| output [HOST_DATA_BITS-1:0] constant, |
| output [HOST_DATA_BITS-1:0] length, |
| output [MEM_ADDR_BITS-1:0] inp_baddr, |
| output [MEM_ADDR_BITS-1:0] out_baddr |
| ); |
| |
| localparam NUM_REG = 8; |
| |
| typedef enum logic {IDLE, READ} state_t; |
| state_t state_n, state_r; |
| |
| always_ff @(posedge clock) begin |
| if (reset) begin |
| state_r <= IDLE; |
| end else begin |
| state_r <= state_n; |
| end |
| end |
| |
| always_comb begin |
| state_n = IDLE; |
| case (state_r) |
| IDLE: begin |
| if (host_req_valid & ~host_req_opcode) begin |
| state_n = READ; |
| end |
| end |
| |
| READ: begin |
| state_n = IDLE; |
| end |
| endcase |
| end |
| |
| assign host_req_deq = (state_r == IDLE) ? host_req_valid : 1'b0; |
| |
| logic [HOST_DATA_BITS-1:0] rf [NUM_REG-1:0]; |
| |
| genvar i; |
| for (i = 0; i < NUM_REG; i++) begin |
| |
| logic wen = (state_r == IDLE)? host_req_valid & host_req_opcode & i*4 == host_req_addr : 1'b0; |
| |
| if (i == 0) begin |
| |
| always_ff @(posedge clock) begin |
| if (reset) begin |
| rf[i] <= 'd0; |
| end else if (finish) begin |
| rf[i] <= 'd2; |
| end else if (wen) begin |
| rf[i] <= host_req_value; |
| end |
| end |
| |
| end else if (i == 1) begin |
| |
| always_ff @(posedge clock) begin |
| if (reset) begin |
| rf[i] <= 'd0; |
| end else if (event_counter_valid) begin |
| rf[i] <= event_counter_value; |
| end else if (wen) begin |
| rf[i] <= host_req_value; |
| end |
| end |
| |
| end else begin |
| |
| always_ff @(posedge clock) begin |
| if (reset) begin |
| rf[i] <= 'd0; |
| end else if (wen) begin |
| rf[i] <= host_req_value; |
| end |
| end |
| |
| end |
| |
| end |
| |
| logic [HOST_DATA_BITS-1:0] rdata; |
| always_ff @(posedge clock) begin |
| if (reset) begin |
| rdata <= 'd0; |
| end else if ((state_r == IDLE) & host_req_valid & ~host_req_opcode) begin |
| if (host_req_addr == 'h00) begin |
| rdata <= rf[0]; |
| end else if (host_req_addr == 'h04) begin |
| rdata <= rf[1]; |
| end else if (host_req_addr == 'h08) begin |
| rdata <= rf[2]; |
| end else if (host_req_addr == 'h0c) begin |
| rdata <= rf[3]; |
| end else if (host_req_addr == 'h10) begin |
| rdata <= rf[4]; |
| end else if (host_req_addr == 'h14) begin |
| rdata <= rf[5]; |
| end else if (host_req_addr == 'h18) begin |
| rdata <= rf[6]; |
| end else if (host_req_addr == 'h1c) begin |
| rdata <= rf[7]; |
| end else begin |
| rdata <= 'd0; |
| end |
| end |
| end |
| |
| assign host_resp_valid = (state_r == READ); |
| assign host_resp_bits = rdata; |
| |
| assign launch = rf[0][0]; |
| assign constant = rf[2]; |
| assign length = rf[3]; |
| assign inp_baddr = {rf[5], rf[4]}; |
| assign out_baddr = {rf[7], rf[6]}; |
| |
| endmodule |