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
我正在尝试使我的测试平台更具可扩展性,并使用一组需要实例路径名的 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