diff --git a/src/main/resources/csrc/SimEmulator.cc b/src/main/resources/csrc/SimEmulator.cc index 365c22f..379eeb2 100644 --- a/src/main/resources/csrc/SimEmulator.cc +++ b/src/main/resources/csrc/SimEmulator.cc @@ -5,30 +5,39 @@ #include extern "C" void emulator_init_rs(int num_lanes); -extern "C" void emulator_tick_rs(uint8_t *vec_d_ready, uint8_t *vec_d_valid, - uint8_t *vec_d_is_store, int *vec_d_size, - long long *vec_d_data); -extern "C" void emulator_generate_rs(uint8_t *vec_a_ready, uint8_t *vec_a_valid, - long long *vec_a_address, - uint8_t *vec_a_is_store, int *vec_a_size, - long long *vec_a_data, - uint8_t *vec_d_ready, uint8_t inflight, - uint8_t *finished); +extern "C" void emulator_tick_rs(uint8_t *vec_a_ready, uint8_t *vec_a_valid, + long long *vec_a_address, + 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, long long *vec_d_data, + uint8_t inflight, uint8_t *finished); +// extern "C" void emulator_generate_rs(uint8_t *vec_a_ready, uint8_t *vec_a_valid, +// long long *vec_a_address, +// uint8_t *vec_a_is_store, int *vec_a_size, +// long long *vec_a_data, +// uint8_t *vec_d_ready, uint8_t inflight, +// uint8_t *finished); extern "C" void emulator_init(int num_lanes) { emulator_init_rs(num_lanes); } -extern "C" void emulator_tick(uint8_t *vec_d_ready, uint8_t *vec_d_valid, +extern "C" void emulator_tick(uint8_t *vec_a_ready, uint8_t *vec_a_valid, + long long *vec_a_address, 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, - long long *vec_d_data) { - emulator_tick_rs(vec_d_ready, vec_d_valid, vec_d_is_store, vec_d_size, - vec_d_data); + long long *vec_d_data, uint8_t inflight, + uint8_t *finished) { + emulator_tick_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, vec_d_data, inflight, finished); } -extern "C" void emulator_generate(uint8_t *vec_a_ready, uint8_t *vec_a_valid, - long long *vec_a_address, - uint8_t *vec_a_is_store, int *vec_a_size, - long long *vec_a_data, uint8_t *vec_d_ready, - uint8_t inflight, uint8_t *finished) { - emulator_generate_rs(vec_a_ready, vec_a_valid, vec_a_address, vec_a_is_store, - vec_a_size, vec_a_data, vec_d_ready, inflight, finished); -} +// extern "C" void emulator_generate(uint8_t *vec_a_ready, uint8_t *vec_a_valid, +// long long *vec_a_address, +// uint8_t *vec_a_is_store, int *vec_a_size, +// long long *vec_a_data, uint8_t *vec_d_ready, +// uint8_t inflight, uint8_t *finished) { +// emulator_generate_rs(vec_a_ready, vec_a_valid, vec_a_address, vec_a_is_store, +// vec_a_size, vec_a_data, vec_d_ready, inflight, finished); +// } diff --git a/src/main/resources/vsrc/SimEmulator.v b/src/main/resources/vsrc/SimEmulator.v index 7abb8f7..97e0131 100644 --- a/src/main/resources/vsrc/SimEmulator.v +++ b/src/main/resources/vsrc/SimEmulator.v @@ -9,15 +9,6 @@ import "DPI-C" function void emulator_init( // (2) C function declaration // (3) DPI function calls inside initial/always blocks import "DPI-C" function void emulator_tick -( - 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], - input longint vec_d_data[`MAX_NUM_LANES] -); - -import "DPI-C" function void emulator_generate ( input bit vec_a_ready[`MAX_NUM_LANES], output bit vec_a_valid[`MAX_NUM_LANES], @@ -25,7 +16,12 @@ import "DPI-C" function void emulator_generate 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], + 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], + input longint vec_d_data[`MAX_NUM_LANES], input bit inflight, output bit finished @@ -95,6 +91,8 @@ module SimEmulator #(parameter NUM_LANES = 4) ( emulator_init(NUM_LANES); end + // negedge might make it easier to view waveform since DPI changes are + // instant and make it look like they happen before the clockedge always @(posedge clock) begin if (reset) begin for (integer tid = 0; tid < NUM_LANES; tid = tid + 1) begin @@ -107,14 +105,19 @@ module SimEmulator #(parameter NUM_LANES = 4) ( end __in_finished = 1'b0; end else begin - emulator_generate( + emulator_tick( __out_a_ready, __in_a_valid, __in_a_address, __in_a_is_store, __in_a_size, __in_a_data, + __in_d_ready, + __out_d_valid, + __out_d_is_store, + __out_d_size, + __out_d_data, __out_inflight, __in_finished @@ -125,19 +128,4 @@ module SimEmulator #(parameter NUM_LANES = 4) ( // end end end - - // negedge is important here; the DPI logic is essentially functioning as - // a combinational logic, so we want to reflect the signal change from DPI - // at the *current* cycle, not the next. - always @(negedge clock) begin - if (!reset) begin - emulator_tick( - __in_d_ready, - __out_d_valid, - __out_d_is_store, - __out_d_size, - __out_d_data - ); - end - end endmodule