pli调用的左对齐文本



我正在努力使我的测试台更具可扩展性,并使用一组需要实例路径名的PLI函数。我尽量避免走那些硬核的路。我可以用$sformat/$sformatf系统任务/功能构建路径。我尝试将路径定义为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时间。

找到另一个解决方案。首先为格式字符串创建一个参数。对格式使用参数评估只在编译/细化时发生,在模拟过程中是静态的。

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

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

然后使用$sformat(path, FORMAT_LJUSTIFY, path);。建议使用$sformat,而不是使用带有reg阵列的$sformatf。一些模拟器$sformatf是正确的,其他模拟器不会编译,除非我进行了类型转换。类型铸造工作,但这是一个额外的。

约束:如果path的宽度必须是CHAR_NUM,否则将有前导和尾随空格或chomped字符。

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

我能够通过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

最新更新