verilog 的tb调用.csv文件,使用fscanf读取csv文件的所有数据
时间: 2025-05-09 21:15:32 浏览: 35
在Verilog测试平台(Testbench, TB)中,通过使用`$fopen`, `$fgetc`, `$fscanf`等系统任务可以操作外部文件(例如`.csv`)。下面是一个简单的例子说明如何从CSV文件中读取所有数据,并将其加载到TB模块中。
假设有一个名为 `data.csv` 的文件,内容如下:
```
10,20
30,40
50,60
70,80
90,100
```
### Verilog代码示例
```verilog
module tb_csv_read;
integer fd; // 文件描述符
string line;
reg [7:0] value1;
reg [7:0] value2;
initial begin
$display("开始读取 CSV 文件...");
// 打开 CSV 文件
fd = $fopen("data.csv", "r");
if (fd == 0) begin
$display("无法打开文件 data.csv !");
$finish;
end
// 循环读取每一行并解析
while (!$feof(fd)) begin
// 使用 fscanf 按格式读取一行中的两个值
int items_scanned = $fscanf(fd, "%d,%d\n", value1, value2);
if (items_scanned != 2) begin
$display("错误:未成功扫描两列数据!");
end else begin
$display("已读取的数据:%d 和 %d", value1, value2);
end
end
// 关闭文件
$fclose(fd);
$display("完成 CSV 文件的读取...");
$finish;
end
endmodule
```
在这个例子中,我们完成了以下几个步骤:
1. **打开文件**:使用 `$fopen` 来打开指定路径下的 `.csv` 文件。如果失败,则提示错误信息。
2. **逐行列举**:通过循环检测 EOF 标志位判断是否已经到达文件末尾。
3. **数据解析**:每次迭代都调用 `$fscanf` 函数将当前行的内容按照 `%d,%d` 这样的模式提取出两个整数值。
4. **处理结果**:打印每一对读入的结果以便验证其有效性。
5. **关闭资源**:当全部记录都被处理完毕之后记得释放占用的文件句柄。
### 注意事项
- 如果 CSV 数据包含额外字符比如空格、引号或者其他分隔符需要相应调整 format 字符串。
- 要保证输入文件存在并且格式正确;否则可能导致程序崩溃或行为异常。
阅读全文
相关推荐

















