wtr
Full Member level 5
Hello all,
The following code is
Where file read in is
The output in the write out file is as expected, however the transcript window is flawed. I'm getting the following in modelsim transcript window.
The problem is after the comment detected, the if statement seems to run through every instance of the comment & generate the "ERROR, the stimulus file ..." . Now I was hoping the fscanf read the entire line in, however now i'm of the opinion that it's only reading in sections that match the % <- character & therefore it has to do multiple scans for %s string to be traversed until the next line.
Does anyone know of a way I can clean up my transcript window for evidence logging?
- - - Updated - - -
I think I found the answer to my problem.
When in the
section, all I need to do is place
This way I'll read to the end of the line, when at the condition comment detected.
Problem I have now is, what happens with str overflows (I've assigned it to reg of size [256*8:0]).
Is there a more elegant way that will read, regardless of size of scan until end of line?
Regards,
Wes
The following code is
Code Verilog - [expand] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 task TSK_READ_FILE; integer scan_file; reg [7:0] w_or_r; integer len; reg [31:0] addr; reg [31:0] data; integer i; begin while (!$feof(`ORIGIN.TSK_OPENR_FILE.data_file)) begin scan_file = $fscanf(`ORIGIN.TSK_OPENR_FILE.data_file, "%s %d %h %h\n", w_or_r, len, addr, data); if (w_or_r == "w") begin // is designed to always be length 1, // data needs to be muti-dimensinal otherwise for (i=0; i<len; i=i+1) begin `ORIGIN.DATA_STORE[3+4*i] = data[31:24]; `ORIGIN.DATA_STORE[2+4*i] = data[23:16]; `ORIGIN.DATA_STORE[1+4*i] = data[15:8]; `ORIGIN.DATA_STORE[0+4*i] = data[7:0]; end // TSK_TX_MEMORY_WRITE_32 //-- Tag (7:0) tag_; //-- Traffic Class [2:0] tc_; //-- Length (in DW)[10:0] len_; //-- Address[31:0] addr_; //-- Last DW Byte Enable[3:0] last_dw_be_; //-- First DW Byte Enable[3:0] first_dw_be_; //-- Poisoned Data: Payload is invalid if set ep_; `ORIGIN.TSK_TX_MEMORY_WRITE_32( `ORIGIN.DEFAULT_TAG, `ORIGIN.DEFAULT_TC, len, addr, 4'h0, 4'hF, 1'b0); $display("[%t] : Writing to addr %x is %x", $realtime, addr, {`ORIGIN.DATA_STORE[3],`ORIGIN.DATA_STORE[2],`ORIGIN.DATA_STORE[1],`ORIGIN.DATA_STORE[0]}); `ORIGIN.TSK_TX_CLK_EAT(100); `ORIGIN.DEFAULT_TAG = `ORIGIN.DEFAULT_TAG + 1; `ORIGIN.TSK_WRITEW_FILE(addr,data[31:0]); end else if (w_or_r == "r") begin `ORIGIN.P_READ_DATA = 32'hffff_ffff; //fork //TSK_TX_MEMORY_READ_32; //-- Tag [7:0] tag_; //-- Traffic Class [2:0] tc_; //-- Length (in DW) [10:0] len_; //-- Address [31:0] addr_; //-- Last DW Byte Enable [3:0] last_dw_be_; //-- First DW Byte Enable[3:0] first_dw_be_; `ORIGIN.TSK_TX_MEMORY_READ_32( `ORIGIN.DEFAULT_TAG, `ORIGIN.DEFAULT_TC, len, addr, 4'h0, 4'hF); `ORIGIN.TSK_WAIT_FOR_READ_DATA; `ORIGIN.TSK_TX_CLK_EAT(10); `ORIGIN.TSK_WRITER_FILE(addr,`ORIGIN.P_READ_DATA); //join // Only works based on previous $display("[%t] : Readback from addr %x is %x expected: %x", $realtime, addr, `ORIGIN.P_READ_DATA, data); end else if (w_or_r == "#") begin $display("Comment detected"); end else begin $display("ERROR, the stimulus file does not specify if the line is read/write/comment"); end end end endtask
Where file read in is
Code:
# FPGA Compile info
r 1 00000140 00000000
r 1 00000160 00000000
r 1 00000180 00000000
r 1 000001A0 00000000
# Next comment
The output in the write out file is as expected, however the transcript window is flawed. I'm getting the following in modelsim transcript window.
# Comment detected
# ERROR, the stimulus file does not specify if the line is read/write/comment
# ERROR, the stimulus file does not specify if the line is read/write/comment
# ERROR, the stimulus file does not specify if the line is read/write/comment
# [ 346888225000] : TSK_PARSE_FRAME on Transmit
# [ 349016289000] : TSK_PARSE_FRAME on Receive
# [ 350968333000] : Readback from addr 00000140 is 00002018 expected: 00000000
# [ 350984327000] : TSK_PARSE_FRAME on Transmit
# [ 353112321000] : TSK_PARSE_FRAME on Receive
# [ 355064282000] : Readback from addr 00000160 is 00000706 expected: 00000000
# [ 355080275000] : TSK_PARSE_FRAME on Transmit
# [ 357208225000] : TSK_PARSE_FRAME on Receive
# [ 359160225000] : Readback from addr 00000180 is 00001704 expected: 00000000
# [ 359176225000] : TSK_PARSE_FRAME on Transmit
# [ 361304321000] : TSK_PARSE_FRAME on Receive
# [ 363256321000] : Readback from addr 000001a0 is 00004c45 expected: 00000000
# Note: some other file/function putting stuff on transcript line.
# Comment detected
# ERROR, the stimulus file does not specify if the line is read/write/comment
# ERROR, the stimulus file does not specify if the line is read/write/comment
# [ 460408333000] : Readback from addr 01600550 is 00000005 expected: 00000000
The problem is after the comment detected, the if statement seems to run through every instance of the comment & generate the "ERROR, the stimulus file ..." . Now I was hoping the fscanf read the entire line in, however now i'm of the opinion that it's only reading in sections that match the % <- character & therefore it has to do multiple scans for %s string to be traversed until the next line.
Does anyone know of a way I can clean up my transcript window for evidence logging?
- - - Updated - - -
I think I found the answer to my problem.
When in the
Code:
else if (w_or_r == "#")
begin
$display("Comment detected");
end
Code:
else if (w_or_r == "#")
begin
//$display("Comment detected");
scan_file = fgets(str, `ORIGIN.TSK_OPENR_FILE.data_file);
end
This way I'll read to the end of the line, when at the condition comment detected.
Problem I have now is, what happens with str overflows (I've assigned it to reg of size [256*8:0]).
Is there a more elegant way that will read, regardless of size of scan until end of line?
Regards,
Wes