lkg build with pipeline + FPU fixes
This commit is contained in:
@@ -11,107 +11,129 @@ module VX_csr_data #(
|
||||
|
||||
input wire[`NW_BITS-1:0] warp_num,
|
||||
|
||||
input wire[`CSR_ADDR_SIZE-1:0] read_addr,
|
||||
input wire read_enable,
|
||||
input wire[`CSR_ADDR_BITS-1:0] read_addr,
|
||||
output reg[31:0] read_data,
|
||||
|
||||
input wire write_enable,
|
||||
`IGNORE_WARNINGS_BEGIN
|
||||
// We use a smaller storage for CSRs than the standard 4KB in RISC-V
|
||||
input wire[`CSR_ADDR_SIZE-1:0] write_addr,
|
||||
`IGNORE_WARNINGS_END
|
||||
input wire[`CSR_ADDR_BITS-1:0] write_addr,
|
||||
input wire[`CSR_WIDTH-1:0] write_data
|
||||
);
|
||||
reg [`CSR_WIDTH-1:0] csr_table[`NUM_CSRS-1:0];
|
||||
|
||||
reg [`FFG_BITS+`FRM_BITS-1:0] fflags_table [`NUM_WARPS-1:0];
|
||||
reg [`FRM_BITS-1:0] frm_table [`NUM_WARPS-1:0];
|
||||
reg [`FFG_BITS+`FRM_BITS-1:0] fcsr_table [`NUM_WARPS-1:0]; // fflags + frm
|
||||
|
||||
// cast address to physical CSR range
|
||||
wire [$clog2(`NUM_CSRS)-1:0] rd_addr, wr_addr;
|
||||
assign rd_addr = $size(rd_addr)'(read_addr);
|
||||
assign wr_addr = $size(wr_addr)'(write_addr);
|
||||
|
||||
wire [`FFG_BITS-1:0] fflags_update;
|
||||
assign fflags_update[4] = cmt_to_csr_if.fflags_NV;
|
||||
assign fflags_update[3] = cmt_to_csr_if.fflags_DZ;
|
||||
assign fflags_update[2] = cmt_to_csr_if.fflags_OF;
|
||||
assign fflags_update[1] = cmt_to_csr_if.fflags_UF;
|
||||
assign fflags_update[0] = cmt_to_csr_if.fflags_NX;
|
||||
|
||||
integer i;
|
||||
reg [`CSR_WIDTH-1:0] csr_satp;
|
||||
reg [`CSR_WIDTH-1:0] csr_mstatus;
|
||||
reg [`CSR_WIDTH-1:0] csr_medeleg;
|
||||
reg [`CSR_WIDTH-1:0] csr_mideleg;
|
||||
reg [`CSR_WIDTH-1:0] csr_mie;
|
||||
reg [`CSR_WIDTH-1:0] csr_mtvec;
|
||||
reg [`CSR_WIDTH-1:0] csr_mepc;
|
||||
reg [`CSR_WIDTH-1:0] csr_pmpcfg [0:0];
|
||||
reg [`CSR_WIDTH-1:0] csr_pmpaddr [0:0];
|
||||
reg [63:0] csr_cycle;
|
||||
reg [63:0] csr_instret;
|
||||
|
||||
reg [`FFG_BITS-1:0] csr_fflags [`NUM_WARPS-1:0];
|
||||
reg [`FRM_BITS-1:0] csr_frm [`NUM_WARPS-1:0];
|
||||
reg [`FRM_BITS+`FFG_BITS-1:0] csr_fcsr [`NUM_WARPS-1:0]; // fflags + frm
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
for (i = 0; i < `NUM_WARPS; i++) begin
|
||||
fflags_table[i] <= 0;
|
||||
frm_table[i] <= 0;
|
||||
fcsr_table[i] <= 0;
|
||||
end
|
||||
end else begin
|
||||
if (write_enable) begin
|
||||
case (write_addr)
|
||||
`CSR_FFLAGS: begin
|
||||
fcsr_table[warp_num][`FFG_BITS-1:0] <= write_data[`FFG_BITS-1:0];
|
||||
fflags_table[warp_num][`FFG_BITS-1:0] <= write_data[`FFG_BITS-1:0];
|
||||
end
|
||||
`CSR_FRM: begin
|
||||
fcsr_table[warp_num][`FFG_BITS+`FRM_BITS-1:`FFG_BITS] <= write_data[`FRM_BITS-1:0];
|
||||
frm_table[warp_num] <= write_data[`FRM_BITS-1:0];
|
||||
end
|
||||
`CSR_FCSR: begin
|
||||
fcsr_table[warp_num] <= write_data[`FFG_BITS+`FRM_BITS-1:0];
|
||||
frm_table[warp_num] <= write_data[`FFG_BITS+`FRM_BITS-1:`FFG_BITS];
|
||||
fflags_table[warp_num][`FFG_BITS-1:0] <= write_data[`FFG_BITS-1:0];
|
||||
end
|
||||
default: begin
|
||||
csr_table[wr_addr] <= write_data;
|
||||
if (cmt_to_csr_if.upd_fflags) begin
|
||||
csr_fflags[cmt_to_csr_if.warp_num] <= cmt_to_csr_if.fflags;
|
||||
csr_fcsr[cmt_to_csr_if.warp_num][`FFG_BITS-1:0] <= cmt_to_csr_if.fflags;
|
||||
end
|
||||
|
||||
if (write_enable) begin
|
||||
case (write_addr)
|
||||
`CSR_FFLAGS: begin
|
||||
csr_fcsr[warp_num][`FFG_BITS-1:0] <= write_data[`FFG_BITS-1:0];
|
||||
csr_fflags[warp_num] <= write_data[`FFG_BITS-1:0];
|
||||
end
|
||||
`CSR_FRM: begin
|
||||
csr_fcsr[warp_num][`FFG_BITS+`FRM_BITS-1:`FFG_BITS] <= write_data[`FRM_BITS-1:0];
|
||||
csr_frm[warp_num] <= write_data[`FRM_BITS-1:0];
|
||||
end
|
||||
`CSR_FCSR: begin
|
||||
csr_fcsr[warp_num] <= write_data[`FFG_BITS+`FRM_BITS-1:0];
|
||||
csr_frm[warp_num] <= write_data[`FFG_BITS+`FRM_BITS-1:`FFG_BITS];
|
||||
csr_fflags[warp_num] <= write_data[`FFG_BITS-1:0];
|
||||
end
|
||||
`CSR_SATP: csr_satp <= write_data;
|
||||
|
||||
`CSR_MSTATUS: csr_mstatus <= write_data;
|
||||
`CSR_MEDELEG: csr_medeleg <= write_data;
|
||||
`CSR_MIDELEG: csr_mideleg <= write_data;
|
||||
`CSR_MIE: csr_mie <= write_data;
|
||||
`CSR_MTVEC: csr_mtvec <= write_data;
|
||||
|
||||
`CSR_MEPC: csr_mepc <= write_data;
|
||||
|
||||
`CSR_PMPCFG0: csr_pmpcfg[0] <= write_data;
|
||||
`CSR_PMPADDR0: csr_pmpaddr[0] <= write_data;
|
||||
|
||||
default: begin
|
||||
assert(~write_enable) else $error("%t: invalid CSR write address: %0h", $time, write_addr);
|
||||
end
|
||||
endcase
|
||||
end else if (cmt_to_csr_if.upd_fflags) begin
|
||||
fflags_table[cmt_to_csr_if.fpu_warp_num][`FFG_BITS-1:0] <= fflags_update;
|
||||
fcsr_table[cmt_to_csr_if.fpu_warp_num][`FFG_BITS-1:0] <= fflags_update;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
reg [63:0] total_cycles, total_instrs;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
total_cycles <= 0;
|
||||
total_instrs <= 0;
|
||||
csr_cycle <= 0;
|
||||
csr_instret <= 0;
|
||||
end else begin
|
||||
total_cycles <= total_cycles + 1;
|
||||
csr_cycle <= csr_cycle + 1;
|
||||
if (cmt_to_csr_if.valid) begin
|
||||
total_instrs <= total_instrs + 64'(cmt_to_csr_if.num_commits);
|
||||
csr_instret <= csr_instret + 64'(cmt_to_csr_if.num_commits);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always @(*) begin
|
||||
case (read_addr)
|
||||
`CSR_FFLAGS : read_data = 32'(fflags_table[warp_num]);
|
||||
`CSR_FRM : read_data = 32'(frm_table[warp_num]);
|
||||
`CSR_FCSR : read_data = 32'(fcsr_table[warp_num]);
|
||||
`CSR_FFLAGS : read_data = 32'(csr_fflags[warp_num]);
|
||||
`CSR_FRM : read_data = 32'(csr_frm[warp_num]);
|
||||
`CSR_FCSR : read_data = 32'(csr_fcsr[warp_num]);
|
||||
|
||||
`CSR_LWID : read_data = 32'(warp_num);
|
||||
`CSR_LTID ,
|
||||
`CSR_GTID ,
|
||||
`CSR_MHARTID ,
|
||||
`CSR_GWID : read_data = CORE_ID * `NUM_WARPS + 32'(warp_num);
|
||||
`CSR_GCID : read_data = CORE_ID;
|
||||
`CSR_NT : read_data = `NUM_THREADS;
|
||||
`CSR_NW : read_data = `NUM_WARPS;
|
||||
`CSR_NC : read_data = `NUM_CORES * `NUM_CLUSTERS;
|
||||
`CSR_CYCLE_L : read_data = total_cycles[31:0];
|
||||
`CSR_CYCLE_H : read_data = total_cycles[63:32];
|
||||
`CSR_INSTR_L : read_data = total_instrs[31:0];
|
||||
`CSR_INSTR_H : read_data = total_instrs[63:32];
|
||||
`CSR_VEND_ID : read_data = `VENDOR_ID;
|
||||
`CSR_ARCH_ID : read_data = `ARCHITECTURE_ID;
|
||||
`CSR_IMPL_ID : read_data = `IMPLEMENTATION_ID;
|
||||
|
||||
`CSR_SATP : read_data = 32'(csr_satp);
|
||||
|
||||
`CSR_MSTATUS : read_data = 32'(csr_mstatus);
|
||||
`CSR_MISA : read_data = `ISA_CODE;
|
||||
default : read_data = 32'(csr_table[rd_addr]);
|
||||
`CSR_MEDELEG : read_data = 32'(csr_medeleg);
|
||||
`CSR_MIDELEG : read_data = 32'(csr_mideleg);
|
||||
`CSR_MIE : read_data = 32'(csr_mie);
|
||||
`CSR_MTVEC : read_data = 32'(csr_mtvec);
|
||||
|
||||
`CSR_MEPC : read_data = 32'(csr_mepc);
|
||||
|
||||
`CSR_PMPCFG0 : read_data = 32'(csr_pmpcfg[0]);
|
||||
`CSR_PMPADDR0: read_data = 32'(csr_pmpaddr[0]);
|
||||
|
||||
`CSR_CYCLE : read_data = csr_cycle[31:0];
|
||||
`CSR_CYCLE_H : read_data = csr_cycle[63:32];
|
||||
`CSR_INSTRET : read_data = csr_instret[31:0];
|
||||
`CSR_INSTRET_H:read_data = csr_instret[63:32];
|
||||
|
||||
`CSR_MVENDORID:read_data = `VENDOR_ID;
|
||||
`CSR_MARCHID : read_data = `ARCHITECTURE_ID;
|
||||
`CSR_MIMPID : read_data = `IMPLEMENTATION_ID;
|
||||
|
||||
default: begin
|
||||
assert(~read_enable) else $error("%t: invalid CSR read address: %0h", $time, read_addr);
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
assign csr_to_fpu_if.frm = frm_table[csr_to_fpu_if.warp_num];
|
||||
assign csr_to_fpu_if.frm = csr_frm[csr_to_fpu_if.warp_num];
|
||||
|
||||
endmodule
|
||||
endmodule
|
||||
Reference in New Issue
Block a user