minor update

This commit is contained in:
Blaise Tine
2020-12-26 14:47:41 -08:00
parent 33c431ed44
commit b2b8f190dd
9 changed files with 199 additions and 198 deletions

View File

@@ -244,11 +244,6 @@
`define LSUQ_SIZE 8 `define LSUQ_SIZE 8
`endif `endif
// Size of MUL Request Queue
`ifndef MULQ_SIZE
`define MULQ_SIZE 8
`endif
// Size of FPU Request Queue // Size of FPU Request Queue
`ifndef FPUQ_SIZE `ifndef FPUQ_SIZE
`define FPUQ_SIZE 8 `define FPUQ_SIZE 8

View File

@@ -12,7 +12,6 @@ module VX_mul_unit #(
// Outputs // Outputs
VX_commit_if mul_commit_if VX_commit_if mul_commit_if
); );
localparam MULQ_BITS = `LOG2UP(`MULQ_SIZE);
wire [`MUL_BITS-1:0] alu_op = mul_req_if.op_type; wire [`MUL_BITS-1:0] alu_op = mul_req_if.op_type;
wire is_div_op = `IS_DIV_OP(alu_op); wire is_div_op = `IS_DIV_OP(alu_op);
@@ -31,34 +30,13 @@ module VX_mul_unit #(
wire mul_wb_out; wire mul_wb_out;
wire mul_valid_out; wire mul_valid_out;
wire mul_valid_in = mul_req_if.valid && !is_div_op && ~mulq_full; wire mul_valid_in = mul_req_if.valid && !is_div_op;
wire mul_ready_in = ready_out || ~mul_valid_out; wire mul_ready_in = ready_out || ~mul_valid_out;
wire mulq_push = mul_valid_in && mul_ready_in;
wire mulq_pop = mul_valid_out && ready_out;
wire mulq_full;
wire is_mulh_in = (alu_op != `MUL_MUL); wire is_mulh_in = (alu_op != `MUL_MUL);
wire is_mulh_out; wire is_mulh_out;
VX_generic_queue #(
.DATAW (`NW_BITS + `NUM_THREADS + 32 + `NR_BITS + 1 + 1),
.SIZE (`MULQ_SIZE),
.FASTRAM (1)
) mul_metadata (
.clk (clk),
.reset (reset),
.push (mulq_push),
.pop (mulq_pop),
.data_in ({mul_req_if.wid, mul_req_if.tmask, mul_req_if.PC, mul_req_if.rd, mul_req_if.wb, is_mulh_in}),
.data_out ({mul_wid_out, mul_tmask_out, mul_PC_out, mul_rd_out, mul_wb_out, is_mulh_out}),
.full (mulq_full),
`UNUSED_PIN (empty),
`UNUSED_PIN (size)
);
for (genvar i = 0; i < `NUM_THREADS; i++) begin for (genvar i = 0; i < `NUM_THREADS; i++) begin
wire [32:0] mul_in1 = {(alu_op != `MUL_MULHU) & alu_in1[i][31], alu_in1[i]}; wire [32:0] mul_in1 = {(alu_op != `MUL_MULHU) & alu_in1[i][31], alu_in1[i]};
wire [32:0] mul_in2 = {(alu_op != `MUL_MULHU && alu_op != `MUL_MULHSU) & alu_in2[i][31], alu_in2[i]}; wire [32:0] mul_in2 = {(alu_op != `MUL_MULHU && alu_op != `MUL_MULHSU) & alu_in2[i][31], alu_in2[i]};
`IGNORE_WARNINGS_BEGIN `IGNORE_WARNINGS_BEGIN
@@ -83,14 +61,15 @@ module VX_mul_unit #(
end end
VX_shift_register #( VX_shift_register #(
.DATAW(1), .DATAW (1 + `NW_BITS + `NUM_THREADS + 32 + `NR_BITS + 1 + 1),
.DEPTH(`LATENCY_IMUL) .DEPTH (`LATENCY_IMUL),
.RESETW (1)
) mul_shift_reg ( ) mul_shift_reg (
.clk(clk), .clk(clk),
.reset (reset), .reset (reset),
.enable (mul_ready_in), .enable (mul_ready_in),
.data_in(mul_valid_in), .data_in ({mul_valid_in, mul_req_if.wid, mul_req_if.tmask, mul_req_if.PC, mul_req_if.rd, mul_req_if.wb, is_mulh_in}),
.data_out(mul_valid_out) .data_out ({mul_valid_out, mul_wid_out, mul_tmask_out, mul_PC_out, mul_rd_out, mul_wb_out, is_mulh_out})
); );
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
@@ -161,6 +140,6 @@ module VX_mul_unit #(
); );
// can accept new request? // can accept new request?
assign mul_req_if.ready = is_div_op ? div_ready_in : (mul_ready_in && ~mulq_full); assign mul_req_if.ready = is_div_op ? div_ready_in : mul_ready_in;
endmodule endmodule

