cache request interfaces update

This commit is contained in:
Blaise Tine
2021-02-10 20:55:04 -08:00
parent 665b97b810
commit ab63ac9e5d
19 changed files with 275 additions and 192 deletions

View File

@@ -70,33 +70,31 @@ module VX_core #(
//-- //--
VX_cache_core_req_if #( VX_dcache_core_req_if #(
.NUM_REQS(`DNUM_REQUESTS), .NUM_REQS(`DNUM_REQUESTS),
.WORD_SIZE(`DWORD_SIZE), .WORD_SIZE(`DWORD_SIZE),
.CORE_TAG_WIDTH(`DCORE_TAG_WIDTH), .CORE_TAG_WIDTH(`DCORE_TAG_WIDTH),
.CORE_TAG_ID_BITS(`DCORE_TAG_ID_BITS) .CORE_TAG_ID_BITS(`DCORE_TAG_ID_BITS)
) core_dcache_req_if(); ) dcache_core_req_if();
VX_cache_core_rsp_if #( VX_dcache_core_rsp_if #(
.NUM_REQS(`DNUM_REQUESTS), .NUM_REQS(`DNUM_REQUESTS),
.WORD_SIZE(`DWORD_SIZE), .WORD_SIZE(`DWORD_SIZE),
.CORE_TAG_WIDTH(`DCORE_TAG_WIDTH), .CORE_TAG_WIDTH(`DCORE_TAG_WIDTH),
.CORE_TAG_ID_BITS(`DCORE_TAG_ID_BITS) .CORE_TAG_ID_BITS(`DCORE_TAG_ID_BITS)
) core_dcache_rsp_if(); ) dcache_core_rsp_if();
VX_cache_core_req_if #( VX_icache_core_req_if #(
.NUM_REQS(`INUM_REQUESTS),
.WORD_SIZE(`IWORD_SIZE), .WORD_SIZE(`IWORD_SIZE),
.CORE_TAG_WIDTH(`ICORE_TAG_WIDTH), .CORE_TAG_WIDTH(`ICORE_TAG_WIDTH),
.CORE_TAG_ID_BITS(`ICORE_TAG_ID_BITS) .CORE_TAG_ID_BITS(`ICORE_TAG_ID_BITS)
) core_icache_req_if(); ) icache_core_req_if();
VX_cache_core_rsp_if #( VX_icache_core_rsp_if #(
.NUM_REQS(`INUM_REQUESTS),
.WORD_SIZE(`IWORD_SIZE), .WORD_SIZE(`IWORD_SIZE),
.CORE_TAG_WIDTH(`ICORE_TAG_WIDTH), .CORE_TAG_WIDTH(`ICORE_TAG_WIDTH),
.CORE_TAG_ID_BITS(`ICORE_TAG_ID_BITS) .CORE_TAG_ID_BITS(`ICORE_TAG_ID_BITS)
) core_icache_rsp_if(); ) icache_core_rsp_if();
VX_pipeline #( VX_pipeline #(
.CORE_ID(CORE_ID) .CORE_ID(CORE_ID)
@@ -110,34 +108,31 @@ module VX_core #(
.reset(reset), .reset(reset),
// Dcache core request // Dcache core request
.dcache_req_valid (core_dcache_req_if.valid), .dcache_req_valid (dcache_core_req_if.valid),
.dcache_req_rw (core_dcache_req_if.rw), .dcache_req_rw (dcache_core_req_if.rw),
.dcache_req_byteen (core_dcache_req_if.byteen), .dcache_req_byteen (dcache_core_req_if.byteen),
.dcache_req_addr (core_dcache_req_if.addr), .dcache_req_addr (dcache_core_req_if.addr),
.dcache_req_data (core_dcache_req_if.data), .dcache_req_data (dcache_core_req_if.data),
.dcache_req_tag (core_dcache_req_if.tag), .dcache_req_tag (dcache_core_req_if.tag),
.dcache_req_ready (core_dcache_req_if.ready), .dcache_req_ready (dcache_core_req_if.ready),
// Dcache core reponse // Dcache core reponse
.dcache_rsp_valid (core_dcache_rsp_if.valid), .dcache_rsp_valid (dcache_core_rsp_if.valid),
.dcache_rsp_data (core_dcache_rsp_if.data), .dcache_rsp_data (dcache_core_rsp_if.data),
.dcache_rsp_tag (core_dcache_rsp_if.tag), .dcache_rsp_tag (dcache_core_rsp_if.tag),
.dcache_rsp_ready (core_dcache_rsp_if.ready), .dcache_rsp_ready (dcache_core_rsp_if.ready),
// Dcache core request // Icache core request
.icache_req_valid (core_icache_req_if.valid), .icache_req_valid (icache_core_req_if.valid),
.icache_req_rw (core_icache_req_if.rw), .icache_req_addr (icache_core_req_if.addr),
.icache_req_byteen (core_icache_req_if.byteen), .icache_req_tag (icache_core_req_if.tag),
.icache_req_addr (core_icache_req_if.addr), .icache_req_ready (icache_core_req_if.ready),
.icache_req_data (core_icache_req_if.data),
.icache_req_tag (core_icache_req_if.tag),
.icache_req_ready (core_icache_req_if.ready),
// Dcache core reponse // Icache core reponse
.icache_rsp_valid (core_icache_rsp_if.valid), .icache_rsp_valid (icache_core_rsp_if.valid),
.icache_rsp_data (core_icache_rsp_if.data), .icache_rsp_data (icache_core_rsp_if.data),
.icache_rsp_tag (core_icache_rsp_if.tag), .icache_rsp_tag (icache_core_rsp_if.tag),
.icache_rsp_ready (core_icache_rsp_if.ready), .icache_rsp_ready (icache_core_rsp_if.ready),
// CSR request // CSR request
.csr_req_valid (csr_req_valid), .csr_req_valid (csr_req_valid),
@@ -170,12 +165,12 @@ module VX_core #(
.reset (reset), .reset (reset),
// Core <-> Dcache // Core <-> Dcache
.core_dcache_req_if (core_dcache_req_if), .dcache_core_req_if (dcache_core_req_if),
.core_dcache_rsp_if (core_dcache_rsp_if), .dcache_core_rsp_if (dcache_core_rsp_if),
// Core <-> Icache // Core <-> Icache
.core_icache_req_if (core_icache_req_if), .icache_core_req_if (icache_core_req_if),
.core_icache_rsp_if (core_icache_rsp_if), .icache_core_rsp_if (icache_core_rsp_if),
// DRAM // DRAM
.dram_req_if (dram_req_if), .dram_req_if (dram_req_if),

