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