You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

关键优化点

  1. 用$fgets替代$fscanf("%s"):确保读取完整的一行,包括带空格的内容,避免截断。
  2. 错误处理增强:添加文件打开失败、空文件、格式错误的判断,让代码更健壮。
  3. 跳过错误行:遇到格式错误的行时,用continue跳过,不中断整个文件处理流程。

内容的提问来源于stack exchange,提问作者Pratheek Motamarri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:05:09