blob: 7f2717a1bba4f5f75e31eb3bbffea4a8790cbc43 [file] [log] [blame]
//
// description:
// 1. It sends instruction package to arithmetic decode unit or lsu decode unit based on instruction opcode.
//
// feature list:
// 1. One instruction can be decoded to 8 uops at most.
// 2. Decoder will push 4 uops at most into Uops Queue, so decoder only decode to 4 uops at most per cycle.
// 3. uops_de2dp.rs1_data could be from X[rs1] and imm(inst[19:15]).
// 4. If the instruction is in wrong encoding, it will be discarded directly without applying a trap, but take assertion in simulation.
// 5. The vstart of the instruction will be calculated to a new value for every decoded uops.
`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_decode_unit
(
inst_valid_cq2de,
inst_cq2de,
uop_index_remain,
uop_valid_de2uq,
uop_de2uq
);
//
// interface signals
//
// CQ to Decoder unit signals
input logic inst_valid_cq2de;
input RVVCmd inst_cq2de;
input logic [`UOP_INDEX_WIDTH-1:0] uop_index_remain;
// Decoder unit to Uops Queue signals
output logic [`NUM_DE_UOP-1:0] uop_valid_de2uq;
output UOP_QUEUE_t [`NUM_DE_UOP-1:0] uop_de2uq;
//
// internal signals
//
RVVOpCode inst_opcode; // inst original encoding[6:0]
logic valid_ari;
logic valid_lsu;
// decoded arithmetic uops
logic [`NUM_DE_UOP-1:0] uop_valid_ari;
UOP_QUEUE_t [`NUM_DE_UOP-1:0] uop_ari;
// decoded LSU uops
logic [`NUM_DE_UOP-1:0] uop_valid_lsu;
UOP_QUEUE_t [`NUM_DE_UOP-1:0] uop_lsu;
//
// decode
//
assign inst_opcode = inst_cq2de.opcode;
// decode opcode
assign valid_lsu = (inst_valid_cq2de==1'b1) & ((inst_opcode==LOAD) | (inst_opcode==STORE));
assign valid_ari = (inst_valid_cq2de==1'b1) & (inst_opcode==RVV);
// decode LSU instruction
rvv_backend_decode_unit_lsu u_lsu_decode
(
.inst_valid (valid_lsu),
.inst (inst_cq2de),
.uop_index_remain (uop_index_remain),
.uop_valid (uop_valid_lsu),
.uop (uop_lsu)
);
// decode arithmetic instruction
rvv_backend_decode_unit_ari u_ari_decode
(
.inst_valid (valid_ari),
.inst (inst_cq2de),
.uop_index_remain (uop_index_remain),
.uop_valid (uop_valid_ari),
.uop (uop_ari)
);
// output
always_comb begin
uop_valid_de2uq = 'b0;
uop_de2uq = 'b0;
case(1'b1)
valid_lsu: begin
uop_valid_de2uq = uop_valid_lsu;
uop_de2uq = uop_lsu;
end
valid_ari: begin
uop_valid_de2uq = uop_valid_ari;
uop_de2uq = uop_ari;
end
endcase
end
endmodule