SystemVerilog读取CSV文件时如何跳过首行?
SystemVerilog读取CSV跳过首行的解决方法
问题根源
你之前尝试用$fscanf跳过首行无效,核心原因是%s格式符会在遇到空白字符(空格、换行、制表符)时停止读取。你的表头行Register Name,Expected Value包含空格,所以$fscanf("%s\n", line)只会读取到Register,剩余的 Name,Expected Value仍留在文件缓冲区,导致后续循环处理逻辑混乱。
正确解决方案
改用$fgets读取整行内容(它能处理带空格的行),先单独读取并丢弃首行,再进入循环处理数据行。以下是修正后的完整代码:
// 假设已定义相关变量:int file; string line; int i; // string register_name, exp_value; logic [31:0] value; // typedef struct {string name; logic [31:0] value;} RegStruct; // RegStruct Temp_Arr; // RegStruct RegData[string]; file = $fopen("your_csv_file.csv", "r"); if (file == 0) begin $display("Error: Failed to open file"); return; end // 跳过首行(表头) if (!$fgets(line, file)) begin $display("Error: File is empty"); $fclose(file); return; end // 处理数据行 while ($fgets(line, file)) begin // 可选:去除行尾的换行符(如果需要) line = line.substr(0, line.len() - 1); i = 0; while (i < line.len() && line[i] != ",") begin i++; end if (i == line.len()) begin $display("Error: Invalid line format - %s", line); continue; // 跳过错误行,继续处理下一行 end register_name = line.substr(0, i-1); exp_value = line.substr(i+1, line.len()-1); if (exp_value.len() == 0) begin $display("Error: Missing value in line - %s", line); continue; end if ($sscanf(exp_value, "%h", value) != 1) begin $display("Error: Failed to parse value - %s", exp_value); continue; end Temp_Arr.name = register_name; Temp_Arr.value = value; RegData[register_name] = Temp_Arr; end $fclose(file);
关键优化点
- 用
$fgets替代$fscanf("%s"):确保读取完整的一行,包括带空格的内容,避免截断。 - 错误处理增强:添加文件打开失败、空文件、格式错误的判断,让代码更健壮。
- 跳过错误行:遇到格式错误的行时,用
continue跳过,不中断整个文件处理流程。
内容的提问来源于stack exchange,提问作者Pratheek Motamarri
相关产品推荐
相关产品推荐