View File

@@ -5,18 +5,18 @@ module VX_databus_arb (
input wire reset, input wire reset,
// input request // input request
VX_cache_core_req_if core_req_if, VX_dcache_core_req_if core_req_if,
// output requests // output requests
VX_cache_core_req_if cache_req_if, VX_dcache_core_req_if cache_req_if,
VX_cache_core_req_if smem_req_if, VX_dcache_core_req_if smem_req_if,
// input responses // input responses
VX_cache_core_rsp_if cache_rsp_if, VX_dcache_core_rsp_if cache_rsp_if,
VX_cache_core_rsp_if smem_rsp_if, VX_dcache_core_rsp_if smem_rsp_if,
// output response // output response
VX_cache_core_rsp_if core_rsp_if VX_dcache_core_rsp_if core_rsp_if
); );
localparam SMEM_ASHIFT = `CLOG2(`SHARED_MEM_BASE_ADDR_ALIGN); localparam SMEM_ASHIFT = `CLOG2(`SHARED_MEM_BASE_ADDR_ALIGN);
localparam REQ_ASHIFT = `CLOG2(`DWORD_SIZE); localparam REQ_ASHIFT = `CLOG2(`DWORD_SIZE);

View File

@@ -259,9 +259,6 @@
// DRAM byte enable bits // DRAM byte enable bits
`define IDRAM_BYTEEN_WIDTH `ICACHE_LINE_SIZE `define IDRAM_BYTEEN_WIDTH `ICACHE_LINE_SIZE
// Core request size
`define INUM_REQUESTS 1
////////////////////////// Dcache Configurable Knobs ////////////////////////// ////////////////////////// Dcache Configurable Knobs //////////////////////////
// Cache ID // Cache ID

View File

@@ -13,8 +13,8 @@ module VX_execute #(
VX_csr_io_rsp_if csr_io_rsp_if, VX_csr_io_rsp_if csr_io_rsp_if,
// Dcache interface // Dcache interface
VX_cache_core_req_if dcache_req_if, VX_dcache_core_req_if dcache_req_if,
VX_cache_core_rsp_if dcache_rsp_if, VX_dcache_core_rsp_if dcache_rsp_if,
// commit status // commit status
VX_cmt_to_csr_if cmt_to_csr_if, VX_cmt_to_csr_if cmt_to_csr_if,

View File

@@ -9,8 +9,8 @@ module VX_fetch #(
input wire reset, input wire reset,
// Icache interface // Icache interface
VX_cache_core_req_if icache_req_if, VX_icache_core_req_if icache_req_if,
VX_cache_core_rsp_if icache_rsp_if, VX_icache_core_rsp_if icache_rsp_if,
// inputs // inputs
VX_wstall_if wstall_if, VX_wstall_if wstall_if,

View File

@@ -9,8 +9,8 @@ module VX_icache_stage #(
input wire reset, input wire reset,
// Icache interface // Icache interface
VX_cache_core_req_if icache_req_if, VX_icache_core_req_if icache_req_if,
VX_cache_core_rsp_if icache_rsp_if, VX_icache_core_rsp_if icache_rsp_if,
// request // request
VX_ifetch_req_if ifetch_req_if, VX_ifetch_req_if ifetch_req_if,
@@ -23,7 +23,10 @@ module VX_icache_stage #(
wire icache_req_fire = icache_req_if.valid && icache_req_if.ready; wire icache_req_fire = icache_req_if.valid && icache_req_if.ready;
wire [`NW_BITS-1:0] req_tag = ifetch_req_if.wid; wire [`NW_BITS-1:0] req_tag = ifetch_req_if.wid;
wire [`NW_BITS-1:0] rsp_tag = icache_rsp_if.tag[0][`NW_BITS-1:0]; wire [`NW_BITS-1:0] rsp_tag = icache_rsp_if.tag[`NW_BITS-1:0];
wire [31:0] rsp_PC;
wire [`NUM_THREADS-1:0] rsp_tmask;
VX_dp_ram #( VX_dp_ram #(
.DATAW(32 + `NUM_THREADS), .DATAW(32 + `NUM_THREADS),
@@ -37,15 +40,12 @@ module VX_icache_stage #(
.byteen(1'b1), .byteen(1'b1),
.rden(ifetch_rsp_if.valid), .rden(ifetch_rsp_if.valid),
.din({ifetch_req_if.PC, ifetch_req_if.tmask}), .din({ifetch_req_if.PC, ifetch_req_if.tmask}),
.dout({ifetch_rsp_if.PC, ifetch_rsp_if.tmask}) .dout({rsp_PC, rsp_tmask})
); );
// Icache Request // Icache Request
assign icache_req_if.valid = ifetch_req_if.valid; assign icache_req_if.valid = ifetch_req_if.valid;
assign icache_req_if.rw = 0; assign icache_req_if.addr = ifetch_req_if.PC[31:2];
assign icache_req_if.byteen = 4'b1111;
assign icache_req_if.addr = ifetch_req_if.PC[31:2];
assign icache_req_if.data = 0;
// Can accept new request? // Can accept new request?
assign ifetch_req_if.ready = icache_req_if.ready; assign ifetch_req_if.ready = icache_req_if.ready;
@@ -57,8 +57,10 @@ module VX_icache_stage #(
`endif `endif
assign ifetch_rsp_if.valid = icache_rsp_if.valid; assign ifetch_rsp_if.valid = icache_rsp_if.valid;
assign ifetch_rsp_if.tmask = rsp_tmask;
assign ifetch_rsp_if.wid = rsp_tag; assign ifetch_rsp_if.wid = rsp_tag;
assign ifetch_rsp_if.instr = icache_rsp_if.data[0]; assign ifetch_rsp_if.PC = rsp_PC;
assign ifetch_rsp_if.instr = icache_rsp_if.data;
// Can accept new response? // Can accept new response?
assign icache_rsp_if.ready = ifetch_rsp_if.ready; assign icache_rsp_if.ready = ifetch_rsp_if.ready;
@@ -68,7 +70,7 @@ module VX_icache_stage #(
`SCOPE_ASSIGN (icache_req_addr, {icache_req_if.addr, 2'b0}); `SCOPE_ASSIGN (icache_req_addr, {icache_req_if.addr, 2'b0});
`SCOPE_ASSIGN (icache_req_tag, req_tag); `SCOPE_ASSIGN (icache_req_tag, req_tag);
`SCOPE_ASSIGN (icache_rsp_fire, icache_rsp_if.valid && icache_rsp_if.ready); `SCOPE_ASSIGN (icache_rsp_fire, icache_rsp_if.valid && icache_rsp_if.ready);
`SCOPE_ASSIGN (icache_rsp_data, icache_rsp_if.data[0]); `SCOPE_ASSIGN (icache_rsp_data, icache_rsp_if.data);
`SCOPE_ASSIGN (icache_rsp_tag, rsp_tag); `SCOPE_ASSIGN (icache_rsp_tag, rsp_tag);
`ifdef DBG_PRINT_CORE_ICACHE `ifdef DBG_PRINT_CORE_ICACHE

View File

@@ -9,8 +9,8 @@ module VX_lsu_unit #(
input wire reset, input wire reset,
// Dcache interface // Dcache interface
VX_cache_core_req_if dcache_req_if, VX_dcache_core_req_if dcache_req_if,
VX_cache_core_rsp_if dcache_rsp_if, VX_dcache_core_rsp_if dcache_rsp_if,
// inputs // inputs
VX_lsu_req_if lsu_req_if, VX_lsu_req_if lsu_req_if,
@@ -36,14 +36,14 @@ module VX_lsu_unit #(
assign full_address[i] = lsu_req_if.base_addr[i] + lsu_req_if.offset; assign full_address[i] = lsu_req_if.base_addr[i] + lsu_req_if.offset;
end end
wire [`NUM_THREADS-2:0] addr_matches; wire [`NUM_THREADS-1:0] addr_matches;
for (genvar i = 1; i < `NUM_THREADS; i++) begin for (genvar i = 0; i < `NUM_THREADS; i++) begin
assign addr_matches[i-1] = (full_address[0][31:2] == full_address[i][31:2]) || ~lsu_req_if.tmask[i]; assign addr_matches[i] = (full_address[0][31:2] == full_address[i][31:2]) || ~lsu_req_if.tmask[i];
end end
wire is_dup_load = lsu_req_if.wb && (& addr_matches); wire is_dup_load = lsu_req_if.wb && lsu_req_if.tmask[0] && (& addr_matches);
`IGNORE_WARNINGS_BEGIN `IGNORE_WARNINGS_BEGIN
reg [`LSUQ_SIZE-1:0][`DCORE_TAG_WIDTH-1:0] pending_tags; reg [`LSUQ_SIZE-1:0][`DCORE_TAG_ID_BITS-1:0] pending_tags;
`IGNORE_WARNINGS_END `IGNORE_WARNINGS_END
wire ready_in; wire ready_in;
@@ -92,7 +92,7 @@ module VX_lsu_unit #(
wire mbuf_pop = mbuf_pop_part && (rsp_rem_mask_n == 0 || rsp_is_dup); wire mbuf_pop = mbuf_pop_part && (rsp_rem_mask_n == 0 || rsp_is_dup);
assign mbuf_raddr = dcache_rsp_if.tag[0][`DCORE_TAG_ID_BITS-1:0]; assign mbuf_raddr = dcache_rsp_if.tag[`DCORE_TAG_ID_BITS-1:0];
VX_index_buffer #( VX_index_buffer #(
.DATAW (`NW_BITS + 32 + `NR_BITS + 1 + `LSU_BITS + (`NUM_THREADS * 2) + 1), .DATAW (`NW_BITS + 32 + `NR_BITS + 1 + `LSU_BITS + (`NUM_THREADS * 2) + 1),
@@ -136,7 +136,7 @@ module VX_lsu_unit #(
always @(posedge clk) begin always @(posedge clk) begin
if (mbuf_push) begin if (mbuf_push) begin
rsp_rem_mask[mbuf_waddr] <= req_tmask; rsp_rem_mask[mbuf_waddr] <= req_tmask;
pending_tags[mbuf_waddr] <= dcache_req_if.tag[0]; pending_tags[mbuf_waddr] <= req_tag;
end end
if (mbuf_pop_part) begin if (mbuf_pop_part) begin
rsp_rem_mask[mbuf_raddr] <= rsp_rem_mask_n; rsp_rem_mask[mbuf_raddr] <= rsp_rem_mask_n;
@@ -266,16 +266,16 @@ module VX_lsu_unit #(
`ifdef DBG_PRINT_CORE_DCACHE `ifdef DBG_PRINT_CORE_DCACHE
always @(posedge clk) begin always @(posedge clk) begin
if ((| (dcache_req_if.valid & dcache_req_if.ready))) begin if ((| (dcache_req_if.valid & dcache_req_if.ready))) begin
if (dcache_req_if.rw[0]) if ((| dcache_req_if.rw))
$display("%t: D$%0d Wr Req: wid=%0d, PC=%0h, tmask=%b, addr=%0h, tag=%0h, byteen=%0h, data=%0h", $display("%t: D$%0d Wr Req: wid=%0d, PC=%0h, tmask=%b, addr=%0h, tag=%0h, byteen=%0h, data=%0h",
$time, CORE_ID, req_wid, req_pc, (dcache_req_if.valid & dcache_req_if.ready), req_addr, dcache_req_if.tag, dcache_req_if.byteen, dcache_req_if.data); $time, CORE_ID, req_wid, req_pc, (dcache_req_if.valid & dcache_req_if.ready), req_addr, dcache_req_if.tag, dcache_req_if.byteen, dcache_req_if.data);
else else
$display("%t: D$%0d Rd Req: wid=%0d, PC=%0h, tmask=%b, addr=%0h, tag=%0h, byteen=%0h, rd=%0d, is_dup=%b", $display("%t: D$%0d Rd Req: wid=%0d, PC=%0h, tmask=%b, addr=%0h, tag=%0h, byteen=%0h, rd=%0d, is_dup=%b",
$time, CORE_ID, req_wid, req_pc, (dcache_req_if.valid & dcache_req_if.ready), req_addr, dcache_req_if.tag, dcache_req_if.byteen, req_rd, req_is_dup); $time, CORE_ID, req_wid, req_pc, (dcache_req_if.valid & dcache_req_if.ready), req_addr, dcache_req_if.tag, dcache_req_if.byteen, req_rd, req_is_dup);
end end
if ((| dcache_rsp_if.valid) && dcache_rsp_if.ready) begin if ((| dcache_rsp_if.valid) && dcache_rsp_if.ready) begin
$display("%t: D$%0d Rsp: valid=%b, wid=%0d, PC=%0h, tag=%0h, rd=%0d, data=%0h, is_dup=%b", $display("%t: D$%0d Rsp: valid=%b, wid=%0d, PC=%0h, tag=%0h, rd=%0d, data=%0h, is_dup=%b",
$time, CORE_ID, dcache_rsp_if.valid, rsp_wid, rsp_pc, dcache_rsp_if.tag, rsp_rd, dcache_rsp_if.data, rsp_is_dup); $time, CORE_ID, dcache_rsp_if.valid, rsp_wid, rsp_pc, dcache_rsp_if.tag, rsp_rd, dcache_rsp_if.data, rsp_is_dup);
end end
if (mbuf_full) begin if (mbuf_full) begin
$write("%t: D$%0d queue-full:", $time, CORE_ID); $write("%t: D$%0d queue-full:", $time, CORE_ID);

