pli调用的左对齐文本

时间:2015-02-10 22:46:52

标签: verilog system-verilog

我试图让我的测试平台更具可扩展性,并且需要一组需要实例路径名的PLI函数。我试图避免不得不硬化那条道路。我可以使用$sformat / $sformatf系统任务/函数构建路径。我尝试将路径定义为SystemVerilog string类型,但PLI拒绝它,我无法更改PLI。 PLI确实接受了一个reg数组。

挑战是PLI需要左对齐文本,但$sformat$sformatf%s都是正确的。

 left-justified : "tb.vdut[10].inst9.sample_func       " // Desired
right-justified : "       tb.vdut[10].inst9.sample_func" // Actual

示例功能:

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时间。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

寻找其他解决方案。首先为格式字符串创建一个参数。使用参数进行格式评估仅在编译/精化时发生,在模拟过程中它将是静态的。

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

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

然后使用$sformat(path, FORMAT_LJUSTIFY, path);。建议对$sformat使用$sformatf和reg数组。一些模拟器$sformatf作为右对齐,其他模拟器不会编译,除非我进行类型转换。类型转换工作,但它是额外的。

约束:如果path的宽度必须为CHAR_NUM,则会有前导和尾随空白字符或限制字符。

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