我的系统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:
找到问题但没有解决方案
bug/问题的原因是0x%x,在Questasim中,VCS需要这样做,而不是像0x0f1这样的东西,这会导致所有的值默认为0,这样c=0, hex_value=0x00, type=""等就会出现问题。在%x之前,我尝试了0x和x0的不同组合,但似乎都不起作用。hex_value的定义如下typedef bit unsigned [63:0] hex_addr_t;所示
发布于 2014-08-08 14:48:41
发现这个问题,我有十六进制值0x前面的值不幸的是,这做了$sscanf扫描在VCS,然后将默认十六进制到0x0f1,并通过添加0x在VCS $sscanf跳过0x部分。不幸的是,这会导致Questasim将$sscanf给出的所有值默认为0,因为它不知道如何处理说明符。该问题的解决方案是使用for循环检查第一次出现的x,然后使用str.putc(len_to_x, "0")将其替换为0。
https://stackoverflow.com/questions/25180911
复制相似问题