View File

@@ -179,7 +179,8 @@ module VX_fp_addmul #(
VX_shift_register #( VX_shift_register #(
.DATAW (1 + TAGW + 1 + 1), .DATAW (1 + TAGW + 1 + 1),
.DEPTH(`LATENCY_FADDMUL) .DEPTH (`LATENCY_FADDMUL),
.RESETW (1)
) shift_reg ( ) shift_reg (
.clk(clk), .clk(clk),
.reset (reset), .reset (reset),

View File

@@ -51,7 +51,8 @@ module VX_fp_div #(
VX_shift_register #( VX_shift_register #(
.DATAW (1 + TAGW), .DATAW (1 + TAGW),
.DEPTH(`LATENCY_FDIV) .DEPTH (`LATENCY_FDIV),
.RESETW (1)
) shift_reg ( ) shift_reg (
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),

View File

@@ -69,7 +69,8 @@ module VX_fp_ftoi #(
VX_shift_register #( VX_shift_register #(
.DATAW (1 + TAGW + 1), .DATAW (1 + TAGW + 1),
.DEPTH(`LATENCY_FTOI) .DEPTH (`LATENCY_FTOI),
.RESETW (1)
) shift_reg ( ) shift_reg (
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),

View File

@@ -69,7 +69,8 @@ module VX_fp_itof #(
VX_shift_register #( VX_shift_register #(
.DATAW (1 + TAGW + 1), .DATAW (1 + TAGW + 1),
.DEPTH(`LATENCY_ITOF) .DEPTH (`LATENCY_ITOF),
.RESETW (1)
) shift_reg ( ) shift_reg (
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),

View File

@@ -139,7 +139,8 @@ module VX_fp_madd #(
VX_shift_register #( VX_shift_register #(
.DATAW (1 + TAGW + 1 + 1), .DATAW (1 + TAGW + 1 + 1),
.DEPTH(`LATENCY_FMADD) .DEPTH (`LATENCY_FMADD),
.RESETW (1)
) shift_reg ( ) shift_reg (
.clk(clk), .clk(clk),
.reset (reset), .reset (reset),

View File

@@ -49,7 +49,8 @@ module VX_fp_sqrt #(
VX_shift_register #( VX_shift_register #(
.DATAW (1 + TAGW), .DATAW (1 + TAGW),
.DEPTH(`LATENCY_FSQRT) .DEPTH (`LATENCY_FSQRT),
.RESETW (1)
) shift_reg ( ) shift_reg (
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),

View File

