pli 调用的左对齐文本

left-justified text for pli call

我正在尝试使我的测试平台更具可扩展性,并使用一组需要实例路径名的 PLI 函数。我试图避免必须硬核那些路径。我可以用$sformat/$sformatf系统tasks/functions构建路径。我尝试将路径定义为 SystemVerilog string 类型,但 PLI 拒绝它并且我无法更改 PLI。 PLI 确实接受一个 reg 数组。

挑战在于 PLI 要求文本左对齐,但 $sformat$sformatf%s 都是右对齐的。

 左对齐:"tb.vdut[10].inst9.sample_func       " // 期望
右对齐 : " tb.vdut[10].inst9.sample_func" // 实际

示例函数:

function void call(
    integer dut_id, inst_id,
    reg [CHAR_NUM-1:0] func_name,
    integer arg0, arg1, argN );

  reg [CHAR_NUM-1:0] path;
  $sformat(path,"tb.vdut[%0d].inst%0d.%0s", dut_id, inst_id, func_name );

  // Make path left-justified
  /* missing convert code here */

  $display("path:'%s', arg0:%0d, arg1:%0d, argN:%0d", path, arg0, arg1, argN );
  //$my_pli( path, arg0, arg1, argN );
endfunction : call

我有自己的答案,但我正在寻找更简洁的解决方案。如果 CHANR_NUM 很大并且函数 call 经常执行,则 while 循环会占用很多 CPU 时间。

我能够使用 while 循环将右对齐转换为左对齐。

while(path[CHAR_NUM-1 -: 8] == " ") path <<= 8;

限制:当 CHANR_NUM 很大且函数 call 经常执行时,额外的 CPU 开销。

当前解决方案:

function void call(
    integer dut_id, inst_id,
    reg [CHAR_NUM-1:0] func_name,
    integer arg0, arg1, argN );

  reg [CHAR_NUM-1:0] path;
  $sformat(path,"tb.vdut[%0d].inst%0d.%0s", dut_id, inst_id, func_name );

  // Make path left-justified
  while(path[CHAR_NUM-1 -: 8] == " ") path <<= 8; 

  $display("path:'%s', arg0:%0d, arg1:%0d, argN:%0d", path, arg0, arg1, argN );
  //$my_pli( path, arg0, arg1, argN );
endfunction : call

寻找其他解决方案。首先为格式字符串创建一个参数。使用参数格式评估仅在 compile/elaboration 时发生,在模拟期间它将是静态的。

parameter FORMAT_LJUSTIFY = $sformatf("%%-%0ds",CHAR_NUM/8);

因此,如果 CHAR_NUM 为 640,则 FORMAT_LJUSTIFY 将为 "%-80s",这意味着最后 80 个字符将左对齐。

然后使用$sformat(path, FORMAT_LJUSTIFY, path);。建议对 reg 数组使用 $sformat 而不是 $sformatf。一些模拟器 $sformatf 是正确的,其他人不会编译,除非我进行类型转换。类型转换有效,但它是额外的。

约束:如果 path 的宽度必须是 CHAR_NUM 否则会有前导和尾随白色-space 或压缩字符。

function void call(
    integer dut_id, inst_id,
    reg [CHAR_NUM-1:0] func_name,
    integer arg0, arg1, argN );

  reg [CHAR_NUM-1:0] path;
  $sformat(path,"tb.vdut[%0d].inst%0d.%0s", dut_id, inst_id, func_name );

  // Make path left-justified
  $sformat(path, FORMAT_LJUSTIFY, path);

  $display("path:'%s', arg0:%0d, arg1:%0d, argN:%0d", path, arg0, arg1, argN );
  //$my_pli( path, arg0, arg1, argN );
endfunction : call