我正在读取一个文本文件,其中包含字符串测试用例,并将它们解码为Verilog测试构造以进行模拟。用于读取文件的代码如下:
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);
我试过用
integer k;
k = strlen($fscanf(pntr, "%s %s %s %s \n", a,b,c,d));
$display(k);
显示语句输出一个"x“,我也尝试使用
$display(file)
但这也给了我x作为显示输出。上面的代码只是我的问题的一个表示,我使用一个较大的格式化字符串来读取更大的数据。我的测试箱的每一行可能有不同的大小。我已经将格式初始化为我的测试用例可以拥有的字符串文本的最大数量。我想问的是,是否有一种方法可以获得我读取的每一行的长度,还是读取的字符串的数量?注意:我正在使用Cadence工具来完成这项任务。输入文件看起来像
read reg_loc1
write regloc2 2.5V regloc3 20mA
read regloc3 regloc5 regloc7
发布于 2022-07-07 22:33:48
当您有大量的输入和不完整的代码时,很难调试您的代码。而且您还有一个竞争条件,如果pntr
块在initial
块之前执行,那么always
可能没有从initial
中分配。
但是在任何情况下,使用$fscanf
和%s
格式的问题是换行符被视为空白。最好使用$fgets
一次读取一行,并使用$sscanf
解析行:
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
https://stackoverflow.com/questions/72904439
复制相似问题