【发布时间】:2016-07-20 17:49:08
【问题描述】:
如何将动态位数组(或更准确地说是逻辑)格式化为字符串,例如,对于 UVM 的 convert2string?比如我想转换
logic vdyn[];
...
vdyn = new [16] ('{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1});
到字符串0097。
我认为以下方法会起作用(# 只是为了方便阅读而对字符串进行分隔):
fmt = $sformatf("#%%%0dh#", (vdyn.size-1)/4 + 1); // "#%4h#"
vstr = $sformatf(fmt, { >> {vdyn}});
但它至少在 Questa 10.3d 中返回 # x#(我怀疑这是一个错误 - 如果它适用于其他模拟器,我会很感兴趣)。
我尝试先将其转换为打包数组,但这会遇到其他问题。如果对结果没有大小限制,源值总是在目标变量中左对齐,例如:
logic [63:0] v64;
...
v64 = {>> {vdyn}}; // 64'h0097000000000000
如果不使用可变大小的切片,就无法只打印出我想要的部分。以下工作,但它要求我在编译时知道数组的大小:
v64 = 16'({>> {vdyn}}); // 64'h0000000000000097
我发现的最好的东西是以下“双反”(注意我在这里使用<<,而不是>>):
v64 = {<< {vdyn}}; // 64'he900000000000000
v64 = {<< {v64}}; // 64'h0000000000000097
vstr = $sformatf(fmt, v64); // #0097#
不过,不得不这样做似乎有点做作。顺便说一句,将前两个语句合二为一是行不通的:
v64 = {<< {{<< {vdyn}}}}; // 64'hZ900000000000000
(出于某种原因,v64[63] 是 z)。同样,我怀疑这是 Questa 10.3d 中的一个错误。
【问题讨论】:
标签: arrays system-verilog dynamic-arrays