rtl multicore fix
This commit is contained in:
@@ -6,7 +6,8 @@ VF += --language 1800-2009 --assert -Wall -Wpedantic
|
|||||||
|
|
||||||
VF += -exe $(SRCS) $(INCLUDE)
|
VF += -exe $(SRCS) $(INCLUDE)
|
||||||
|
|
||||||
MULTICORE += -DNUM_CLUSTERS=1 -DNUM_CORES=2 -DL2_ENABLE=0
|
MULTICORE += -DNUM_CLUSTERS=1 -DNUM_CORES=2
|
||||||
|
#MULTICORE += -DNUM_CLUSTERS=1 -DNUM_CORES=2 -DL2_ENABLE=0
|
||||||
|
|
||||||
INCLUDE = -I./rtl/ -I./rtl/libs -I./rtl/interfaces -I./rtl/pipe_regs -I./rtl/cache -I./rtl/simulate
|
INCLUDE = -I./rtl/ -I./rtl/libs -I./rtl/interfaces -I./rtl/pipe_regs -I./rtl/cache -I./rtl/simulate
|
||||||
|
|
||||||
|
|||||||
9
hw/rtl/cache/VX_bank.v
vendored
9
hw/rtl/cache/VX_bank.v
vendored
@@ -509,15 +509,15 @@ module VX_bank #(
|
|||||||
// TODO: should investigae the need for "SNOOP_FORWARDING" here
|
// TODO: should investigae the need for "SNOOP_FORWARDING" here
|
||||||
wire cwbq_push = (valid_st2 && !miss_st2)
|
wire cwbq_push = (valid_st2 && !miss_st2)
|
||||||
&& !cwbq_full
|
&& !cwbq_full
|
||||||
&& !(SNOOP_FORWARDING && (miss_add_mem_write == `BYTE_EN_NO))
|
&& (miss_add_mem_write == `BYTE_EN_NO)
|
||||||
&& !((is_snp_st2 && valid_st2 && ffsq_full)
|
&& !((is_snp_st2 && valid_st2 && ffsq_full)
|
||||||
|| (((valid_st2 && miss_st2 && dirty_st2) || fill_saw_dirty_st2) && dwbq_full)
|
|| (((valid_st2 && miss_st2 && dirty_st2) || fill_saw_dirty_st2) && dwbq_full)
|
||||||
|| (valid_st2 && miss_st2 && mrvq_full)
|
|| (valid_st2 && miss_st2 && mrvq_full)
|
||||||
|| (valid_st2 && miss_st2 && !invalidate_fill && dram_fill_req_full));
|
|| (valid_st2 && miss_st2 && !invalidate_fill && dram_fill_req_full));
|
||||||
|
|
||||||
wire [`WORD_WIDTH-1:0] cwbq_data = readword_st2;
|
wire [`WORD_WIDTH-1:0] cwbq_data = readword_st2;
|
||||||
wire [`REQS_BITS-1:0] cwbq_tid = miss_add_tid;
|
wire [`REQS_BITS-1:0] cwbq_tid = miss_add_tid;
|
||||||
wire [CORE_TAG_WIDTH-1:0] cwbq_tag = miss_add_tag;
|
wire [CORE_TAG_WIDTH-1:0] cwbq_tag = miss_add_tag;
|
||||||
|
|
||||||
wire cwbq_empty;
|
wire cwbq_empty;
|
||||||
assign core_rsp_valid = !cwbq_empty;
|
assign core_rsp_valid = !cwbq_empty;
|
||||||
@@ -589,7 +589,6 @@ module VX_bank #(
|
|||||||
.possible_fill (possible_fill),
|
.possible_fill (possible_fill),
|
||||||
.success_fill (is_fill_st2),
|
.success_fill (is_fill_st2),
|
||||||
.fill_addr (fill_invalidator_addr),
|
.fill_addr (fill_invalidator_addr),
|
||||||
|
|
||||||
.invalidate_fill (invalidate_fill)
|
.invalidate_fill (invalidate_fill)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
5
hw/rtl/cache/VX_tag_data_access.v
vendored
5
hw/rtl/cache/VX_tag_data_access.v
vendored
@@ -263,12 +263,11 @@ module VX_tag_data_access #(
|
|||||||
|
|
||||||
wire[`TAG_SELECT_BITS-1:0] writeaddr_tag = writeaddr_st1e[`TAG_LINE_ADDR_RNG];
|
wire[`TAG_SELECT_BITS-1:0] writeaddr_tag = writeaddr_st1e[`TAG_LINE_ADDR_RNG];
|
||||||
|
|
||||||
wire tags_mismatch = writeaddr_tag != use_read_tag_st1e;
|
wire tags_match = writeaddr_tag == use_read_tag_st1e;
|
||||||
wire tags_match = writeaddr_tag == use_read_tag_st1e;
|
|
||||||
|
|
||||||
wire snoop_hit = valid_req_st1e && is_snp_st1e && use_read_valid_st1e && tags_match && use_read_dirty_st1e;
|
wire snoop_hit = valid_req_st1e && is_snp_st1e && use_read_valid_st1e && tags_match && use_read_dirty_st1e;
|
||||||
wire req_invalid = valid_req_st1e && !is_snp_st1e && !use_read_valid_st1e && !writefill_st1e;
|
wire req_invalid = valid_req_st1e && !is_snp_st1e && !use_read_valid_st1e && !writefill_st1e;
|
||||||
wire req_miss = valid_req_st1e && !is_snp_st1e && use_read_valid_st1e && !writefill_st1e && tags_mismatch;
|
wire req_miss = valid_req_st1e && !is_snp_st1e && use_read_valid_st1e && !writefill_st1e && !tags_match;
|
||||||
|
|
||||||
assign miss_st1e = snoop_hit || req_invalid || req_miss;
|
assign miss_st1e = snoop_hit || req_invalid || req_miss;
|
||||||
assign dirty_st1e = valid_req_st1e && use_read_valid_st1e && use_read_dirty_st1e;
|
assign dirty_st1e = valid_req_st1e && use_read_valid_st1e && use_read_dirty_st1e;
|
||||||
|
|||||||
@@ -158,17 +158,15 @@ void Simulator::flush_caches(uint32_t mem_addr, uint32_t size) {
|
|||||||
|
|
||||||
// submit snoop requests for the needed blocks
|
// submit snoop requests for the needed blocks
|
||||||
vortex_->snp_req_addr = aligned_addr_start;
|
vortex_->snp_req_addr = aligned_addr_start;
|
||||||
vortex_->snp_req_valid = false;
|
vortex_->snp_req_valid = true;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
this->step();
|
this->step();
|
||||||
if (vortex_->snp_req_valid) {
|
if (vortex_->snp_req_valid && vortex_->snp_req_ready) {
|
||||||
vortex_->snp_req_valid = false;
|
|
||||||
if (vortex_->snp_req_addr >= aligned_addr_end)
|
|
||||||
break;
|
|
||||||
vortex_->snp_req_addr += 1;
|
vortex_->snp_req_addr += 1;
|
||||||
}
|
if (vortex_->snp_req_addr >= aligned_addr_end) {
|
||||||
if (vortex_->snp_req_ready) {
|
vortex_->snp_req_valid = false;
|
||||||
vortex_->snp_req_valid = true;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this->wait(PIPELINE_FLUSH_LATENCY);
|
this->wait(PIPELINE_FLUSH_LATENCY);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
#define DRAM_LATENCY 100
|
#define DRAM_LATENCY 100
|
||||||
#define DRAM_RQ_SIZE 16
|
#define DRAM_RQ_SIZE 16
|
||||||
#define DRAM_STALLS_MODULO 16
|
#define DRAM_STALLS_MODULO 16
|
||||||
#define PIPELINE_FLUSH_LATENCY 300
|
#define PIPELINE_FLUSH_LATENCY 1000
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int cycles_left;
|
int cycles_left;
|
||||||
|
|||||||
Reference in New Issue
Block a user