|  | // description | 
|  | // 1. the module is responsible for 3 kinds of vector instructions. | 
|  | //    a. compare instruction. | 
|  | //    b. reduction instruction. | 
|  | //    c. permutation instruction. | 
|  | // | 
|  | // feature list: | 
|  | // 1. pmtrdt unit[0] can support compare/reduction/compress intructions | 
|  | //    a. compress instruction is a specified instruction in permutation. | 
|  | //    b. vd EMUL for compare/reduction instruction is always 1. | 
|  | // 2. the latency of the module is 2-cycle for each uop. | 
|  |  | 
|  | `ifndef HDL_VERILOG_RVV_DESIGN_RVV_SVH | 
|  | `include "rvv_backend.svh" | 
|  | `endif | 
|  | `ifndef RVV_ASSERT__SVH | 
|  | `include "rvv_backend_sva.svh" | 
|  | `endif | 
|  |  | 
|  | module rvv_backend_pmtrdt | 
|  | ( | 
|  | clk, | 
|  | rst_n, | 
|  |  | 
|  | pop_ex2rs, | 
|  | pmtrdt_uop_rs2ex, | 
|  | fifo_empty_rs2ex, | 
|  | fifo_almost_empty_rs2ex, | 
|  | all_uop_data, | 
|  | all_uop_cnt, | 
|  |  | 
|  | result_valid_ex2rob, | 
|  | result_ex2rob, | 
|  | result_ready_rob2ex, | 
|  |  | 
|  | trap_flush_rvv | 
|  | ); | 
|  | // ---port definition------------------------------------------------- | 
|  | // global signal | 
|  | input   logic           clk; | 
|  | input   logic           rst_n; | 
|  |  | 
|  | // PMTRDT RS to PMTRDT unit | 
|  | output  logic        [`NUM_PMTRDT-1:0]  pop_ex2rs; | 
|  | input   PMT_RDT_RS_t [`NUM_PMTRDT-1:0]  pmtrdt_uop_rs2ex; | 
|  | input   logic                           fifo_empty_rs2ex; | 
|  | input   logic        [`NUM_PMTRDT-1:0]  fifo_almost_empty_rs2ex; | 
|  | input   PMT_RDT_RS_t [`PMTRDT_RS_DEPTH-1:0] all_uop_data; | 
|  | input   logic        [$clog2(`PMTRDT_RS_DEPTH):0] all_uop_cnt; | 
|  |  | 
|  | // PMTRDT unit to ROB | 
|  | output  logic        [`NUM_PMTRDT-1:0]  result_valid_ex2rob; | 
|  | output  PU2ROB_t     [`NUM_PMTRDT-1:0]  result_ex2rob; | 
|  | input   logic        [`NUM_PMTRDT-1:0]  result_ready_rob2ex; | 
|  |  | 
|  | // trap-flush | 
|  | input   logic                           trap_flush_rvv; | 
|  |  | 
|  | // ---internal signal definition-------------------------------------- | 
|  | logic         [`NUM_PMTRDT-1:0] pmtrdt_uop_valid; | 
|  | PMT_RDT_RS_t  [`NUM_PMTRDT-1:0] pmtrdt_uop; | 
|  | logic         [`NUM_PMTRDT-1:0] pmtrdt_uop_ready; | 
|  |  | 
|  | logic         [`NUM_PMTRDT-1:0] pmtrdt_res_valid; | 
|  | PU2ROB_t      [`NUM_PMTRDT-1:0] pmtrdt_res; | 
|  | logic         [`NUM_PMTRDT-1:0] pmtrdt_res_ready; | 
|  |  | 
|  | genvar i; | 
|  | // ---code start------------------------------------------------------ | 
|  | generate | 
|  | for (i=0; i<`NUM_PMTRDT; i++) begin | 
|  | assign pmtrdt_uop[i] = pmtrdt_uop_rs2ex[i]; | 
|  | if (i==0) | 
|  | assign pmtrdt_uop_valid[0] = ~fifo_empty_rs2ex; | 
|  | else | 
|  | assign pmtrdt_uop_valid[i] = ~fifo_almost_empty_rs2ex[i]; | 
|  | assign pop_ex2rs[i] = pmtrdt_uop_valid[i] & pmtrdt_uop_ready[i]; | 
|  |  | 
|  | assign result_valid_ex2rob[i] = pmtrdt_res_valid[i]; | 
|  | assign result_ex2rob[i]       = pmtrdt_res[i]; | 
|  | assign pmtrdt_res_ready[i]    = result_ready_rob2ex[i]; | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | // instance the pmtrdt unit | 
|  | generate | 
|  | for (i=0; i<`NUM_PMTRDT; i++) begin : gen_pmtrdt_unit | 
|  | rvv_backend_pmtrdt_unit #( | 
|  | .GEN_RDT      (1'b1), | 
|  | .GEN_CMP      (1'b1), | 
|  | .GEN_PMT      (1'b1) | 
|  | ) u_pmtrdt_unit0 ( | 
|  | .clk                (clk), | 
|  | .rst_n              (rst_n), | 
|  | .pmtrdt_uop_valid   (pmtrdt_uop_valid[i]), | 
|  | .pmtrdt_uop         (pmtrdt_uop[i]), | 
|  | .pmtrdt_uop_ready   (pmtrdt_uop_ready[i]), | 
|  | .pmtrdt_res_valid   (pmtrdt_res_valid[i]), | 
|  | .pmtrdt_res         (pmtrdt_res[i]), | 
|  | .pmtrdt_res_ready   (pmtrdt_res_ready[i]), | 
|  | .uop_data           (all_uop_data), | 
|  | .uop_cnt            (all_uop_cnt), | 
|  | .trap_flush_rvv     (trap_flush_rvv) | 
|  | ); | 
|  | end | 
|  | endgenerate | 
|  |  | 
|  | endmodule |