【问题标题】:Systemverilog string variable as format specifier for $display/$writeSystemverilog 字符串变量作为 $display/$write 的格式说明符
【发布时间】:2021-08-15 06:04:46
【问题描述】:

我正在尝试创建用于 $display/$write 的可变格式说明符。我已经尝试了很多东西,但这就是我目前所拥有的。

我想要结束的是:$display(format_var,data_1,data_2),其中格式字符串是使用 $sformatf 或其他预先计算的。

代码:

module test;
function void pprint(input int data_1,input int field_1,input int data_2,input int field_2);
string  format;
begin 
    format = $sformatf("%0d'h%%%0dx,%0d'h%%%0dx",field_1,field_1/4,field_2,field_2/4);
    $display("format = %s",format);
    $display(format,data_1,data_2);
end
endfunction

initial 
begin
    pprint(5,8,73737229,128);
    $stop;
end
endmodule

我期望的输出是:

format = 8'h%2x,128'h%32x
8'h05,128'h000000000000000000000000465240D

我得到的输出是:

format = 8'h%2x,128'h%32x
8'h%2x,128'h%32x          5   73737229

我需要做什么?模拟器是 Vivado 2020.3

稍后:

尝试更多的东西,下面的功能做我想要的。我的结论是 $display/$write 不能将变量作为格式字符串,但是 $sformatf 可以。

function void pprint(input int data_1,input int field_1,input int data_2,input int field_2);
string  format;
string  outstr;
begin 
    format = $sformatf("%0d'h%%%0dx,%0d'h%%%0dx",field_1,field_1/4,field_2,field_2/4);
    $display("format = %s",format);
    $display("%s",$sformatf(format,data_1,data_2));
end
endfunction

【问题讨论】:

标签: printing format system-verilog display write


【解决方案1】:

试试:

function void pprint(
    input logic [4095:0] data_1,
    input int field_1,
    input logic [4095:0] data_2,
    input int field_2 );
  string  format; 
  format = $sformatf("%0d'h%%%0dh,%0d'h%%%0dh",
    field_1, (field_1+3)/4,
    field_2, (field_2+3)/4 );
  $display("format = %s",format);
  $display($sformatf(format,data_1,data_2));
endfunction

这应该会给你输出:

format = 8'h%02h,128'h%032h
8'h05,128'h000000000000000000000000465240D

% 和数字之间添加一个零可以告诉模拟器用零填充高位。
出于某种原因,$display(format,data_1,data_2) 没有在 edaplayground 上的模拟器上使用该格式,但它确实适用于$sformatf,所以我只是将它嵌套了。
我需要增加输入数据的位宽,否则它会显示超过 8 位的前导零。必要时进行调整。
字段加 3 是为了处理非 4 的倍数。除法后总是向下取整。

【讨论】:

  • 就我而言,我确实想要零填充。到最近的字节。对于我的用例,我没有考虑过非四的倍数,但我喜欢处理它的能力。谢谢!那个 $display 不起作用我觉得很有趣,我想知道它是否是规范的一部分,它不处理字符串变量,或者它从裂缝中溜走了。
【解决方案2】:

根据SystemVerilog LRM21.3.3 将数据格式化为字符串 部分,只有$sformat$sformatf 具有特定的格式化参数,可以是字符串文字或字符串变量。 $display 等所有其他输出任务将 any 字符串文字参数视为格式说明符,并且不解释字符串变量中的字符串以进行格式化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多