首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在SystemVerilog中使用fscanf读取格式化字符串的长度?

如何在SystemVerilog中使用fscanf读取格式化字符串的长度?
EN

Stack Overflow用户
提问于 2022-07-07 21:29:38
回答 1查看 100关注 0票数 0

我正在读取一个文本文件,其中包含字符串测试用例,并将它们解码为Verilog测试构造以进行模拟。用于读取文件的代码如下:

代码语言:javascript
运行
复制
integer pntr,file;
string a,b,c,d;
initial 
  begin
    pntr = $fopen(FOO, "r");
  end
always
  begin

    if(!$feof(pntr))
      begin
        file = $fscanf(pntr, "%s %s %s %s \n", a,b,c,d);
      end
    else
       $fclose(pntr);

我试过用

代码语言:javascript
运行
复制
integer k;
k = strlen($fscanf(pntr, "%s %s %s %s \n", a,b,c,d));
$display(k);

显示语句输出一个"x“,我也尝试使用

代码语言:javascript
运行
复制
$display(file)

但这也给了我x作为显示输出。上面的代码只是我的问题的一个表示,我使用一个较大的格式化字符串来读取更大的数据。我的测试箱的每一行可能有不同的大小。我已经将格式初始化为我的测试用例可以拥有的字符串文本的最大数量。我想问的是,是否有一种方法可以获得我读取的每一行的长度,还是读取的字符串的数量?注意:我正在使用Cadence工具来完成这项任务。输入文件看起来像

代码语言:javascript
运行
复制
read reg_loc1
write regloc2 2.5V regloc3 20mA
read regloc3 regloc5 regloc7
EN

回答 1

Stack Overflow用户

发布于 2022-07-07 22:33:48

当您有大量的输入和不完整的代码时,很难调试您的代码。而且您还有一个竞争条件,如果pntr块在initial块之前执行,那么always可能没有从initial中分配。

但是在任何情况下,使用$fscanf%s格式的问题是换行符被视为空白。最好使用$fgets一次读取一行,并使用$sscanf解析行:

代码语言:javascript
运行
复制
module top;
  
  integer pntr,file;
  string a,b,c,d, line;
  initial  begin
    pntr = $fopen("FOO", "r");
    while(!$feof(pntr))
      if ((file = $fgets(line,pntr)!=0)) begin
        $write("%d line: ", file, line);
        file = $sscanf(line, "%s %s %s %s \n", a,b,c,d);
        $display(file,,a,b,,c,,d);
      end
      $fclose(pntr);
  end
endmodule
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72904439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档