我的系统verilog代码存在一个主要的兼容性问题。
我有这条线:
c = $sscanf(line, "0x%x %s %s %d", hex_value, type, name, size);
使用vcs编译器产生结果:
c = 4, hex_value = 0x001, type = "empty", name = "mem_block", size = 8
使用Questasim vlog -sv
和vsim -c
会产生结果:
c = 0, hex_value = 0x000, type = "", name = "", size = 0
有没有人知道这个或另一个字符串扫描功能的解决方案?
编辑:
我找到了没有打印出正确输出的原因。 我用过:
display($sformatf("c=%d, hex_value = %x, type=%s, size=%s", c, hex_value, type, name, size));
将其更改为$display($sformatf(line, "c=%d, hex_value = %x, type=%s, size=%s", c, hex_value, type, name, size));
,它在Questasim中的功能就像一个魅力,但在VCS中却没有。我仍然遇到c
从0
返回$sscanf
的问题,也没有将值设置为hex_value
等。
编辑2:
发现问题但不是解决方案
错误/问题的原因是0x%x
,其中VCS需要这样做而不是像0x0f1
这样的东西,而在Questasim这导致所有的值默认为0,因此{{1}有谁知道解决这个问题的好方法?我在c=0, hex_value=0x00, type=""
之前尝试了0x
和x0
的不同组合,但似乎没有任何效果。
%x
的定义与此hex_value
答案 0 :(得分:1)
发现问题,我在值前面有一个带有0x的十六进制值,不幸的是,它在VCS中由$sscanf
扫描,然后默认为十六进制到0x0f1
并添加0x
在VCS中$sscanf
跳过0x
部分。不幸的是,这会导致Questasim将$sscanf
给出的所有值都默认为0
,因为它不知道如何处理说明符。对此的解决方案是使用for循环检查x
的第一次出现,然后使用0
将其替换为str.putc(len_to_x, "0")
。