@@ -1,81 +1,16 @@
`include "VX_platform.vh" `include "VX_platform.vh"
module VX_shift_register #(
parameter DATAW = 1,
parameter RESETW = DATAW,
parameter DEPTH = 1
) (
input wire clk,
input wire reset,
input wire enable,
input wire [DATAW-1:0] data_in,
output wire [DATAW-1:0] data_out
);
if (RESETW != 0) begin
if (RESETW == DATAW) begin
VX_shift_register_wr #(
.DATAW (DATAW),
.DEPTH (DEPTH)
) sr (
.clk (clk),
.reset (reset),
.enable (enable),
.data_in (data_in),
.data_out (data_out)
);
end else begin
VX_shift_register_wr #(
.DATAW (DATAW),
.DEPTH (DEPTH)
) sr_wr (
.clk (clk),
.reset (reset),
.enable (enable),
.data_in (data_in[DATAW-1:DATAW-RESETW]),
.data_out (data_out[DATAW-1:DATAW-RESETW])
);
VX_shift_register_nr #(
.DATAW (DATAW),
.DEPTH (DEPTH)
) sr_nr (
.clk (clk),
.enable (enable),
.data_in (data_in[DATAW-RESETW-1:0]),
.data_out (data_out[DATAW-RESETW-1:0])
);
end
end else begin
`UNUSED_VAR (reset)
VX_shift_register_nr #(
.DATAW (DATAW),
.DEPTH (DEPTH)
) sr (
.clk (clk),
.enable (enable),
.data_in (data_in),
.data_out (data_out)
);
end
endmodule
module VX_shift_register_nr #( module VX_shift_register_nr #(
parameter DATAW = 1, parameter DATAW = 1,
parameter DEPTH = 1 parameter DEPTH = 1,
parameter NTAPS = 1,
parameter DEPTHW = $clog2(DEPTH),
parameter [(DEPTHW*NTAPS)-1:0] TAPS = {NTAPS{DEPTHW'(DEPTH-1)}}
) ( ) (
input wire clk, input wire clk,
input wire enable, input wire enable,
input wire [DATAW-1:0] data_in, input wire [DATAW-1:0] data_in,
output wire [DATAW-1:0] data_out output wire [(NTAPS*DATAW)-1:0] data_out
); );
reg [DATAW-1:0] entries [DEPTH-1:0]; reg [DATAW-1:0] entries [DEPTH-1:0];
@@ -87,19 +22,24 @@ module VX_shift_register_nr #(
end end
end end
assign data_out = entries [DEPTH-1]; for (genvar i = 0; i < NTAPS; ++i) begin
assign data_out [i*DATAW+:DATAW] = entries [ TAPS[i*DEPTHW+:DEPTHW] ];
end
endmodule endmodule
module VX_shift_register_wr #( module VX_shift_register_wr #(
parameter DATAW = 1, parameter DATAW = 1,
parameter DEPTH = 1 parameter DEPTH = 1,
parameter NTAPS = 1,
parameter DEPTHW = $clog2(DEPTH),
parameter [(DEPTHW*NTAPS)-1:0] TAPS = {NTAPS{DEPTHW'(DEPTH-1)}}
) ( ) (
input wire clk, input wire clk,
input wire reset, input wire reset,
input wire enable, input wire enable,
input wire [DATAW-1:0] data_in, input wire [DATAW-1:0] data_in,
output wire [DATAW-1:0] data_out output wire [(NTAPS*DATAW)-1:0] data_out
); );
reg [DEPTH-1:0][DATAW-1:0] entries; reg [DEPTH-1:0][DATAW-1:0] entries;
@@ -128,6 +68,87 @@ module VX_shift_register_wr #(
end end
end end
assign data_out = entries [DEPTH-1]; for (genvar i = 0; i < NTAPS; ++i) begin
assign data_out [i*DATAW+:DATAW] = entries [ TAPS[i*DEPTHW+:DEPTHW] ];
end
endmodule
module VX_shift_register #(
parameter DATAW = 1,
parameter RESETW = DATAW,
parameter DEPTH = 1,
parameter NTAPS = 1,
parameter DEPTHW = $clog2(DEPTH),
parameter [(DEPTHW*NTAPS)-1:0] TAPS = {NTAPS{DEPTHW'(DEPTH-1)}}
) (
input wire clk,
input wire reset,
input wire enable,
input wire [DATAW-1:0] data_in,
output wire [(NTAPS*DATAW)-1:0] data_out
);
if (RESETW != 0) begin
if (RESETW == DATAW) begin
VX_shift_register_wr #(
.DATAW (DATAW),
.DEPTH (DEPTH),
.NTAPS (NTAPS),
.TAPS (TAPS)
) sr (
.clk (clk),
.reset (reset),
.enable (enable),
.data_in (data_in),
.data_out (data_out)
);
end else begin
VX_shift_register_wr #(
.DATAW (RESETW),
.DEPTH (DEPTH),
.NTAPS (NTAPS),
.TAPS (TAPS)
) sr_wr (
.clk (clk),
.reset (reset),
.enable (enable),
.data_in (data_in[DATAW-1:DATAW-RESETW]),
.data_out (data_out[DATAW-1:DATAW-RESETW])
);
VX_shift_register_nr #(
.DATAW (DATAW-RESETW),
.DEPTH (DEPTH),
.NTAPS (NTAPS),
.TAPS (TAPS)
) sr_nr (
.clk (clk),
.enable (enable),
.data_in (data_in[DATAW-RESETW-1:0]),
.data_out (data_out[DATAW-RESETW-1:0])
);
end
end else begin
`UNUSED_VAR (reset)
VX_shift_register_nr #(
.DATAW (DATAW),
.DEPTH (DEPTH),
.NTAPS (NTAPS),
.TAPS (TAPS)
) sr (
.clk (clk),
.enable (enable),
.data_in (data_in),
.data_out (data_out)
);
end
endmodule endmodule