pre-submission changes
This commit is contained in:
@@ -38,7 +38,6 @@
|
|||||||
|
|
||||||
`ifdef SYNTHESIS
|
`ifdef SYNTHESIS
|
||||||
`define FPU_FPNEW
|
`define FPU_FPNEW
|
||||||
`define FIRESIM
|
|
||||||
`endif // SYNTHESIS
|
`endif // SYNTHESIS
|
||||||
|
|
||||||
`ifdef SV_DPI
|
`ifdef SV_DPI
|
||||||
|
|||||||
37
hw/rtl/cache/VX_cache_bank.sv
vendored
37
hw/rtl/cache/VX_cache_bank.sv
vendored
@@ -434,10 +434,13 @@ module VX_cache_bank #(
|
|||||||
wire [REQ_SEL_WIDTH-1:0] crsq_idx;
|
wire [REQ_SEL_WIDTH-1:0] crsq_idx;
|
||||||
wire [TAG_WIDTH-1:0] crsq_tag;
|
wire [TAG_WIDTH-1:0] crsq_tag;
|
||||||
|
|
||||||
|
logic [REQ_SEL_WIDTH-1:0] req_idx_st2;
|
||||||
|
logic [TAG_WIDTH-1:0] tag_st2;
|
||||||
|
|
||||||
assign crsq_valid = do_read_hit_st1 || do_replay_rd_st1;
|
assign crsq_valid = do_read_hit_st1 || do_replay_rd_st1;
|
||||||
assign crsq_idx = req_idx_st1;
|
assign crsq_idx = req_idx_st1; // req_idx_st2;
|
||||||
assign crsq_data = read_data_st1;
|
assign crsq_data = read_data_st1;
|
||||||
assign crsq_tag = tag_st1;
|
assign crsq_tag = tag_st1; // tag_st2;
|
||||||
|
|
||||||
`RESET_RELAY (crsp_reset, reset);
|
`RESET_RELAY (crsp_reset, reset);
|
||||||
|
|
||||||
@@ -451,10 +454,40 @@ module VX_cache_bank #(
|
|||||||
.valid_in (crsq_valid && ~rdw_hazard_st1),
|
.valid_in (crsq_valid && ~rdw_hazard_st1),
|
||||||
.ready_in (crsq_ready),
|
.ready_in (crsq_ready),
|
||||||
.data_in ({crsq_tag, crsq_data, crsq_idx}),
|
.data_in ({crsq_tag, crsq_data, crsq_idx}),
|
||||||
|
// .data_out (),
|
||||||
.data_out ({core_rsp_tag, core_rsp_data, core_rsp_idx}),
|
.data_out ({core_rsp_tag, core_rsp_data, core_rsp_idx}),
|
||||||
.valid_out (core_rsp_valid),
|
.valid_out (core_rsp_valid),
|
||||||
.ready_out (core_rsp_ready)
|
.ready_out (core_rsp_ready)
|
||||||
);
|
);
|
||||||
|
/*
|
||||||
|
logic sh_fire_in, sh_val_out;
|
||||||
|
logic [TAG_WIDTH + `CS_WORD_WIDTH + REQ_SEL_WIDTH - 1 : 0] fake_dout;
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (crsp_reset) begin
|
||||||
|
sh_fire_in <= 1'b0;
|
||||||
|
req_idx_st2 <= '0;
|
||||||
|
tag_st2 <= '0;
|
||||||
|
end else begin
|
||||||
|
sh_fire_in <= crsq_valid && (~rdw_hazard_st1) && crsq_ready;
|
||||||
|
req_idx_st2 <= req_idx_st1;
|
||||||
|
tag_st2 <= tag_st1;
|
||||||
|
assert(sh_val_out == core_rsp_valid);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
// $assert(CRSQ_SIZE == 2);
|
||||||
|
VX_stream_buffer_comb #(
|
||||||
|
.DATAW (TAG_WIDTH + `CS_WORD_WIDTH + REQ_SEL_WIDTH),
|
||||||
|
) core_resp_queue_shadow (
|
||||||
|
.clk (clk),
|
||||||
|
.reset (crsp_reset),
|
||||||
|
.valid_in (sh_fire_in),
|
||||||
|
.ready_in (),
|
||||||
|
.data_in ({crsq_tag, crsq_data, crsq_idx}),
|
||||||
|
.data_out ({core_rsp_tag, core_rsp_data, core_rsp_idx}),
|
||||||
|
.valid_out (sh_val_out),
|
||||||
|
.ready_out (core_rsp_ready)
|
||||||
|
);*/
|
||||||
|
|
||||||
assign crsq_stall = crsq_valid && ~crsq_ready;
|
assign crsq_stall = crsq_valid && ~crsq_ready;
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
// Copyright © 2019-2023
|
// Copyright © 2019-2023
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
// you may not use this file except in compliance with the License.
|
// you may not use this file except in compliance with the License.
|
||||||
// You may obtain a copy of the License at
|
// You may obtain a copy of the License at
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
//
|
//
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
@@ -20,17 +20,17 @@ module VX_dp_ram #(
|
|||||||
parameter WRENW = 1,
|
parameter WRENW = 1,
|
||||||
parameter OUT_REG = 0,
|
parameter OUT_REG = 0,
|
||||||
parameter NO_RWCHECK = 0,
|
parameter NO_RWCHECK = 0,
|
||||||
parameter LUTRAM = 0,
|
parameter LUTRAM = 0,
|
||||||
parameter INIT_ENABLE = 0,
|
parameter INIT_ENABLE = 0,
|
||||||
parameter INIT_FILE = "",
|
parameter INIT_FILE = "",
|
||||||
parameter [DATAW-1:0] INIT_VALUE = 0,
|
parameter [DATAW-1:0] INIT_VALUE = 0,
|
||||||
parameter ADDRW = `LOG2UP(SIZE)
|
parameter ADDRW = `LOG2UP(SIZE)
|
||||||
) (
|
) (
|
||||||
input wire clk,
|
input wire clk,
|
||||||
input wire read,
|
input wire read,
|
||||||
input wire write,
|
input wire write,
|
||||||
input wire [WRENW-1:0] wren,
|
input wire [WRENW-1:0] wren,
|
||||||
input wire [ADDRW-1:0] waddr,
|
input wire [ADDRW-1:0] waddr,
|
||||||
input wire [DATAW-1:0] wdata,
|
input wire [DATAW-1:0] wdata,
|
||||||
input wire [ADDRW-1:0] raddr,
|
input wire [ADDRW-1:0] raddr,
|
||||||
output wire [DATAW-1:0] rdata
|
output wire [DATAW-1:0] rdata
|
||||||
@@ -48,14 +48,14 @@ module VX_dp_ram #(
|
|||||||
ram[i] = INIT_VALUE; \
|
ram[i] = INIT_VALUE; \
|
||||||
end \
|
end \
|
||||||
end
|
end
|
||||||
|
|
||||||
`UNUSED_VAR (read)
|
`UNUSED_VAR (read)
|
||||||
|
|
||||||
`ifdef SYNTHESIS
|
`ifdef SYNTHESIS
|
||||||
if (WRENW > 1) begin
|
if (WRENW > 1) begin
|
||||||
`ifdef QUARTUS
|
`ifdef QUARTUS
|
||||||
if (LUTRAM != 0) begin
|
if (LUTRAM != 0) begin
|
||||||
if (OUT_REG != 0) begin
|
if (OUT_REG != 0) begin
|
||||||
reg [DATAW-1:0] rdata_r;
|
reg [DATAW-1:0] rdata_r;
|
||||||
`USE_FAST_BRAM reg [WRENW-1:0][WSELW-1:0] ram [SIZE-1:0];
|
`USE_FAST_BRAM reg [WRENW-1:0][WSELW-1:0] ram [SIZE-1:0];
|
||||||
`RAM_INITIALIZATION
|
`RAM_INITIALIZATION
|
||||||
@@ -134,7 +134,7 @@ module VX_dp_ram #(
|
|||||||
if (LUTRAM != 0) begin
|
if (LUTRAM != 0) begin
|
||||||
`USE_FAST_BRAM reg [DATAW-1:0] ram [SIZE-1:0];
|
`USE_FAST_BRAM reg [DATAW-1:0] ram [SIZE-1:0];
|
||||||
`RAM_INITIALIZATION
|
`RAM_INITIALIZATION
|
||||||
if (OUT_REG != 0) begin
|
if (OUT_REG != 0) begin
|
||||||
reg [DATAW-1:0] rdata_r;
|
reg [DATAW-1:0] rdata_r;
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
if (write) begin
|
if (write) begin
|
||||||
@@ -162,10 +162,10 @@ module VX_dp_ram #(
|
|||||||
end else begin
|
end else begin
|
||||||
`ifndef FIRESIM
|
`ifndef FIRESIM
|
||||||
if (DATAW == 1024 && SIZE == 16) begin // dcache data
|
if (DATAW == 1024 && SIZE == 16) begin // dcache data
|
||||||
dcache_data ram (
|
(* dont_touch = "yes" *) dcache_data ram (
|
||||||
.R0_addr(raddr),
|
.R0_addr(raddr),
|
||||||
.R0_clk(clk),
|
.R0_clk(clk),
|
||||||
.R0_data(rdata),
|
.R0_data(/*rdata*/),
|
||||||
.R0_en(read),
|
.R0_en(read),
|
||||||
.W0_addr(waddr),
|
.W0_addr(waddr),
|
||||||
.W0_clk(clk),
|
.W0_clk(clk),
|
||||||
@@ -174,10 +174,10 @@ module VX_dp_ram #(
|
|||||||
.W0_mask(wren)
|
.W0_mask(wren)
|
||||||
);
|
);
|
||||||
end else if (DATAW == 305 && SIZE == 8) begin // mshr
|
end else if (DATAW == 305 && SIZE == 8) begin // mshr
|
||||||
cache_mshr ram (
|
(* dont_touch = "yes" *) cache_mshr ram (
|
||||||
.R0_addr(raddr),
|
.R0_addr(raddr),
|
||||||
.R0_clk(clk),
|
.R0_clk(clk),
|
||||||
.R0_data(rdata),
|
.R0_data(/*rdata*/),
|
||||||
.R0_en(read),
|
.R0_en(read),
|
||||||
.W0_addr(waddr),
|
.W0_addr(waddr),
|
||||||
.W0_clk(clk),
|
.W0_clk(clk),
|
||||||
@@ -185,10 +185,10 @@ module VX_dp_ram #(
|
|||||||
.W0_en(write)
|
.W0_en(write)
|
||||||
);
|
);
|
||||||
end else if (DATAW == 24 && SIZE == 16) begin // dcache tags
|
end else if (DATAW == 24 && SIZE == 16) begin // dcache tags
|
||||||
dcache_tags ram (
|
(* dont_touch = "yes" *) dcache_tags ram (
|
||||||
.R0_addr(raddr),
|
.R0_addr(raddr),
|
||||||
.R0_clk(clk),
|
.R0_clk(clk),
|
||||||
.R0_data(rdata),
|
.R0_data(/*rdata*/),
|
||||||
.R0_en(read),
|
.R0_en(read),
|
||||||
.W0_addr(waddr),
|
.W0_addr(waddr),
|
||||||
.W0_clk(clk),
|
.W0_clk(clk),
|
||||||
@@ -196,10 +196,10 @@ module VX_dp_ram #(
|
|||||||
.W0_en(write)
|
.W0_en(write)
|
||||||
);
|
);
|
||||||
end else if (DATAW == 1024 && SIZE == 128) begin // icache data
|
end else if (DATAW == 1024 && SIZE == 128) begin // icache data
|
||||||
icache_data ram (
|
(* dont_touch = "yes" *) icache_data ram (
|
||||||
.R0_addr(raddr),
|
.R0_addr(raddr),
|
||||||
.R0_clk(clk),
|
.R0_clk(clk),
|
||||||
.R0_data(rdata),
|
.R0_data(/*rdata*/),
|
||||||
.R0_en(read),
|
.R0_en(read),
|
||||||
.W0_addr(waddr),
|
.W0_addr(waddr),
|
||||||
.W0_clk(clk),
|
.W0_clk(clk),
|
||||||
@@ -208,17 +208,28 @@ module VX_dp_ram #(
|
|||||||
.W0_mask(wren)
|
.W0_mask(wren)
|
||||||
);
|
);
|
||||||
end else if (DATAW == 21 && SIZE == 128) begin // icache tags
|
end else if (DATAW == 21 && SIZE == 128) begin // icache tags
|
||||||
icache_tags ram (
|
(* dont_touch = "yes" *) icache_tags ram (
|
||||||
.R0_addr(raddr),
|
.R0_addr(raddr),
|
||||||
.R0_clk(clk),
|
.R0_clk(clk),
|
||||||
.R0_data(rdata),
|
.R0_data(/*rdata*/),
|
||||||
.R0_en(read),
|
.R0_en(read),
|
||||||
.W0_addr(waddr),
|
.W0_addr(waddr),
|
||||||
.W0_clk(clk),
|
.W0_clk(clk),
|
||||||
.W0_data(wdata),
|
.W0_data(wdata),
|
||||||
.W0_en(write)
|
.W0_en(write)
|
||||||
);
|
);
|
||||||
end else begin
|
end else if (DATAW == 32 && SIZE == 64) begin // register file
|
||||||
|
(* dont_touch = "yes" *) rf_bank ram (
|
||||||
|
.R0_addr(raddr),
|
||||||
|
.R0_clk(clk),
|
||||||
|
.R0_data(/*rdata*/),
|
||||||
|
.R0_en(read),
|
||||||
|
.W0_addr(waddr),
|
||||||
|
.W0_clk(clk),
|
||||||
|
.W0_data(wdata),
|
||||||
|
.W0_en(write)
|
||||||
|
);
|
||||||
|
end // else begin
|
||||||
`endif
|
`endif
|
||||||
if (OUT_REG != 0) begin
|
if (OUT_REG != 0) begin
|
||||||
reg [DATAW-1:0] ram [SIZE-1:0];
|
reg [DATAW-1:0] ram [SIZE-1:0];
|
||||||
@@ -264,7 +275,7 @@ module VX_dp_ram #(
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
`ifndef FIRESIM
|
`ifndef FIRESIM
|
||||||
end
|
// end
|
||||||
`endif
|
`endif
|
||||||
end
|
end
|
||||||
`endif
|
`endif
|
||||||
@@ -273,7 +284,7 @@ module VX_dp_ram #(
|
|||||||
if (LUTRAM != 0) begin
|
if (LUTRAM != 0) begin
|
||||||
`USE_FAST_BRAM reg [DATAW-1:0] ram [SIZE-1:0];
|
`USE_FAST_BRAM reg [DATAW-1:0] ram [SIZE-1:0];
|
||||||
`RAM_INITIALIZATION
|
`RAM_INITIALIZATION
|
||||||
if (OUT_REG != 0) begin
|
if (OUT_REG != 0) begin
|
||||||
reg [DATAW-1:0] rdata_r;
|
reg [DATAW-1:0] rdata_r;
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
if (write) begin
|
if (write) begin
|
||||||
@@ -293,6 +304,51 @@ module VX_dp_ram #(
|
|||||||
assign rdata = ram[raddr];
|
assign rdata = ram[raddr];
|
||||||
end
|
end
|
||||||
end else begin
|
end else begin
|
||||||
|
if (DATAW == 305 && SIZE == 8) begin // mshr
|
||||||
|
(* dont_touch = "yes" *) cache_mshr ram (
|
||||||
|
.R0_addr(raddr),
|
||||||
|
.R0_clk(clk),
|
||||||
|
.R0_data(/*rdata*/),
|
||||||
|
.R0_en(read),
|
||||||
|
.W0_addr(waddr),
|
||||||
|
.W0_clk(clk),
|
||||||
|
.W0_data(wdata),
|
||||||
|
.W0_en(write)
|
||||||
|
);
|
||||||
|
end else if (DATAW == 24 && SIZE == 16) begin // dcache tags
|
||||||
|
(* dont_touch = "yes" *) dcache_tags ram (
|
||||||
|
.R0_addr(raddr),
|
||||||
|
.R0_clk(clk),
|
||||||
|
.R0_data(/*rdata*/),
|
||||||
|
.R0_en(read),
|
||||||
|
.W0_addr(waddr),
|
||||||
|
.W0_clk(clk),
|
||||||
|
.W0_data(wdata),
|
||||||
|
.W0_en(write)
|
||||||
|
);
|
||||||
|
end else if (DATAW == 21 && SIZE == 128) begin // icache tags
|
||||||
|
(* dont_touch = "yes" *) icache_tags ram (
|
||||||
|
.R0_addr(raddr),
|
||||||
|
.R0_clk(clk),
|
||||||
|
.R0_data(/*rdata*/),
|
||||||
|
.R0_en(read),
|
||||||
|
.W0_addr(waddr),
|
||||||
|
.W0_clk(clk),
|
||||||
|
.W0_data(wdata),
|
||||||
|
.W0_en(write)
|
||||||
|
);
|
||||||
|
end else if (DATAW == 32 && SIZE == 64) begin // register file
|
||||||
|
(* dont_touch = "yes" *) rf_bank ram (
|
||||||
|
.R0_addr(raddr),
|
||||||
|
.R0_clk(clk),
|
||||||
|
.R0_data(/*rdata*/),
|
||||||
|
.R0_en(read),
|
||||||
|
.W0_addr(waddr),
|
||||||
|
.W0_clk(clk),
|
||||||
|
.W0_data(wdata),
|
||||||
|
.W0_en(write)
|
||||||
|
);
|
||||||
|
end // else begin
|
||||||
if (OUT_REG != 0) begin
|
if (OUT_REG != 0) begin
|
||||||
reg [DATAW-1:0] ram [SIZE-1:0];
|
reg [DATAW-1:0] ram [SIZE-1:0];
|
||||||
reg [DATAW-1:0] rdata_r;
|
reg [DATAW-1:0] rdata_r;
|
||||||
@@ -328,7 +384,7 @@ module VX_dp_ram #(
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
`else
|
`else
|
||||||
// RAM emulation
|
// RAM emulation
|
||||||
reg [DATAW-1:0] ram [SIZE-1:0];
|
reg [DATAW-1:0] ram [SIZE-1:0];
|
||||||
@@ -339,8 +395,8 @@ module VX_dp_ram #(
|
|||||||
assign ram_n[i * WSELW +: WSELW] = ((WRENW == 1) | wren[i]) ? wdata[i * WSELW +: WSELW] : ram[waddr][i * WSELW +: WSELW];
|
assign ram_n[i * WSELW +: WSELW] = ((WRENW == 1) | wren[i]) ? wdata[i * WSELW +: WSELW] : ram[waddr][i * WSELW +: WSELW];
|
||||||
end
|
end
|
||||||
|
|
||||||
if (OUT_REG != 0) begin
|
if (OUT_REG != 0) begin
|
||||||
reg [DATAW-1:0] rdata_r;
|
reg [DATAW-1:0] rdata_r;
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
if (write) begin
|
if (write) begin
|
||||||
ram[waddr] <= ram_n;
|
ram[waddr] <= ram_n;
|
||||||
@@ -350,7 +406,7 @@ module VX_dp_ram #(
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
assign rdata = rdata_r;
|
assign rdata = rdata_r;
|
||||||
end else begin
|
end else begin
|
||||||
reg [DATAW-1:0] prev_data;
|
reg [DATAW-1:0] prev_data;
|
||||||
reg [ADDRW-1:0] prev_waddr;
|
reg [ADDRW-1:0] prev_waddr;
|
||||||
reg prev_write;
|
reg prev_write;
|
||||||
@@ -361,7 +417,7 @@ module VX_dp_ram #(
|
|||||||
prev_write <= (| wren);
|
prev_write <= (| wren);
|
||||||
prev_data <= ram[waddr];
|
prev_data <= ram[waddr];
|
||||||
prev_waddr <= waddr;
|
prev_waddr <= waddr;
|
||||||
end
|
end
|
||||||
if (LUTRAM || !NO_RWCHECK) begin
|
if (LUTRAM || !NO_RWCHECK) begin
|
||||||
`UNUSED_VAR (prev_write)
|
`UNUSED_VAR (prev_write)
|
||||||
`UNUSED_VAR (prev_data)
|
`UNUSED_VAR (prev_data)
|
||||||
|
|||||||
@@ -123,6 +123,59 @@ module VX_stream_buffer #(
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module VX_stream_buffer_comb #(
|
||||||
|
parameter DATAW = 1,
|
||||||
|
parameter OUT_REG = 0,
|
||||||
|
parameter PASSTHRU = 0
|
||||||
|
) (
|
||||||
|
input wire clk,
|
||||||
|
input wire reset,
|
||||||
|
input wire valid_in,
|
||||||
|
output wire ready_in,
|
||||||
|
input wire [DATAW-1:0] data_in,
|
||||||
|
output wire [DATAW-1:0] data_out,
|
||||||
|
input wire ready_out,
|
||||||
|
output wire valid_out
|
||||||
|
);
|
||||||
|
reg [1:0][DATAW-1:0] shift_reg;
|
||||||
|
reg valid_out_r, ready_in_r, rd_ptr_r;
|
||||||
|
reg bypass;
|
||||||
|
|
||||||
|
wire push = valid_in && ready_in;
|
||||||
|
wire pop = (valid_out_r || valid_in) && ready_out;
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (reset) begin
|
||||||
|
valid_out_r <= 0;
|
||||||
|
ready_in_r <= 1;
|
||||||
|
rd_ptr_r <= 1;
|
||||||
|
end else begin
|
||||||
|
if (push) begin
|
||||||
|
if (!pop) begin
|
||||||
|
ready_in_r <= rd_ptr_r;
|
||||||
|
valid_out_r <= 1;
|
||||||
|
end
|
||||||
|
end else if (pop) begin
|
||||||
|
ready_in_r <= 1;
|
||||||
|
valid_out_r <= rd_ptr_r;
|
||||||
|
end
|
||||||
|
rd_ptr_r <= rd_ptr_r ^ (push ^ pop);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (push) begin
|
||||||
|
shift_reg[1] <= shift_reg[0];
|
||||||
|
shift_reg[0] <= data_in;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assign ready_in = ready_in_r;
|
||||||
|
assign valid_out = valid_out_r || valid_in;
|
||||||
|
assign data_out = valid_out_r ? shift_reg[rd_ptr_r] : data_in;
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
`TRACING_ON
|
`TRACING_ON
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user