View File

@@ -13,12 +13,12 @@ module VX_mem_unit # (
`endif `endif
// Core <-> Dcache // Core <-> Dcache
VX_cache_core_req_if core_dcache_req_if, VX_dcache_core_req_if dcache_core_req_if,
VX_cache_core_rsp_if core_dcache_rsp_if, VX_dcache_core_rsp_if dcache_core_rsp_if,
// Core <-> Icache // Core <-> Icache
VX_cache_core_req_if core_icache_req_if, VX_icache_core_req_if icache_core_req_if,
VX_cache_core_rsp_if core_icache_rsp_if, VX_icache_core_rsp_if icache_core_rsp_if,
// DRAM // DRAM
VX_cache_dram_req_if dram_req_if, VX_cache_dram_req_if dram_req_if,
@@ -40,28 +40,28 @@ module VX_mem_unit # (
.DRAM_TAG_WIDTH (`DDRAM_TAG_WIDTH) .DRAM_TAG_WIDTH (`DDRAM_TAG_WIDTH)
) dcache_dram_rsp_if(), icache_dram_rsp_if(); ) dcache_dram_rsp_if(), icache_dram_rsp_if();
VX_cache_core_req_if #( VX_dcache_core_req_if #(
.NUM_REQS (`DNUM_REQUESTS), .NUM_REQS (`DNUM_REQUESTS),
.WORD_SIZE (`DWORD_SIZE), .WORD_SIZE (`DWORD_SIZE),
.CORE_TAG_WIDTH (`DCORE_TAG_WIDTH), .CORE_TAG_WIDTH (`DCORE_TAG_WIDTH),
.CORE_TAG_ID_BITS (`DCORE_TAG_ID_BITS) .CORE_TAG_ID_BITS (`DCORE_TAG_ID_BITS)
) dcache_req_if(); ) dcache_req_if();
VX_cache_core_rsp_if #( VX_dcache_core_rsp_if #(
.NUM_REQS (`DNUM_REQUESTS), .NUM_REQS (`DNUM_REQUESTS),
.WORD_SIZE (`DWORD_SIZE), .WORD_SIZE (`DWORD_SIZE),
.CORE_TAG_WIDTH (`DCORE_TAG_WIDTH), .CORE_TAG_WIDTH (`DCORE_TAG_WIDTH),
.CORE_TAG_ID_BITS (`DCORE_TAG_ID_BITS) .CORE_TAG_ID_BITS (`DCORE_TAG_ID_BITS)
) dcache_rsp_if(); ) dcache_rsp_if();
VX_cache_core_req_if #( VX_dcache_core_req_if #(
.NUM_REQS (`DNUM_REQUESTS), .NUM_REQS (`DNUM_REQUESTS),
.WORD_SIZE (`DWORD_SIZE), .WORD_SIZE (`DWORD_SIZE),
.CORE_TAG_WIDTH (`DCORE_TAG_WIDTH), .CORE_TAG_WIDTH (`DCORE_TAG_WIDTH),
.CORE_TAG_ID_BITS (`DCORE_TAG_ID_BITS) .CORE_TAG_ID_BITS (`DCORE_TAG_ID_BITS)
) smem_req_if(); ) smem_req_if();
VX_cache_core_rsp_if #( VX_dcache_core_rsp_if #(
.NUM_REQS (`DNUM_REQUESTS), .NUM_REQS (`DNUM_REQUESTS),
.WORD_SIZE (`DWORD_SIZE), .WORD_SIZE (`DWORD_SIZE),
.CORE_TAG_WIDTH (`DCORE_TAG_WIDTH), .CORE_TAG_WIDTH (`DCORE_TAG_WIDTH),
@@ -72,13 +72,13 @@ module VX_mem_unit # (
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),
.core_req_if (core_dcache_req_if), .core_req_if (dcache_core_req_if),
.cache_req_if (dcache_req_if), .cache_req_if (dcache_req_if),
.smem_req_if (smem_req_if), .smem_req_if (smem_req_if),
.cache_rsp_if (dcache_rsp_if), .cache_rsp_if (dcache_rsp_if),
.smem_rsp_if (smem_rsp_if), .smem_rsp_if (smem_rsp_if),
.core_rsp_if (core_dcache_rsp_if) .core_rsp_if (dcache_core_rsp_if)
); );
wire icache_reset, dcache_reset; wire icache_reset, dcache_reset;
@@ -97,7 +97,7 @@ module VX_mem_unit # (
.CACHE_LINE_SIZE (`ICACHE_LINE_SIZE), .CACHE_LINE_SIZE (`ICACHE_LINE_SIZE),
.NUM_BANKS (`INUM_BANKS), .NUM_BANKS (`INUM_BANKS),
.WORD_SIZE (`IWORD_SIZE), .WORD_SIZE (`IWORD_SIZE),
.NUM_REQS (`INUM_REQUESTS), .NUM_REQS (1),
.CREQ_SIZE (`ICREQ_SIZE), .CREQ_SIZE (`ICREQ_SIZE),
.MSHR_SIZE (`IMSHR_SIZE), .MSHR_SIZE (`IMSHR_SIZE),
.DRSQ_SIZE (`IDRSQ_SIZE), .DRSQ_SIZE (`IDRSQ_SIZE),
@@ -116,19 +116,19 @@ module VX_mem_unit # (
.flush (1'b0), .flush (1'b0),
// Core request // Core request
.core_req_valid (core_icache_req_if.valid), .core_req_valid (icache_core_req_if.valid),
.core_req_rw (core_icache_req_if.rw), .core_req_rw (1'b0),
.core_req_byteen (core_icache_req_if.byteen), .core_req_byteen ({`IWORD_SIZE{1'b1}}),
.core_req_addr (core_icache_req_if.addr), .core_req_addr (icache_core_req_if.addr),
.core_req_data (core_icache_req_if.data), .core_req_data ('x),
.core_req_tag (core_icache_req_if.tag), .core_req_tag (icache_core_req_if.tag),
.core_req_ready (core_icache_req_if.ready), .core_req_ready (icache_core_req_if.ready),
// Core response // Core response
.core_rsp_valid (core_icache_rsp_if.valid), .core_rsp_valid (icache_core_rsp_if.valid),
.core_rsp_data (core_icache_rsp_if.data), .core_rsp_data (icache_core_rsp_if.data),
.core_rsp_tag (core_icache_rsp_if.tag), .core_rsp_tag (icache_core_rsp_if.tag),
.core_rsp_ready (core_icache_rsp_if.ready), .core_rsp_ready (icache_core_rsp_if.ready),
`ifdef PERF_ENABLE `ifdef PERF_ENABLE
.perf_cache_if (perf_icache_if), .perf_cache_if (perf_icache_if),

View File

@@ -26,10 +26,7 @@ module VX_pipeline #(
// Icache core request // Icache core request
output wire icache_req_valid, output wire icache_req_valid,
output wire icache_req_rw,
output wire [3:0] icache_req_byteen,
output wire [29:0] icache_req_addr, output wire [29:0] icache_req_addr,
output wire [31:0] icache_req_data,
output wire [`ICORE_TAG_WIDTH-1:0] icache_req_tag, output wire [`ICORE_TAG_WIDTH-1:0] icache_req_tag,
input wire icache_req_ready, input wire icache_req_ready,
@@ -63,71 +60,66 @@ module VX_pipeline #(
// Dcache request // Dcache request
// //
VX_cache_core_req_if #( VX_dcache_core_req_if #(
.NUM_REQS(`NUM_THREADS), .NUM_REQS(`NUM_THREADS),
.WORD_SIZE(4), .WORD_SIZE(4),
.CORE_TAG_WIDTH(`DCORE_TAG_WIDTH), .CORE_TAG_WIDTH(`DCORE_TAG_WIDTH),
.CORE_TAG_ID_BITS(`DCORE_TAG_ID_BITS) .CORE_TAG_ID_BITS(`DCORE_TAG_ID_BITS)
) core_dcache_req_if(); ) dcache_core_req_if();
assign dcache_req_valid = core_dcache_req_if.valid; assign dcache_req_valid = dcache_core_req_if.valid;
assign dcache_req_rw = core_dcache_req_if.rw; assign dcache_req_rw = dcache_core_req_if.rw;
assign dcache_req_byteen = core_dcache_req_if.byteen; assign dcache_req_byteen = dcache_core_req_if.byteen;
assign dcache_req_addr = core_dcache_req_if.addr; assign dcache_req_addr = dcache_core_req_if.addr;
assign dcache_req_data = core_dcache_req_if.data; assign dcache_req_data = dcache_core_req_if.data;
assign dcache_req_tag = core_dcache_req_if.tag; assign dcache_req_tag = dcache_core_req_if.tag;
assign core_dcache_req_if.ready = dcache_req_ready; assign dcache_core_req_if.ready = dcache_req_ready;
// //
// Dcache response // Dcache response
// //
VX_cache_core_rsp_if #( VX_dcache_core_rsp_if #(
.NUM_REQS(`NUM_THREADS), .NUM_REQS(`NUM_THREADS),
.WORD_SIZE(4), .WORD_SIZE(4),
.CORE_TAG_WIDTH(`DCORE_TAG_WIDTH), .CORE_TAG_WIDTH(`DCORE_TAG_WIDTH),
.CORE_TAG_ID_BITS(`DCORE_TAG_ID_BITS) .CORE_TAG_ID_BITS(`DCORE_TAG_ID_BITS)
) core_dcache_rsp_if(); ) dcache_core_rsp_if();
assign core_dcache_rsp_if.valid = dcache_rsp_valid; assign dcache_core_rsp_if.valid = dcache_rsp_valid;
assign core_dcache_rsp_if.data = dcache_rsp_data; assign dcache_core_rsp_if.data = dcache_rsp_data;
assign core_dcache_rsp_if.tag = dcache_rsp_tag; assign dcache_core_rsp_if.tag = dcache_rsp_tag;
assign dcache_rsp_ready = core_dcache_rsp_if.ready; assign dcache_rsp_ready = dcache_core_rsp_if.ready;
// //
// Icache request // Icache request
// //
VX_cache_core_req_if #( VX_icache_core_req_if #(
.NUM_REQS(1),
.WORD_SIZE(4), .WORD_SIZE(4),
.CORE_TAG_WIDTH(`ICORE_TAG_WIDTH), .CORE_TAG_WIDTH(`ICORE_TAG_WIDTH),
.CORE_TAG_ID_BITS(`ICORE_TAG_ID_BITS) .CORE_TAG_ID_BITS(`ICORE_TAG_ID_BITS)
) core_icache_req_if(); ) icache_core_req_if();
assign icache_req_valid = core_icache_req_if.valid; assign icache_req_valid = icache_core_req_if.valid;
assign icache_req_rw = core_icache_req_if.rw; assign icache_req_addr = icache_core_req_if.addr;
assign icache_req_byteen = core_icache_req_if.byteen; assign icache_req_tag = icache_core_req_if.tag;
assign icache_req_addr = core_icache_req_if.addr; assign icache_core_req_if.ready = icache_req_ready;
assign icache_req_data = core_icache_req_if.data;
assign icache_req_tag = core_icache_req_if.tag;
assign core_icache_req_if.ready = icache_req_ready;
// //
// Icache response // Icache response
// //
VX_cache_core_rsp_if #( VX_icache_core_rsp_if #(
.NUM_REQS(1),
.WORD_SIZE(4), .WORD_SIZE(4),
.CORE_TAG_WIDTH(`ICORE_TAG_WIDTH), .CORE_TAG_WIDTH(`ICORE_TAG_WIDTH),
.CORE_TAG_ID_BITS(`ICORE_TAG_ID_BITS) .CORE_TAG_ID_BITS(`ICORE_TAG_ID_BITS)
) core_icache_rsp_if(); ) icache_core_rsp_if();
assign core_icache_rsp_if.valid = icache_rsp_valid; assign icache_core_rsp_if.valid = icache_rsp_valid;
assign core_icache_rsp_if.data = icache_rsp_data; assign icache_core_rsp_if.data = icache_rsp_data;
assign core_icache_rsp_if.tag = icache_rsp_tag; assign icache_core_rsp_if.tag = icache_rsp_tag;
assign icache_rsp_ready = core_icache_rsp_if.ready; assign icache_rsp_ready = icache_core_rsp_if.ready;
// //
// CSR IO request // CSR IO request
@@ -183,8 +175,8 @@ module VX_pipeline #(
`SCOPE_BIND_VX_pipeline_fetch `SCOPE_BIND_VX_pipeline_fetch
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),
.icache_req_if (core_icache_req_if), .icache_req_if (icache_core_req_if),
.icache_rsp_if (core_icache_rsp_if), .icache_rsp_if (icache_core_rsp_if),
.wstall_if (wstall_if), .wstall_if (wstall_if),
.join_if (join_if), .join_if (join_if),
.warp_ctl_if (warp_ctl_if), .warp_ctl_if (warp_ctl_if),
@@ -240,8 +232,8 @@ module VX_pipeline #(
.perf_pipeline_if (perf_pipeline_if), .perf_pipeline_if (perf_pipeline_if),
`endif `endif
.dcache_req_if (core_dcache_req_if), .dcache_req_if (dcache_core_req_if),
.dcache_rsp_if (core_dcache_rsp_if), .dcache_rsp_if (dcache_core_rsp_if),
.csr_io_req_if (csr_io_req_if), .csr_io_req_if (csr_io_req_if),
.csr_io_rsp_if (csr_io_rsp_if), .csr_io_rsp_if (csr_io_rsp_if),

