Verilog pli调用的左对齐文本

Verilog pli调用的左对齐文本,verilog,system-verilog,Verilog,System Verilog,我正试图使我的测试台更具可伸缩性,并使用一组需要实例路径名的PLI函数。我在努力避免对那条路采取强硬态度。我可以使用$sformat/$sformaf系统任务/函数构造路径。我尝试将路径定义为SystemVerilog字符串类型,但PLI拒绝了它,我无法更改PLI。PLI不接受reg数组 挑战在于PLI需要左对齐文本,但$sformat、$sformaf和%s都是右对齐的 left-justified : "tb.vdut[10].inst9.sample_func " // Des

我正试图使我的测试台更具可伸缩性,并使用一组需要实例路径名的PLI函数。我在努力避免对那条路采取强硬态度。我可以使用$sformat/$sformaf系统任务/函数构造路径。我尝试将路径定义为SystemVerilog字符串类型,但PLI拒绝了它,我无法更改PLI。PLI不接受reg数组

挑战在于PLI需要左对齐文本,但$sformat、$sformaf和%s都是右对齐的

left-justified : "tb.vdut[10].inst9.sample_func " // Desired right-justified : " tb.vdut[10].inst9.sample_func" // Actual
我有一个自己的答案,但我正在寻找一个更干净的解决方案。如果通道很大且函数调用经常执行,则while循环会占用大量CPU时间。

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

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

找到另一个解决方案。首先为格式字符串创建一个参数。仅在编译/精化时使用一个参数来格式化evaluation,它在模拟期间是静态的

parameter FORMAT_LJUSTIFY = $sformatf("%%-%0ds",CHAR_NUM/8);
因此,如果CHAR_NUM是640,那么FORMAT_LJUSTIFY将是-80s,这意味着最后80个字符将左对齐

然后使用$sformatpath,FORMAT_LJUSTIFY,path;。建议对reg数组使用$sformat而不是$sformatf。一些模拟器$sformaf是正确的,其他的除非我进行类型转换,否则不会编译。类型铸造工作,但这是一个额外的

约束:如果路径的宽度必须是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

一个新的PLI函数如何执行转换?@ Ari,如果我有一个源C代码到$sFALSE或者一个如何编写具有未知类型的n个参数的PLI教程,我会考虑写一个左对齐的PLI等价的$sFALW。为什么源代码?我正在考虑将字符串传递给一个PLI函数,该函数可以访问库函数,如sformat、std:setw、std:right甚至Boost。@Ari,对我来说,理想的PLI解决方案是在sv端的一行中进行完整格式化;否则,与我的两步$sformat解决方案相比,它没有优势。任何人都可以告诉我如何编写一个使用这种语法的PLI:$justifyleft_sformat output_var,format_string[,list_of_arguments];将得到最好的答案。
parameter FORMAT_LJUSTIFY = $sformatf("%%-%0ds",CHAR_NUM/8);
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