Pass both A and D bundles to memfuzzer DPI
This commit is contained in:
@@ -7,15 +7,23 @@
|
|||||||
|
|
||||||
extern "C" void memfuzz_generate_rs(uint8_t *vec_a_ready, uint8_t *vec_a_valid,
|
extern "C" void memfuzz_generate_rs(uint8_t *vec_a_ready, uint8_t *vec_a_valid,
|
||||||
long long *vec_a_address,
|
long long *vec_a_address,
|
||||||
uint8_t *vec_d_ready, uint8_t *finished);
|
uint8_t *vec_a_is_store, int *vec_a_size,
|
||||||
|
long long *vec_a_data, uint8_t *vec_d_ready,
|
||||||
|
uint8_t *vec_d_valid,
|
||||||
|
uint8_t *vec_d_is_store, int *vec_d_size,
|
||||||
|
uint8_t *finished);
|
||||||
|
|
||||||
extern "C" void memfuzz_init(int num_lanes) {
|
extern "C" void memfuzz_init(int num_lanes) {
|
||||||
printf("from C: num_lanes=%d\n", num_lanes);
|
printf("from C: num_lanes=%d\n", num_lanes);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void memfuzz_generate(uint8_t *vec_a_ready, uint8_t *vec_a_valid,
|
extern "C" void memfuzz_generate(uint8_t *vec_a_ready, uint8_t *vec_a_valid,
|
||||||
long long *vec_a_address, uint8_t *vec_d_ready,
|
long long *vec_a_address,
|
||||||
uint8_t *finished) {
|
uint8_t *vec_a_is_store, int *vec_a_size,
|
||||||
memfuzz_generate_rs(vec_a_ready, vec_a_valid, vec_a_address, vec_d_ready,
|
long long *vec_a_data, uint8_t *vec_d_ready,
|
||||||
finished);
|
uint8_t *vec_d_valid, uint8_t *vec_d_is_store,
|
||||||
|
int *vec_d_size, uint8_t *finished) {
|
||||||
|
memfuzz_generate_rs(vec_a_ready, vec_a_valid, vec_a_address, vec_a_is_store,
|
||||||
|
vec_a_size, vec_a_data, vec_d_ready, vec_d_valid,
|
||||||
|
vec_d_is_store, vec_d_size, finished);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,15 @@ import "DPI-C" function void memfuzz_generate
|
|||||||
input bit vec_a_ready[`MAX_NUM_LANES],
|
input bit vec_a_ready[`MAX_NUM_LANES],
|
||||||
output bit vec_a_valid[`MAX_NUM_LANES],
|
output bit vec_a_valid[`MAX_NUM_LANES],
|
||||||
output longint vec_a_address[`MAX_NUM_LANES],
|
output longint vec_a_address[`MAX_NUM_LANES],
|
||||||
|
output bit vec_a_is_store[`MAX_NUM_LANES],
|
||||||
|
output int vec_a_size[`MAX_NUM_LANES],
|
||||||
|
output longint vec_a_data[`MAX_NUM_LANES],
|
||||||
|
|
||||||
output bit vec_d_ready[`MAX_NUM_LANES],
|
output bit vec_d_ready[`MAX_NUM_LANES],
|
||||||
|
input bit vec_d_valid[`MAX_NUM_LANES],
|
||||||
|
input bit vec_d_is_store[`MAX_NUM_LANES],
|
||||||
|
input int vec_d_size[`MAX_NUM_LANES],
|
||||||
|
|
||||||
output bit finished
|
output bit finished
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -27,30 +35,47 @@ module SimMemFuzzer #(parameter NUM_LANES = 4) (
|
|||||||
output [NUM_LANES-1:0] a_is_store,
|
output [NUM_LANES-1:0] a_is_store,
|
||||||
output [`SIMMEM_LOGSIZE_WIDTH*NUM_LANES-1:0] a_size,
|
output [`SIMMEM_LOGSIZE_WIDTH*NUM_LANES-1:0] a_size,
|
||||||
output [`SIMMEM_DATA_WIDTH*NUM_LANES-1:0] a_data,
|
output [`SIMMEM_DATA_WIDTH*NUM_LANES-1:0] a_data,
|
||||||
|
|
||||||
output [NUM_LANES-1:0] d_ready,
|
output [NUM_LANES-1:0] d_ready,
|
||||||
|
input [NUM_LANES-1:0] d_valid,
|
||||||
|
input [NUM_LANES-1:0] d_is_store,
|
||||||
|
input [`SIMMEM_LOGSIZE_WIDTH*NUM_LANES-1:0] d_size,
|
||||||
|
// TODO: d_mask
|
||||||
|
// TODO: d_data
|
||||||
|
|
||||||
output finished
|
output finished
|
||||||
);
|
);
|
||||||
|
// "in": verilog->C, "out": C->verilog
|
||||||
// need to be in ascending order to match with C indexing
|
// need to be in ascending order to match with C indexing
|
||||||
// C array sizes are static, so need to use MAX_NUM_LANES
|
// C array sizes are static, so need to use MAX_NUM_LANES
|
||||||
bit __out_a_ready [0:`MAX_NUM_LANES-1];
|
bit __out_a_ready [0:`MAX_NUM_LANES-1];
|
||||||
bit __in_a_valid [0:`MAX_NUM_LANES-1];
|
bit __in_a_valid [0:`MAX_NUM_LANES-1];
|
||||||
longint __in_a_address [0:`MAX_NUM_LANES-1];
|
longint __in_a_address [0:`MAX_NUM_LANES-1];
|
||||||
bit __in_a_is_store [0:`MAX_NUM_LANES-1];
|
bit __in_a_is_store [0:`MAX_NUM_LANES-1];
|
||||||
reg [`SIMMEM_LOGSIZE_WIDTH-1:0] __in_a_size [0:`MAX_NUM_LANES-1];
|
int __in_a_size [0:`MAX_NUM_LANES-1];
|
||||||
longint __in_a_data [0:`MAX_NUM_LANES-1];
|
longint __in_a_data [0:`MAX_NUM_LANES-1];
|
||||||
bit __in_d_ready [0:`MAX_NUM_LANES-1];
|
bit __in_d_ready [0:`MAX_NUM_LANES-1];
|
||||||
bit __in_finished;
|
bit __out_d_valid [0:`MAX_NUM_LANES-1];
|
||||||
|
bit __out_d_is_store [0:`MAX_NUM_LANES-1];
|
||||||
|
int __out_d_size [0:`MAX_NUM_LANES-1];
|
||||||
|
bit __in_finished;
|
||||||
|
|
||||||
genvar g;
|
genvar g;
|
||||||
generate
|
generate
|
||||||
for (g = 0; g < NUM_LANES; g = g + 1) begin
|
for (g = 0; g < NUM_LANES; g = g + 1) begin
|
||||||
assign __out_a_ready[g] = a_ready[g];
|
assign __out_a_ready[g] = a_ready[g];
|
||||||
assign a_valid[g] = __in_a_valid[g];
|
assign a_valid[g] = __in_a_valid[g];
|
||||||
assign a_address[`SIMMEM_DATA_WIDTH*g +: `SIMMEM_DATA_WIDTH] = __in_a_address[g];
|
assign a_address[`SIMMEM_DATA_WIDTH*g +: `SIMMEM_DATA_WIDTH]
|
||||||
|
= __in_a_address[g][`SIMMEM_DATA_WIDTH-1:0];
|
||||||
assign a_is_store[g] = __in_a_is_store[g];
|
assign a_is_store[g] = __in_a_is_store[g];
|
||||||
assign a_size[`SIMMEM_LOGSIZE_WIDTH*g +: `SIMMEM_LOGSIZE_WIDTH] = __in_a_size[g];
|
assign a_size[`SIMMEM_LOGSIZE_WIDTH*g +: `SIMMEM_LOGSIZE_WIDTH]
|
||||||
assign a_data[`SIMMEM_DATA_WIDTH*g +: `SIMMEM_DATA_WIDTH] = __in_a_data[g];
|
= __in_a_size[g][`SIMMEM_LOGSIZE_WIDTH-1:0];
|
||||||
|
assign a_data[`SIMMEM_DATA_WIDTH*g +: `SIMMEM_DATA_WIDTH]
|
||||||
|
= __in_a_data[g][`SIMMEM_DATA_WIDTH-1:0];
|
||||||
|
assign d_ready[g] = __in_d_ready[g];
|
||||||
|
assign __out_d_valid[g] = d_valid[g];
|
||||||
|
assign __out_d_is_store[g] = d_is_store[g];
|
||||||
|
assign __out_d_size[g] = d_size[`SIMMEM_LOGSIZE_WIDTH*g +: `SIMMEM_LOGSIZE_WIDTH];
|
||||||
end
|
end
|
||||||
endgenerate
|
endgenerate
|
||||||
assign finished = __in_finished;
|
assign finished = __in_finished;
|
||||||
@@ -67,9 +92,8 @@ module SimMemFuzzer #(parameter NUM_LANES = 4) (
|
|||||||
for (integer tid = 0; tid < NUM_LANES; tid = tid + 1) begin
|
for (integer tid = 0; tid < NUM_LANES; tid = tid + 1) begin
|
||||||
__in_a_valid[tid] = 1'b0;
|
__in_a_valid[tid] = 1'b0;
|
||||||
__in_a_address[tid] = `SIMMEM_DATA_WIDTH'b0;
|
__in_a_address[tid] = `SIMMEM_DATA_WIDTH'b0;
|
||||||
|
|
||||||
__in_a_is_store[tid] = 1'b0;
|
__in_a_is_store[tid] = 1'b0;
|
||||||
__in_a_size[tid] = `SIMMEM_LOGSIZE_WIDTH'b0;
|
__in_a_size[tid] = 32'b0;
|
||||||
__in_a_data[tid] = `SIMMEM_DATA_WIDTH'b0;
|
__in_a_data[tid] = `SIMMEM_DATA_WIDTH'b0;
|
||||||
__in_d_ready[tid] = 1'b0;
|
__in_d_ready[tid] = 1'b0;
|
||||||
end
|
end
|
||||||
@@ -79,15 +103,23 @@ module SimMemFuzzer #(parameter NUM_LANES = 4) (
|
|||||||
__out_a_ready,
|
__out_a_ready,
|
||||||
__in_a_valid,
|
__in_a_valid,
|
||||||
__in_a_address,
|
__in_a_address,
|
||||||
|
__in_a_is_store,
|
||||||
|
__in_a_size,
|
||||||
|
__in_a_data,
|
||||||
|
|
||||||
__in_d_ready,
|
__in_d_ready,
|
||||||
|
__out_d_valid,
|
||||||
|
__out_d_is_store,
|
||||||
|
__out_d_size,
|
||||||
|
|
||||||
__in_finished
|
__in_finished
|
||||||
);
|
);
|
||||||
for (integer tid = 0; tid < NUM_LANES; tid = tid + 1) begin
|
for (integer tid = 0; tid < NUM_LANES; tid = tid + 1) begin
|
||||||
$display("verilog: %04d valid[%d]=%d, address[%d]=%d",
|
$display("verilog: %04d valid[%d]=%d, address[%d]=%d, __in_d_ready[%d]=%d",
|
||||||
$time, tid, __in_a_valid[tid], tid, __in_a_address[tid]);
|
$time, tid, __in_a_valid[tid], tid, __in_a_address[tid], tid, __in_d_ready[tid]);
|
||||||
end
|
end
|
||||||
|
|
||||||
if ($time >= 32'd200000) begin
|
if ($time >= 64'd200000) begin
|
||||||
$finish;
|
$finish;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -178,12 +178,12 @@ class VortexTile private (
|
|||||||
case Some(simtParam) => log2Ceil(simtParam.nSrcIds)
|
case Some(simtParam) => log2Ceil(simtParam.nSrcIds)
|
||||||
case None => 4
|
case None => 4
|
||||||
}
|
}
|
||||||
require(
|
// require(
|
||||||
dmemSourceWidth >= 4,
|
// dmemSourceWidth >= 4,
|
||||||
"Setting a small number of sourceIds may cause correctness bug inside " +
|
// "Setting a small number of sourceIds may cause correctness bug inside " +
|
||||||
"Vortex core due to synchronization issues in vx_wspawn. " +
|
// "Vortex core due to synchronization issues in vx_wspawn. " +
|
||||||
"We recommend setting nSrcIds to at least 16."
|
// "We recommend setting nSrcIds to at least 16."
|
||||||
)
|
// )
|
||||||
|
|
||||||
val smemSourceWidth = 4 // FIXME: hardcoded
|
val smemSourceWidth = 4 // FIXME: hardcoded
|
||||||
|
|
||||||
@@ -295,9 +295,9 @@ class VortexTile private (
|
|||||||
|
|
||||||
// Conditionally instantiate memory coalescer
|
// Conditionally instantiate memory coalescer
|
||||||
val coalescerNode = p(CoalescerKey) match {
|
val coalescerNode = p(CoalescerKey) match {
|
||||||
case Some(coalescerParam) => {
|
case Some(coalParam) => {
|
||||||
val coal = LazyModule(
|
val coal = LazyModule(
|
||||||
new CoalescingUnit(coalescerParam)
|
new CoalescingUnit(coalParam)
|
||||||
)
|
)
|
||||||
coal.cpuNode :=* dmemAggregateNode
|
coal.cpuNode :=* dmemAggregateNode
|
||||||
coal.aggregateNode // N+1 lanes
|
coal.aggregateNode // N+1 lanes
|
||||||
|
|||||||
Reference in New Issue
Block a user