View File

@@ -55,6 +55,8 @@
`define CORE_REQ_TAG_COUNT ((CORE_TAG_ID_BITS != 0) ? 1 : NUM_REQS) `define CORE_REQ_TAG_COUNT ((CORE_TAG_ID_BITS != 0) ? 1 : NUM_REQS)
`define BANK_READY_COUNT ((SHARED_BANK_READY != 0) ? 1 : NUM_BANKS)
`define DRAM_ADDR_BANK(x) x[`BANK_SELECT_BITS+BANK_ADDR_OFFSET-1 : BANK_ADDR_OFFSET] `define DRAM_ADDR_BANK(x) x[`BANK_SELECT_BITS+BANK_ADDR_OFFSET-1 : BANK_ADDR_OFFSET]
`define DRAM_TO_LINE_ADDR(x) x[`DRAM_ADDR_WIDTH-1 : `BANK_SELECT_BITS] `define DRAM_TO_LINE_ADDR(x) x[`DRAM_ADDR_WIDTH-1 : `BANK_SELECT_BITS]

View File

@@ -14,7 +14,9 @@ module VX_cache_core_req_bank_sel #(
// core request tag size // core request tag size
parameter CORE_TAG_WIDTH = 3, parameter CORE_TAG_WIDTH = 3,
// bank offset from beginning of index range // bank offset from beginning of index range
parameter BANK_ADDR_OFFSET = 0 parameter BANK_ADDR_OFFSET = 0,
// shared bank ready signal
parameter SHARED_BANK_READY = 0
) ( ) (
input wire clk, input wire clk,
input wire reset, input wire reset,
@@ -39,7 +41,7 @@ module VX_cache_core_req_bank_sel #(
output wire [NUM_BANKS-1:0][NUM_PORTS-1:0][`WORD_WIDTH-1:0] per_bank_core_req_data, output wire [NUM_BANKS-1:0][NUM_PORTS-1:0][`WORD_WIDTH-1:0] per_bank_core_req_data,
output wire [NUM_BANKS-1:0][NUM_PORTS-1:0][`REQS_BITS-1:0] per_bank_core_req_tid, output wire [NUM_BANKS-1:0][NUM_PORTS-1:0][`REQS_BITS-1:0] per_bank_core_req_tid,
output wire [NUM_BANKS-1:0][CORE_TAG_WIDTH-1:0] per_bank_core_req_tag, output wire [NUM_BANKS-1:0][CORE_TAG_WIDTH-1:0] per_bank_core_req_tag,
input wire [NUM_BANKS-1:0] per_bank_core_req_ready input wire [`BANK_READY_COUNT-1:0] per_bank_core_req_ready
); );
`STATIC_ASSERT (NUM_REQS >= NUM_BANKS, ("invalid number of banks")); `STATIC_ASSERT (NUM_REQS >= NUM_BANKS, ("invalid number of banks"));
@@ -129,11 +131,21 @@ module VX_cache_core_req_bank_sel #(
end end
end end
always @(*) begin if (SHARED_BANK_READY == 0) begin
for (integer i = 0; i < NUM_REQS; ++i) begin always @(*) begin
core_req_ready_r[i] = per_bank_core_req_ready[core_req_bid[i]] for (integer i = 0; i < NUM_REQS; ++i) begin
&& core_req_line_match[i] core_req_ready_r[i] = per_bank_core_req_ready[core_req_bid[i]]
&& req_select_table_r[core_req_bid[i]][i % NUM_PORTS][i]; && core_req_line_match[i]
&& req_select_table_r[core_req_bid[i]][i % NUM_PORTS][i];
end
end
end else begin
always @(*) begin
for (integer i = 0; i < NUM_REQS; ++i) begin
core_req_ready_r[i] = per_bank_core_req_ready
&& core_req_line_match[i]
&& req_select_table_r[core_req_bid[i]][i % NUM_PORTS][i];
end
end end
end end
@@ -148,7 +160,6 @@ module VX_cache_core_req_bank_sel #(
per_bank_core_req_data_r = 'x; per_bank_core_req_data_r = 'x;
per_bank_core_req_tag_r = 'x; per_bank_core_req_tag_r = 'x;
per_bank_core_req_tid_r = 'x; per_bank_core_req_tid_r = 'x;
core_req_ready_r = 'x;
for (integer i = NUM_REQS-1; i >= 0; --i) begin for (integer i = NUM_REQS-1; i >= 0; --i) begin
if (core_req_valid[i]) begin if (core_req_valid[i]) begin
@@ -160,8 +171,28 @@ module VX_cache_core_req_bank_sel #(
per_bank_core_req_rw_r[core_req_bid[i]] = core_req_rw[i]; per_bank_core_req_rw_r[core_req_bid[i]] = core_req_rw[i];
per_bank_core_req_addr_r[core_req_bid[i]] = core_req_line_addr[i]; per_bank_core_req_addr_r[core_req_bid[i]] = core_req_line_addr[i];
per_bank_core_req_tag_r[core_req_bid[i]] = core_req_tag[i]; per_bank_core_req_tag_r[core_req_bid[i]] = core_req_tag[i];
core_req_ready_r[i] = per_bank_core_req_ready[core_req_bid[i]] end
&& core_req_line_match[i]; end
end
if (SHARED_BANK_READY == 0) begin
always @(*) begin
core_req_ready_r = 'x;
for (integer i = NUM_REQS-1; i >= 0; --i) begin
if (core_req_valid[i]) begin
core_req_ready_r[i] = per_bank_core_req_ready[core_req_bid[i]]
&& core_req_line_match[i];
end
end
end
end else begin
always @(*) begin
core_req_ready_r = 'x;
for (integer i = NUM_REQS-1; i >= 0; --i) begin
if (core_req_valid[i]) begin
core_req_ready_r[i] = per_bank_core_req_ready
&& core_req_line_match[i];
end
end end
end end
end end
@@ -193,13 +224,27 @@ module VX_cache_core_req_bank_sel #(
end end
end end
always @(*) begin if (SHARED_BANK_READY == 0) begin
core_req_ready_r = 0; always @(*) begin
for (integer j = 0; j < NUM_BANKS; ++j) begin core_req_ready_r = 0;
for (integer i = 0; i < NUM_REQS; ++i) begin for (integer j = 0; j < NUM_BANKS; ++j) begin
if (core_req_valid[i] && (core_req_bid[i] == `BANK_SELECT_BITS'(j))) begin for (integer i = 0; i < NUM_REQS; ++i) begin
core_req_ready_r[i] = per_bank_core_req_ready[j]; if (core_req_valid[i] && (core_req_bid[i] == `BANK_SELECT_BITS'(j))) begin
break; core_req_ready_r[i] = per_bank_core_req_ready[j];
break;
end
end
end
end
end else begin
always @(*) begin
core_req_ready_r = 0;
for (integer j = 0; j < NUM_BANKS; ++j) begin
for (integer i = 0; i < NUM_REQS; ++i) begin
if (core_req_valid[i] && (core_req_bid[i] == `BANK_SELECT_BITS'(j))) begin
core_req_ready_r[i] = per_bank_core_req_ready;
break;
end
end end
end end
end end
@@ -234,12 +279,25 @@ module VX_cache_core_req_bank_sel #(
`ifdef PERF_ENABLE `ifdef PERF_ENABLE
reg [NUM_REQS-1:0] core_req_sel_r; reg [NUM_REQS-1:0] core_req_sel_r;
always @(*) begin if (SHARED_BANK_READY == 0) begin
core_req_sel_r = 0; always @(*) begin
for (integer j = 0; j < NUM_BANKS; ++j) begin core_req_sel_r = 0;
for (integer i = 0; i < NUM_REQS; ++i) begin for (integer j = 0; j < NUM_BANKS; ++j) begin
if (core_req_valid[i] && (core_req_bid[i] == `UP(`BANK_SELECT_BITS)'(j))) begin for (integer i = 0; i < NUM_REQS; ++i) begin
core_req_sel_r[i] = per_bank_core_req_ready[j]; if (core_req_valid[i] && (core_req_bid[i] == `UP(`BANK_SELECT_BITS)'(j))) begin
core_req_sel_r[i] = per_bank_core_req_ready[j];
end
end
end
end
end else begin
always @(*) begin
core_req_sel_r = 0;
for (integer j = 0; j < NUM_BANKS; ++j) begin
for (integer i = 0; i < NUM_REQS; ++i) begin
if (core_req_valid[i] && (core_req_bid[i] == `UP(`BANK_SELECT_BITS)'(j))) begin
core_req_sel_r[i] = per_bank_core_req_ready;
end
end end
end end
end end

View File

@@ -69,7 +69,7 @@ module VX_shared_mem #(
wire [NUM_BANKS-1:0][`WORD_WIDTH-1:0] per_bank_core_req_data_unqual; wire [NUM_BANKS-1:0][`WORD_WIDTH-1:0] per_bank_core_req_data_unqual;
wire [NUM_BANKS-1:0][CORE_TAG_WIDTH-1:0] per_bank_core_req_tag_unqual; wire [NUM_BANKS-1:0][CORE_TAG_WIDTH-1:0] per_bank_core_req_tag_unqual;
wire [NUM_BANKS-1:0][`REQS_BITS-1:0] per_bank_core_req_tid_unqual; wire [NUM_BANKS-1:0][`REQS_BITS-1:0] per_bank_core_req_tid_unqual;
wire [NUM_BANKS-1:0] per_bank_core_req_ready_unqual; wire per_bank_core_req_ready_unqual;
VX_cache_core_req_bank_sel #( VX_cache_core_req_bank_sel #(
.CACHE_LINE_SIZE (WORD_SIZE), .CACHE_LINE_SIZE (WORD_SIZE),
@@ -78,7 +78,8 @@ module VX_shared_mem #(
.WORD_SIZE (WORD_SIZE), .WORD_SIZE (WORD_SIZE),
.NUM_REQS (NUM_REQS), .NUM_REQS (NUM_REQS),
.CORE_TAG_WIDTH (CORE_TAG_WIDTH), .CORE_TAG_WIDTH (CORE_TAG_WIDTH),
.BANK_ADDR_OFFSET(BANK_ADDR_OFFSET) .BANK_ADDR_OFFSET(BANK_ADDR_OFFSET),
.SHARED_BANK_READY(1)
) core_req_bank_sel ( ) core_req_bank_sel (
.clk (clk), .clk (clk),
.reset (reset), .reset (reset),
@@ -103,9 +104,6 @@ module VX_shared_mem #(
.per_bank_core_req_ready (per_bank_core_req_ready_unqual) .per_bank_core_req_ready (per_bank_core_req_ready_unqual)
); );
`UNUSED_VAR (per_bank_core_req_tag_unqual)
`UNUSED_VAR (per_bank_core_req_rw_unqual)
wire [NUM_BANKS-1:0] per_bank_core_req_valid; wire [NUM_BANKS-1:0] per_bank_core_req_valid;
wire [NUM_BANKS-1:0] per_bank_core_req_rw; wire [NUM_BANKS-1:0] per_bank_core_req_rw;
wire [NUM_BANKS-1:0][`LINE_SELECT_BITS-1:0] per_bank_core_req_addr; wire [NUM_BANKS-1:0][`LINE_SELECT_BITS-1:0] per_bank_core_req_addr;
@@ -120,7 +118,7 @@ module VX_shared_mem #(
assign creq_push = (| core_req_valid) && !creq_full; assign creq_push = (| core_req_valid) && !creq_full;
assign creq_pop = ~creq_empty && ~crsq_full; assign creq_pop = ~creq_empty && ~crsq_full;
assign per_bank_core_req_ready_unqual = {NUM_BANKS{~creq_full}}; assign per_bank_core_req_ready_unqual = ~creq_full;
wire [NUM_REQS-1:0][`LINE_SELECT_BITS-1:0] per_bank_core_req_addr_qual; wire [NUM_REQS-1:0][`LINE_SELECT_BITS-1:0] per_bank_core_req_addr_qual;
`UNUSED_VAR (per_bank_core_req_addr_unqual) `UNUSED_VAR (per_bank_core_req_addr_unqual)

View File

@@ -1,20 +0,0 @@
`ifndef VX_CACHE_CORE_RSP_IF
`define VX_CACHE_CORE_RSP_IF
`include "../cache/VX_cache_config.vh"
interface VX_cache_core_rsp_if #(
parameter NUM_REQS = 1,
parameter WORD_SIZE = 1,
parameter CORE_TAG_WIDTH = 1,
parameter CORE_TAG_ID_BITS = 0
) ();
wire [NUM_REQS-1:0] valid;
wire [NUM_REQS-1:0][`WORD_WIDTH-1:0] data;
wire [`CORE_REQ_TAG_COUNT-1:0][CORE_TAG_WIDTH-1:0] tag;
wire ready;
endinterface
`endif

View File

@@ -1,9 +1,9 @@
`ifndef VX_CACHE_CORE_REQ_IF `ifndef VX_DCACHE_CORE_REQ_IF
`define VX_CACHE_CORE_REQ_IF `define VX_DCACHE_CORE_REQ_IF
`include "../cache/VX_cache_config.vh" `include "../cache/VX_cache_config.vh"
interface VX_cache_core_req_if #( interface VX_dcache_core_req_if #(
parameter NUM_REQS = 1, parameter NUM_REQS = 1,
parameter WORD_SIZE = 1, parameter WORD_SIZE = 1,
parameter CORE_TAG_WIDTH = 1, parameter CORE_TAG_WIDTH = 1,

View File

@@ -0,0 +1,20 @@
`ifndef VX_DCACHE_CORE_RSP_IF
`define VX_DCACHE_CORE_RSP_IF
`include "../cache/VX_cache_config.vh"
interface VX_dcache_core_rsp_if #(
parameter NUM_REQS = 1,
parameter WORD_SIZE = 1,
parameter CORE_TAG_WIDTH = 1,
parameter CORE_TAG_ID_BITS = 0
) ();
wire [NUM_REQS-1:0] valid;
wire [NUM_REQS-1:0][`WORD_WIDTH-1:0] data;
wire [CORE_TAG_WIDTH-1:0] tag;
wire ready;
endinterface
`endif

View File

@@ -0,0 +1,19 @@
`ifndef VX_ICACHE_CORE_REQ_IF
`define VX_ICACHE_CORE_REQ_IF
`include "../cache/VX_cache_config.vh"
interface VX_icache_core_req_if #(
parameter WORD_SIZE = 1,
parameter CORE_TAG_WIDTH = 1,
parameter CORE_TAG_ID_BITS = 0
) ();
wire valid;
wire [`WORD_ADDR_WIDTH-1:0] addr;
wire [CORE_TAG_WIDTH-1:0] tag;
wire ready;
endinterface
`endif

View File

@@ -0,0 +1,19 @@
`ifndef VX_ICACHE_CORE_RSP_IF
`define VX_ICACHE_CORE_RSP_IF
`include "../cache/VX_cache_config.vh"
interface VX_icache_core_rsp_if #(
parameter WORD_SIZE = 1,
parameter CORE_TAG_WIDTH = 1,
parameter CORE_TAG_ID_BITS = 0
) ();
wire valid;
wire [`WORD_WIDTH-1:0] data;
wire [CORE_TAG_WIDTH-1:0] tag;
wire ready;
endinterface
`endif

View File

@@ -41,10 +41,11 @@ set_global_assignment -name VERILOG_MACRO NDEBUG
set_global_assignment -name MESSAGE_DISABLE 16818 set_global_assignment -name MESSAGE_DISABLE 16818
set_global_assignment -name TIMEQUEST_DO_REPORT_TIMING ON set_global_assignment -name TIMEQUEST_DO_REPORT_TIMING ON
set_global_assignment -name OPTIMIZATION_TECHNIQUE SPEED
set_global_assignment -name ALLOW_ANY_RAM_SIZE_FOR_RECOGNITION ON set_global_assignment -name ALLOW_ANY_RAM_SIZE_FOR_RECOGNITION ON
set_global_assignment -name USE_HIGH_SPEED_ADDER ON set_global_assignment -name USE_HIGH_SPEED_ADDER ON
set_global_assignment -name MUX_RESTRUCTURE ON set_global_assignment -name MUX_RESTRUCTURE ON
#set_global_assignment -name OPTIMIZATION_TECHNIQUE SPEED
#set_global_assignment -name OPTIMIZATION_MODE "AGGRESSIVE PERFORMANCE" #set_global_assignment -name OPTIMIZATION_MODE "AGGRESSIVE PERFORMANCE"
#set_global_assignment -name FITTER_EFFORT "STANDARD FIT" #set_global_assignment -name FITTER_EFFORT "STANDARD FIT"
#set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS" #set_global_assignment -name OPTIMIZE_HOLD_TIMING "ALL PATHS"