Verilog读取stim.txt中f_string字段失败,求解决方法
解决Verilog中$sscanf读取带空格的引号字符串问题
你遇到的问题核心在于**%s格式符的行为限制**:它会在遇到第一个空白字符(比如空格)时停止读取,所以只能捕获到引号后的第一个空格前的内容,自然读不到完整的" I am here "字符串。
解决方案:使用%[^"]格式匹配带引号的字符串
Verilog的$sscanf支持**扫描集(scan set)**语法,我们可以用%[^"]来匹配所有非双引号的字符,结合转义的双引号\"来定位字符串的边界。修改你的$sscanf格式字符串即可:
initial begin string f_string; int fd; string line; logic [7:0] cmd, addr, data; // 假设是8位变量,可根据实际位宽调整 int n_items; fd = $fopen("stim.txt", "r"); if (fd == 0) begin $display("Failed to open file!"); $finish; end if ($fgets(line, fd)) begin // 用\"匹配输入的双引号,%[^\"]读取引号内所有非引号字符 n_items = $sscanf(line, "%h %h %h \"%[^\"]\"", cmd, addr, data, f_string); $display("%h %h %h \"%s\"", cmd, addr, data, f_string); end $fclose(fd); end
代码说明:
\":转义双引号,用来精准匹配输入文本中的"字符,确保我们只捕获引号内部的内容%[^\"]:扫描集语法,意思是读取所有不是双引号的字符,这样就能完整捕获包含空格的I am here(包括前后的空格)- 额外增加了文件打开失败的判断,让代码更健壮
运行修改后的代码,你就能看到f_string正确显示为原文件中的完整内容了。
内容的提问来源于stack exchange,提问作者rainbow
相关产品推荐
相关产品推荐

