-
Notifications
You must be signed in to change notification settings - Fork 21
Description
Hi,
First of all, thanks for sharing this great project.
I am attempting to use char_backend_file as a UART module backend to log VP results efficiently. However, I encountered an issue where the logging fails after the first transaction.
Observation
It appears that char_backend_file::writefn closes the file handle (w_file) immediately after processing a transaction. This causes subsequent write attempts to fail because the file stream is no longer open.
Relevant Code
| fclose(w_file); |
// Current implementation
void writefn(tlm::tlm_generic_payload& txn, sc_core::sc_time& t)
{
uint8_t* data = txn.get_data_ptr();
for (int i = 0; i < txn.get_streaming_width(); i++) {
size_t ret = fwrite(&data[i], sizeof(uint8_t), 1, w_file);
if (ret != 1) {
SCP_ERR(()) << "Error writing to the file.\n";
}
}
fclose(w_file); // <--- This closes the file after every transaction
}Comparison
In contrast, the char_backend_stdio uses fflush(stdout) to handle the end of a transaction, keeping the stream open for continuous logging.
Proposed Fix
I believe the file should remain open during the simulation and only be closed upon destruction. I have tested the following modification, and it works as expected:
void writefn(tlm::tlm_generic_payload& txn, sc_core::sc_time& t)
{
uint8_t* data = txn.get_data_ptr();
for (int i = 0; i < txn.get_streaming_width(); i++) {
size_t ret = fwrite(&data[i], sizeof(uint8_t), 1, w_file);
if (ret != 1) {
SCP_ERR(()) << "Error writing to the file.\n";
}
}
fflush(w_file); // Use fflush instead of fclose
}
// Add destructor to clean up file handles
~char_backend_file()
{
if (w_file != nullptr) {
fclose(w_file);
w_file = nullptr;
}
if (r_file != nullptr) {
fclose(r_file);
r_file = nullptr;
}
}Question
Is the current behavior (closing the file immediately) intended for a specific use case? If not, and this is indeed a bug, it would be great if this could be fixed in the upstream repo.
Thanks!